When reading data with SingleMoleculeGenomicsIO, the reads will automatically be grouped by sample (i.e., the name assigned to each input files). As we have seen in earlier chapters, this is reflected by the columns of the SummarizedExperiment object generated by the reading functions corresponding to samples, with individual reads stored in a nested fashion within the samples. In practice, this means that any summary statistics, e.g. calculated by flattenReadLevelAssay, will be calculated by sample, and plotRegion will facet the reads by sample. In some situations, we may wish to group the reads by something other than the sample that they stem from. How to achieve this will be the focus of the current chapter.

7.1 Preparation

We first load the packages and the genome needed for these tasks.

Show/hide code
BSgenomeName <- "BSgenome.Mmusculus.GENCODE.GRCm39.gencodeM34"

library(SingleMoleculeGenomicsIO)
library(footprintR)
library(ggplot2)
library(patchwork)
library(GenomicRanges)
library(SummarizedExperiment)
library(BSgenomeName, character.only = TRUE)
library(VariantAnnotation)
library(stringdist)
library(BiocParallel)

# Load genome
gnm <- get(BSgenomeName)
genome(gnm) <- "mm39"

7.2 Using sequence variation

One reason for regrouping reads could be to sort them using genetic variation (e.g., single nucleotide variants), e.g. with the purpose of studying allele-specific signals. Typically, the heterozygous loci on which we would like to base such read grouping are known in advance (alternatively, we can use all positions within a given genomic region). In such cases, readModBam can automatically add “sequence labels” (consisting of the observed nucleotide in the indicated positions) to reads when reading the data, and these labels can later be used to regroup the reads.

Let’s consider an example. We start by defining a region of interest, and reading a file with known heterozygous SNVs (for the purposes of this report, we have subset the complete VCF file to only SNVs overlapping the region of interest, but this is not necessary in general).

Show/hide code
reg <- resize(as("chr7:23987184-23987363", "GRanges"), width = 1300, fix = "center")

hetsnv <- readVcf("data/het_snp_chr7_23987184-23987363.vcf.gz")
hetpos <- as(rowRanges(hetsnv), "GPos")
hetpos$ALT <- unlist(hetpos$ALT)
hetpos
UnstitchedGPos object with 13 positions and 5 metadata columns:
                    seqnames       pos strand | paramRangeID            REF            ALT      QUAL      FILTER
                       <Rle> <integer>  <Rle> |     <factor> <DNAStringSet> <DNAStringSet> <numeric> <character>
  chr7:23986770_G/T     chr7  23986770      * |           NA              G              T   504.609           .
  chr7:23986885_G/A     chr7  23986885      * |           NA              G              A   485.725           .
  chr7:23987082_T/G     chr7  23987082      * |           NA              T              G   421.622           .
  chr7:23987109_G/A     chr7  23987109      * |           NA              G              A   420.142           .
  chr7:23987130_A/C     chr7  23987130      * |           NA              A              C   509.378           .
                ...      ...       ...    ... .          ...            ...            ...       ...         ...
  chr7:23987468_A/G     chr7  23987468      * |           NA              A              G   480.559           .
  chr7:23987586_G/C     chr7  23987586      * |           NA              G              C   425.562           .
  chr7:23987658_A/G     chr7  23987658      * |           NA              A              G   336.694           .
  chr7:23987665_C/A     chr7  23987665      * |           NA              C              A   338.173           .
  chr7:23987670_C/T     chr7  23987670      * |           NA              C              T   372.650           .
  -------
  seqinfo: 61 sequences from an unspecified genome

We next generate “expected” REF and ALT sequences by concatenating the sequences of the heterozygous SNVs overlapping the region of interest. These sequences will later be used to group reads into one of two categories (REF or ALT), based on the agreement with the expected sequences. Note that with this approach, we’re making the implicit assumption that the SNVs are phased (and thus that a read will not typically harbor a mix of the REF and ALT nucleotides) - for most reads in our example this turns out to be a valid assumption, but in other cases other grouping schemes may be preferable.

Show/hide code
# subset to SNVs in region of interest
hetpos1 <- subsetByOverlaps(hetpos, reg, ignore.strand = TRUE)
(seqREF <- paste(as.character(hetpos1$REF), collapse = ""))
[1] "GGTGATGTAGACC"
Show/hide code
(seqALT <- paste(as.character(hetpos1$ALT), collapse = ""))
[1] "TAGACCACGCGAT"

Next, we generate two versions of the genome sequence, obtained by injecting, respectively, the REF and ALT nucleotide above into the corresponding positions. These genomes will later be used to generate sequence contexts for the positions seen in the data, and filter out positions that are not annotated as (in the case below) CpGs. For more information about filtering, and how it can reduce the effect of sequencing errors, see Chapter 3 and Chapter 4.

Show/hide code
gnmREF <- gnmALT <- getSeq(gnm)
for (chr in names(gnmREF)) {
    i <- which(seqnames(hetpos) == chr)
    gnmREF[[chr]] <- replaceLetterAt(x = gnmREF[[chr]],
                                     at = start(hetpos)[i],
                                     letter = unlist(hetpos$REF[i]),
                                     verbose = interactive())
    gnmALT[[chr]] <- replaceLetterAt(x = gnmALT[[chr]],
                                     at = start(hetpos)[i],
                                     letter = unlist(hetpos$ALT[i]),
                                     verbose = interactive())
}

After this preparation, we read the data. In this case, we will work with a modBam file from a wild-type sample, for which 5mCpG modification calling has been performed. We specify the positions of the heterozygous SNVs to the variantPositions argument, which will generate a sequence label for each read.

Show/hide code
seC <- readModBam(
    bamfiles = "data/mESC_wt_5mCG_5hmCG_rep2.bam", 
    regions = reg,
    modbase = "m", 
    level = "read",
    variantPositions = hetpos1, 
    trim = TRUE,
    BPPARAM = BiocParallel::SerialParam(),
    verbose = interactive()
)
# derived sequence labels
seC$readInfo$s1$variant_label
 [1] "GGTGATGTAGATA" "TAGACCACGCAGT" "GGCGA--------" "TAGACCACGCA-T" "GG-----------" "TAGACCACGCGAT" "TAGACCACGCGAT"
 [8] "GGTGATGTAGACC" "-------------" "TA-ACCACGCGAT" "TAGACCACGCGAT" "GGTGATGTAGACC" "TAGACCACGCGAT" "GATGATGTAGACC"
[15] "TAGACCACGCGAT" "TAGACCACGCGAT" "GGTGATGTAGACC" "TAGACAACGGGAT" "TAGACCACGCGAT" "GGTGATGTAGACC" "TATACCACGCGAT"
[22] "GGTGATGTAGACC" "TAGACCACGCGAT" "GGTGATGTAGACC" "GGCGATGTA----" "TAGACCACGGGAT" "TATACAA-GCGA-" "TAGACCACGCGAT"
[29] "GGTGATGTAG-CC" "TATACCACGCGAT" "GGTGATGTAGACC" "GGTGATGTAGACC" "GGTGATGTAGACC" "CATACTA-GCCAT" "GGTGATGTAGACC"
[36] "TAGACCACGCGAT" "GGTGATGTGGACC" "GGTGATGTAGGCC" "GGTGATGTAGACC" "GGTGATGTAGACC" "TAGACCACGCGAT" "TAGACCACGCGAT"
[43] "GGTGATGTAGACC" "GGTGATGTAGACC" "GGTGATGTAGACC" "TAGACCACGCA-T" "TAGACCACGCGAC" "TA-----------" "GGTGATG-AGACC"
[50] "--GACCACGCGAT" "--TGATGTAGACC" "---------GACC" "-------------" "-------------" "-------------"

Next, we filter the data by sequence context, to only retain positions annotated as CG in both the REF and ALT genomes generated above. We achieve this by sequentially adding the sequence context from each of the genomes, and filtering by this sequence context.

Show/hide code
# REF genome
seC <- addSeqContext(x = seC, sequenceContextWidth = 3,
                     sequenceReference = gnmREF)
seC <- filterPositions(seC, filters = "sequenceContext",
                       sequenceContext = "NCG", assayNameNA = "mod_prob")
# ALT genome
seC <- addSeqContext(x = seC, sequenceContextWidth = 3,
                     sequenceReference = gnmALT)
seC <- filterPositions(seC, filters = "sequenceContext",
                       sequenceContext = "NCG", assayNameNA = "mod_prob")

With the clean data, we next cluster the reads into two groups, based on which of the two expected sequences (seqREF or seqALT above) the respective sequence labels are most similar to. We request a Hamming distance of at most 0.34 based on the positions covered by the read - otherwise, the read is assigned to an NA category

Show/hide code
(varlabels <- structure(
    unlist(lapply(seC$readInfo, "[[", "variant_label"), use.names = FALSE),
    names = unlist(lapply(seC$readInfo, rownames), use.names = FALSE)))
s1-499eee9b-e176-4621-8242-a012eca76f6c s1-e5288863-775d-434b-beb0-8c178994d5f1 s1-8b271b78-e8ee-4f1c-88e9-5a115726a880 
                        "GGTGATGTAGATA"                         "TAGACCACGCAGT"                         "GGCGA--------" 
s1-cd6184cf-7ec1-4a5d-a0b4-b8f20498d188 s1-4cdfcd69-e5a7-4e76-a00e-04b40199bf4b s1-51b70ce2-5fce-4f7b-be2c-9e1ae0e0f0b1 
                        "TAGACCACGCA-T"                         "GG-----------"                         "TAGACCACGCGAT" 
s1-1439125e-7083-44ca-944a-26c6de6a9e27 s1-ff94d611-8c2b-407d-9176-53aab862f5b9 s1-1ab66aac-0026-4846-8ed1-722820594678 
                        "TAGACCACGCGAT"                         "GGTGATGTAGACC"                         "-------------" 
s1-4c195c85-5be8-4fe7-ae47-81667c4b79dc s1-d2e53c49-d900-4d84-8936-aa19e94c0002 s1-3dcbc9d5-db5c-409e-b157-3aeff54c45d3 
                        "TA-ACCACGCGAT"                         "TAGACCACGCGAT"                         "GGTGATGTAGACC" 
s1-b9e5430e-8c90-40a7-876c-0058d88cd081 s1-ed5083c5-a308-4af0-bebe-866081c3185b s1-a74ca226-f92f-4f05-a856-c426fd6c77bc 
                        "TAGACCACGCGAT"                         "GATGATGTAGACC"                         "TAGACCACGCGAT" 
s1-cb524667-1022-44d5-9dd6-de4502600c58 s1-ba5b0e17-7fbc-48df-af81-53be8a84d489 s1-04eac97a-b14f-40c6-b260-685b564aa58f 
                        "TAGACCACGCGAT"                         "GGTGATGTAGACC"                         "TAGACAACGGGAT" 
s1-18c2142a-d557-4d0e-8f13-83f9d198b6b7 s1-2401b7d4-7ad8-4679-b2d8-e737d683b23a s1-48b51cdf-6ed4-482e-8f8e-b47e6e11320b 
                        "TAGACCACGCGAT"                         "GGTGATGTAGACC"                         "TATACCACGCGAT" 
s1-6a07b53c-bb0b-4ea7-89b5-53ddb885d7d1 s1-c40cad07-a5c2-4ce5-8a7c-d125591c3b84 s1-134e088c-d08b-4980-aab7-93dfbfea089c 
                        "GGTGATGTAGACC"                         "TAGACCACGCGAT"                         "GGTGATGTAGACC" 
s1-ff4482f4-92ff-41b5-b995-f470e9f311c5 s1-b18991ee-5cd3-4c03-a590-088f3bdd9ded s1-8c4d1f90-2791-4b0f-a372-8f634d8984d5 
                        "GGCGATGTA----"                         "TAGACCACGGGAT"                         "TATACAA-GCGA-" 
s1-0d7eec2a-d42d-48e3-acbc-6c7e095f8b3e s1-e942f649-f296-4cbd-8ec9-1108df3f92c7 s1-17d39e6f-a363-48e5-9f4e-8822c78aa0fb 
                        "TAGACCACGCGAT"                         "GGTGATGTAG-CC"                         "TATACCACGCGAT" 
s1-81d4c7c0-7416-4b45-a838-e1d49b30d471 s1-dd1f8f29-bcae-4a54-ae00-e388ed635eb1 s1-85fc0cba-2230-44ca-883e-bf22cac1e5cf 
                        "GGTGATGTAGACC"                         "GGTGATGTAGACC"                         "GGTGATGTAGACC" 
s1-d44596d7-4646-4f02-80dc-b8b3c4c9d1e5 s1-758dac31-2a5b-44ba-950f-1ea60c1788d6 s1-10d04f5b-eb4b-4c45-b5db-5b0edadf5180 
                        "CATACTA-GCCAT"                         "GGTGATGTAGACC"                         "TAGACCACGCGAT" 
s1-e16fc9d0-f73c-4c34-a408-985ec8704f47 s1-ba2f396b-d231-496d-97d5-966b7ea4c884 s1-0de1ee32-4980-4e6d-bfa4-259589dbeb8a 
                        "GGTGATGTGGACC"                         "GGTGATGTAGGCC"                         "GGTGATGTAGACC" 
s1-eeeabf6f-5869-4b21-8d90-c5f0a234cbdc s1-59d63421-58b9-459b-8b44-29e26e19d958 s1-ef254191-ceef-4737-a78c-7995366ded41 
                        "GGTGATGTAGACC"                         "TAGACCACGCGAT"                         "TAGACCACGCGAT" 
s1-c20f576f-db89-4f57-ad65-2d2ad24cc702 s1-8b8ea6ee-01f6-48f6-ba85-2d2fd235f160 s1-a8fbc68e-1fda-40ff-8383-05c3d81f97e4 
                        "GGTGATGTAGACC"                         "GGTGATGTAGACC"                         "GGTGATGTAGACC" 
s1-a6cdd171-0f70-4bc2-a94d-15a8388e9ba1 s1-4da9b02d-5f6e-44c3-a9c0-8702e27d8c93 s1-9b931328-f763-4e1c-ad67-7ffe46c9bbfe 
                        "TAGACCACGCA-T"                         "TAGACCACGCGAC"                         "TA-----------" 
s1-b3ab6c1a-5df5-42b1-84b1-547c4ee417ca s1-b5087d14-81e3-41b9-875c-202a2f017415 s1-14c3d2e1-1602-4efc-8710-835430e6a9d6 
                        "GGTGATG-AGACC"                         "--GACCACGCGAT"                         "--TGATGTAGACC" 
s1-282e7546-1700-46cf-9206-24233d3f2754 s1-1df504ac-0a6a-49ac-9460-2c2e3ddd7310 s1-bbed3868-7411-4b2d-8c97-d32b364389c7 
                        "---------GACC"                         "-------------"                         "-------------" 
s1-87305832-1373-4577-a1bd-8ec1079edfba 
                        "-------------" 
Show/hide code
dists <- stringdistmatrix(a = c(seqREF, seqALT),
                          b = varlabels, method = "hamming",
                          nthread = 2) / nchar(varlabels[1])
methGroup <- ifelse(colMins(dists) < 0.34,
                    paste0(c("REF", "ALT"), ": ", c(seqREF, seqALT))[apply(dists, 2, which.min)], NA)
table(methGroup, useNA = "ifany")
methGroup
ALT: TAGACCACGCGAT REF: GGTGATGTAGACC               <NA> 
                23                 22                 10 

Based on this read grouping, we can now regroup the reads in such a way that the columns of the SummarizedExperiment object corresponds to allele (REF or ALT) rather than the sample. This is achieved with the regroupReads function.

Show/hide code
# generate named list of read groups
methGroupList <- split(names(varlabels), methGroup)

# regroup reads
seCgrouped <- regroupReads(seC, methGroupList)

# calculate average modification fraction by allele
seCgrouped <- flattenReadLevelAssay(seCgrouped, keepReads = TRUE)

# plot
plotRegion(seCgrouped, region = reg,
           tracks = list(
               list(trackData = "mod_prob", trackType = "Lollipop",
                    legendTitle = "5mCpG"),
               list(trackData = "FracMod", trackType = "Point",
                    arglistPoint = list(size = 3)))) +
    plot_layout(heights = c(7.5, 1.5))
Figure 7.1

In this example, we notice a clear difference in methylation between the two alleles.

7.3 Modification based

As an alternative to the genetic grouping used above, we could also group the reads based on the observed data. To exemplify this, we will look at a known imprinted locus in the Peg10 gene, split the reads based on the average CpG methylation in the locus, and compare the levels of 6mA modifications between the groups.

First, we read the CpG methylation data and filter positions to only retain those in a CpG context.

Show/hide code
peg10 <- as("chr6:4746792-4748791", "GRanges")

seC <- readModBam(
    bamfiles = "data/mESC_wt_5mCG_5hmCG_rep2.bam", 
    regions = peg10,
    modbase = "m", 
    sequenceReference = gnm,
    sequenceContextWidth = 3,
    seqinfo = seqinfo(gnm),
    trim = TRUE,
    BPPARAM = BiocParallel::SerialParam(),
    verbose = interactive()
)
seC <- filterPositions(
    seC, 
    filters = "sequenceContext",
    sequenceContext = "NCG"
)

Next, we calculate the average modification fraction per read. We note a clear bimodality of the distribution, and define two groups of reads based on this.

Show/hide code
# calculate average modification fraction per read
avgmod <- colMeans(as.matrix(assay(seC, "mod_prob")), na.rm = TRUE)

ggplot(data.frame(avgmod = avgmod), aes(x = avgmod)) +
    geom_histogram() +
    labs(x = "Average modification probability per read (CpG)") + 
    theme_bw(base_size = 16)
`stat_bin()` using `bins = 30`. Pick better value `binwidth`.
Show/hide code
read_groups <- split(colnames(as.matrix(assay(seC, "mod_prob"))), 
                     c("paternal", "maternal")[(avgmod > 0.5) + 1])
Figure 7.2

Next, we read the 6mA data for the same sample, filter by sequence context and regroup the reads based on the split defined above.

Show/hide code
seA <- readModBam(
    bamfiles = "data/mESC_wt_6mA_rep2.bam", 
    regions = peg10,
    modbase = "a", 
    sequenceReference = gnm,
    sequenceContextWidth = 1,
    seqinfo = seqinfo(gnm),
    trim = TRUE,
    BPPARAM = BiocParallel::SerialParam(),
    verbose = interactive()
)
seA <- filterPositions(
    seA, 
    filters = "sequenceContext",
    sequenceContext = "A"
)
seA <- regroupReads(seA, readGroups = read_groups)
# check that the columns of seA now correspond to read groups
colnames(seA)
[1] "maternal" "paternal"

With the new read grouping, we next calculate summary statistics and visualize the 6mA data.

Show/hide code
seA <- flattenReadLevelAssay(seA)

plotRegion(seA, region = peg10, sequenceContext = "A", 
           tracks = list(list(trackType = "Heatmap", trackData = "mod_prob", 
                              interpolate = TRUE, legendTitle = "6mA", 
                              orderReads = "squish"),
                         list(trackType = "Smooth", trackData = "FracMod"))) + 
    plot_layout(heights = c(3, 1))
Figure 7.3

7.4 Across different regions

Next, we will illustrate how to use SingleMoleculeGenomicsIO and footprintR to create metaplots. In these plots, each row represents an (equally sized) genomic region. Here, we will exemplify this by generating a metaplot of a collection of 1,000 strong CTCF sites:

Show/hide code
(ctcf_sites <- readRDS("data/ctcf_sites_1000.rds"))
GRanges object with 1000 ranges and 1 metadata column:
         seqnames              ranges strand |     score
            <Rle>           <IRanges>  <Rle> | <numeric>
     [1]     chr4 106387210-106387228      - |    21.751
     [2]     chr2   29509735-29509753      + |    16.924
     [3]    chr13 110505258-110505276      - |    19.577
     [4]     chr3 121678692-121678710      + |    18.323
     [5]     chr2   29509695-29509713      + |    17.356
     ...      ...                 ...    ... .       ...
   [996]     chr5   35519412-35519430      + |    19.651
   [997]     chr8   23727858-23727876      + |    11.875
   [998]     chr6 112468049-112468067      + |    16.978
   [999]     chr4   44564745-44564763      + |    22.866
  [1000]     chr8 106101422-106101440      + |    10.054
  -------
  seqinfo: 61 sequences (1 circular) from mm39 genome

We first load summary-level data from all reads overlapping 1.5kb regions centered on these sites, and filter positions based on the sequence context.

Show/hide code
se <- readModBam(bamfiles = "data/mESC_wt_6mA_rep1.bam",
                 regions = resize(ctcf_sites, width = 1500, fix = "center"),
                 modbase = "a",
                 level = "summary",
                 trim = TRUE,
                 seqinfo = seqinfo(gnm),
                 sequenceContextWidth = 1,
                 sequenceReference = gnm,
                 verbose = interactive())
se <- filterPositions(se, filters = "sequenceContext",
                      sequenceContext = "A",
                      assayNameNA = NULL)

Next, we use the getAnchorRegions function to extract the FracMod values for each of the regions. Note that all regions must have the same size. Hence, we specify the midpoints of the regions as well as the desired size.

Show/hide code
agg <- getAnchorRegions(se, assayName = "FracMod",
                        regionMidpoints = as(resize(ctcf_sites, width = 1, fix = "center"), "GPos"),
                        regionWidth = 1501,
                        reverseMinusStrandRegions = TRUE,
                        verbose = interactive())

In the resulting object, the positions are represented on the ‘anchor’ reference sequence, with positions ranging from -750 to +750.

Show/hide code
agg
class: RangedSummarizedExperiment 
dim: 1501 1 
metadata(1): readLevelData
assays(1): FracMod
rownames(1501): 1 2 ... 1500 1501
rowData names(0):
colnames(1): s1
colData names(2): sample region_FracMod

We can think of the FracMod assay in agg as similar to a read-level assay - each column corresponds to a sample, and is represented as an NaMatrix with each column corresponding to a region. Consequently, we can calculate additional summary assays, aggregating information across all regions, using flattenReadLevelAssay.

Show/hide code
agg <- flattenReadLevelAssay(agg, assayName = "FracMod", statistics = "Pmod")

Finally, we use plotRegion to create the metaplot. We include both a heatmap where each row corresponds to a region, and a summary plot aggregating across regions.

Show/hide code
plotRegion(agg, region = as("anchor:-750-750", "GRanges"), 
           tracks = list(list(trackData = "FracMod", trackType = "Heatmap",
                              interpolate = TRUE),
                         list(trackData = "Pmod", trackType = "Smooth"))) + 
    patchwork::plot_layout(heights = c(3, 1))
Figure 7.4

7.5 Session info

Click to view session info
Show/hide code
sessioninfo::session_info(info = "packages")
═ Session info ═══════════════════════════════════════════════════════════════════════════════════════════════════════
─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
 package                                      * version   date (UTC) lib source
 abind                                          1.4-8     2024-09-12 [1] CRAN (R 4.5.1)
 AnnotationDbi                                  1.72.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 basilisk                                       1.22.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 Biobase                                      * 2.70.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 BiocGenerics                                 * 0.56.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 BiocIO                                       * 1.20.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 BiocParallel                                 * 1.44.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 Biostrings                                   * 2.78.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 bit                                            4.6.0     2025-03-06 [1] CRAN (R 4.5.1)
 bit64                                          4.6.0-1   2025-01-16 [1] CRAN (R 4.5.1)
 bitops                                         1.0-9     2024-10-03 [1] CRAN (R 4.5.1)
 blob                                           1.3.0     2026-01-14 [1] CRAN (R 4.5.2)
 BSgenome                                     * 1.78.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 BSgenome.Mmusculus.GENCODE.GRCm39.gencodeM34 * 0.1.0     2025-10-31 [1] Bioconductor
 cachem                                         1.1.0     2024-05-16 [1] CRAN (R 4.5.1)
 cigarillo                                      1.0.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 cli                                            3.6.5     2025-04-23 [1] CRAN (R 4.5.1)
 codetools                                      0.2-20    2024-03-31 [2] CRAN (R 4.5.2)
 crayon                                         1.5.3     2024-06-20 [1] CRAN (R 4.5.1)
 curl                                           7.0.0     2025-08-19 [1] CRAN (R 4.5.1)
 data.table                                     1.18.0    2025-12-24 [1] CRAN (R 4.5.2)
 DBI                                            1.2.3     2024-06-02 [1] CRAN (R 4.5.1)
 DelayedArray                                   0.36.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 dichromat                                      2.0-0.1   2022-05-02 [1] CRAN (R 4.5.1)
 digest                                         0.6.39    2025-11-19 [1] CRAN (R 4.5.2)
 dir.expiry                                     1.18.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 dplyr                                          1.1.4     2023-11-17 [1] CRAN (R 4.5.1)
 evaluate                                       1.0.5     2025-08-27 [1] CRAN (R 4.5.1)
 farver                                         2.1.2     2024-05-13 [1] CRAN (R 4.5.1)
 fastmap                                        1.2.0     2024-05-15 [1] CRAN (R 4.5.1)
 filelock                                       1.0.3     2023-12-11 [1] CRAN (R 4.5.1)
 footprintR                                   * 0.4.0     2026-01-23 [1] Bioconductor
 generics                                     * 0.1.4     2025-05-09 [1] CRAN (R 4.5.1)
 GenomeInfoDb                                 * 1.46.2    2025-12-04 [1] Bioconductor 3.22 (R 4.5.2)
 GenomicAlignments                              1.46.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 GenomicFeatures                                1.62.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 GenomicRanges                                * 1.62.1    2025-12-08 [1] Bioconductor 3.22 (R 4.5.2)
 ggforce                                        0.5.0     2025-06-18 [1] CRAN (R 4.5.1)
 ggplot2                                      * 4.0.1     2025-11-14 [1] CRAN (R 4.5.2)
 glue                                           1.8.0     2024-09-30 [1] CRAN (R 4.5.1)
 gtable                                         0.3.6     2024-10-25 [1] CRAN (R 4.5.1)
 htmltools                                      0.5.9     2025-12-04 [1] CRAN (R 4.5.2)
 htmlwidgets                                    1.6.4     2023-12-06 [1] CRAN (R 4.5.1)
 httr                                           1.4.7     2023-08-15 [1] CRAN (R 4.5.1)
 IRanges                                      * 2.44.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 janeaustenr                                    1.0.0     2022-08-26 [1] CRAN (R 4.5.2)
 jsonlite                                       2.0.0     2025-03-27 [1] CRAN (R 4.5.1)
 KEGGREST                                       1.50.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 knitr                                          1.51      2025-12-20 [1] CRAN (R 4.5.2)
 labeling                                       0.4.3     2023-08-29 [1] CRAN (R 4.5.1)
 lattice                                        0.22-7    2025-04-02 [2] CRAN (R 4.5.2)
 lifecycle                                      1.0.5     2026-01-08 [1] CRAN (R 4.5.2)
 magrittr                                       2.0.4     2025-09-12 [1] CRAN (R 4.5.1)
 MASS                                           7.3-65    2025-02-28 [2] CRAN (R 4.5.2)
 Matrix                                         1.7-4     2025-08-28 [2] CRAN (R 4.5.2)
 MatrixGenerics                               * 1.22.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 matrixStats                                  * 1.5.0     2025-01-07 [1] CRAN (R 4.5.1)
 memoise                                        2.0.1     2021-11-26 [1] CRAN (R 4.5.1)
 otel                                           0.2.0     2025-08-29 [1] CRAN (R 4.5.1)
 patchwork                                    * 1.3.2     2025-08-25 [1] CRAN (R 4.5.1)
 pillar                                         1.11.1    2025-09-17 [1] CRAN (R 4.5.1)
 pkgconfig                                      2.0.3     2019-09-22 [1] CRAN (R 4.5.1)
 png                                            0.1-8     2022-11-29 [1] CRAN (R 4.5.1)
 polyclip                                       1.10-7    2024-07-23 [1] CRAN (R 4.5.1)
 purrr                                          1.2.1     2026-01-09 [1] CRAN (R 4.5.2)
 R6                                             2.6.1     2025-02-15 [1] CRAN (R 4.5.1)
 RColorBrewer                                   1.1-3     2022-04-03 [1] CRAN (R 4.5.1)
 Rcpp                                           1.1.1     2026-01-10 [1] CRAN (R 4.5.2)
 RCurl                                          1.98-1.17 2025-03-22 [1] CRAN (R 4.5.1)
 restfulr                                       0.0.16    2025-06-27 [1] CRAN (R 4.5.1)
 reticulate                                     1.44.1    2025-11-14 [1] CRAN (R 4.5.2)
 rjson                                          0.2.23    2024-09-16 [1] CRAN (R 4.5.1)
 rlang                                          1.1.7     2026-01-09 [1] CRAN (R 4.5.2)
 rmarkdown                                      2.30      2025-09-28 [1] CRAN (R 4.5.1)
 Rsamtools                                    * 2.26.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 RSQLite                                        2.4.5     2025-11-30 [1] CRAN (R 4.5.2)
 rtracklayer                                  * 1.70.1    2025-12-22 [1] Bioconductor 3.22 (R 4.5.2)
 S4Arrays                                       1.10.1    2025-12-02 [1] Github (Bioconductor/S4Arrays@a4cccba)
 S4Vectors                                    * 0.48.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 S7                                             0.2.1     2025-11-14 [1] CRAN (R 4.5.2)
 scales                                         1.4.0     2025-04-24 [1] CRAN (R 4.5.1)
 Seqinfo                                      * 1.0.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 sessioninfo                                    1.2.3     2025-02-05 [1] CRAN (R 4.5.1)
 SingleMoleculeGenomicsIO                     * 0.1.0     2026-01-29 [1] Bioconductor
 SnowballC                                      0.7.1     2023-04-25 [1] CRAN (R 4.5.2)
 SparseArray                                    1.10.8    2025-12-18 [1] Bioconductor 3.22 (R 4.5.2)
 stringdist                                   * 0.9.17    2026-01-16 [1] CRAN (R 4.5.2)
 stringi                                        1.8.7     2025-03-27 [1] CRAN (R 4.5.1)
 SummarizedExperiment                         * 1.40.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 tibble                                         3.3.1     2026-01-11 [1] CRAN (R 4.5.2)
 tidyr                                          1.3.2     2025-12-19 [1] CRAN (R 4.5.2)
 tidyselect                                     1.2.1     2024-03-11 [1] CRAN (R 4.5.1)
 tidytext                                       0.4.3     2025-07-25 [1] CRAN (R 4.5.2)
 tokenizers                                     0.3.0     2022-12-22 [1] CRAN (R 4.5.2)
 tweenr                                         2.0.3     2024-02-26 [1] CRAN (R 4.5.1)
 UCSC.utils                                     1.6.1     2025-12-11 [1] Bioconductor 3.22 (R 4.5.2)
 VariantAnnotation                            * 1.56.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 vctrs                                          0.7.1     2026-01-23 [1] CRAN (R 4.5.2)
 viridisLite                                    0.4.2     2023-05-02 [1] CRAN (R 4.5.1)
 withr                                          3.0.2     2024-10-28 [1] CRAN (R 4.5.1)
 xfun                                           0.56      2026-01-18 [1] CRAN (R 4.5.2)
 XML                                            3.99-0.20 2025-11-08 [1] CRAN (R 4.5.2)
 XVector                                      * 0.50.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.1)
 yaml                                           2.3.12    2025-12-10 [1] CRAN (R 4.5.2)
 zoo                                            1.8-15    2025-12-15 [1] CRAN (R 4.5.2)

 [1] /tachyon/groups/gbioinfo/Appz/R/BioC/R-4.5-release-foss-2024.05_BioC-3.22-release-foss-2024.05
 [2] /tachyon/groups/gbioinfo/Appz/easybuild/software/R/4.5.2-foss-2024.05/lib64/R/library
 * ── Packages attached to the search path.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────