# RNAmodR: creating classes for additional modification detection from high throughput sequencing.

Felix G.M. Ernst

#### 2020-01-13

#### Package

RNAmodR 1.0.2

# 1 Introduction

For users interested in the general aspect of any `RNAmodR` based package please have a look at the main vignette of the package.

This vignette is aimed at developers and researchers, who want to use the functionality of the `RNAmodR` package to develop a new modification strategy based on high throughput sequencing data.

    library(RNAmodR)

Two classes have to be considered to establish a new analysis pipeline using `RNAmodR`. These are the `SequenceData` and the `Modifier` class.

# 2 A new `SequenceData` class

First, the `SequenceData` class has to be considered. Several classes are already implemented, which are:

- `End5SequenceData`
- `End3SequenceData`
- `EndSequenceData`
- `ProtectedEndSequenceData`
- `CoverageSequenceData`
- `PileupSequenceData`
- `NormEnd5SequenceData`
- `NormEnd3SequenceData`

If these cannot be reused, a new class can be implemented quite easily. First the DataFrame class, the Data class and a constructor has to defined. The only value, which has to be provided, is a default `minQuality` integer value and some basic information.

    setClass(Class = "ExampleSequenceDataFrame",
             contains = "SequenceDFrame")
    ExampleSequenceDataFrame <- function(df, ranges, sequence, replicate,
                                          condition, bamfiles, seqinfo){
      RNAmodR:::.SequenceDataFrame("Example",df, ranges, sequence, replicate,
                                   condition, bamfiles, seqinfo)
    }
    setClass(Class = "ExampleSequenceData",
             contains = "SequenceData",
             slots = c(unlistData = "ExampleSequenceDataFrame"),
             prototype = list(unlistData = ExampleSequenceDataFrame(),
                              unlistType = "ExampleSequenceDataFrame",
                              minQuality = 5L,
                              dataDescription = "Example data"))
    ExampleSequenceData <- function(bamfiles, annotation, sequences, seqinfo, ...){
      RNAmodR:::SequenceData("Example", bamfiles = bamfiles,
                             annotation = annotation, sequences = sequences,
                             seqinfo = seqinfo, ...)
    }

Second, the `getData` function has to be implemented. This is used to load the data from a bam file and must return a named list `IntegerList`, `NumericList` or `CompressedSplitDataFrameList` per file.

    setMethod("getData",
              signature = c(x = "ExampleSequenceData",
                            bamfiles = "BamFileList",
                            grl = "GRangesList",
                            sequences = "XStringSet",
                            param = "ScanBamParam"),
              definition = function(x, bamfiles, grl, sequences, param, args){
                ###
              }
    )

Third, the `aggregate` function has to be implemented. This function is used to aggregate data over replicates for all or one of the conditions. The resulting data is passed on to the `Modifier` class.

    setMethod("aggregateData",
              signature = c(x = "ExampleSequenceData"),
              function(x, condition = c("Both","Treated","Control")){
                ###
              }
    )

# 3 A new `Modifier` class

A new `Modifier` class is probably the main class, which needs to be implemented. Three variable have to be set. `mod` must be a single element from the `Modstrings::shortName(Modstrings::ModRNAString())`. `score` is the default score, which is used for several function. A column with this name should be returned from the `aggregate` function. `dataType` defines the `SequenceData` class to be used. `dataType` can contain multiple names of a `SequenceData` class, which are then combined to form a `SequenceDataSet`.

    setClass("ModExample",
             contains = c("RNAModifier"),
             prototype = list(mod = "X",
                              score = "score",
                              dataType = "ExampleSequenceData"))
    ModExample <- function(x, annotation, sequences, seqinfo, ...){
      RNAmodR:::Modifier("ModExample", x = x, annotation = annotation,
                         sequences = sequences, seqinfo = seqinfo, ...)
    }

`dataType` can also be a `list` of `character` vectors, which leads then to the creation of `SequenceDataList`. However, for now this is a hypothetical case and should only be used, if the detection of a modification requires bam files from two or more different methods to be used to detect one modification.

The `settings<-` function can be amended to save specifc settings ( `.norm_example_args` must be defined seperatly to normalize input arguments in any way one sees fit).

    setReplaceMethod(f = "settings",
                     signature = signature(x = "ModExample"),
                     definition = function(x, value){
                       x <- callNextMethod()
                       # validate special setting here
                       x@settings[names(value)] <- unname(.norm_example_args(value))
                       x
                     })

The `aggregateData` function is used to take the aggregated data from the `SequenceData` object and to calculate the specific scores, which are then stored in the `aggregate` slot.

    setMethod(f = "aggregateData",
              signature = signature(x = "ModExample"),
              definition =
                function(x, force = FALSE){
                  # Some data with element per transcript
                }
    )

The `findMod` function takes the aggregate data and searches for modifications, which are then returned as a GRanges object and stored in the `modifications` slot.

    setMethod("findMod",
              signature = c(x = "ModExample"),
              function(x){
                # an element per modification found.
              }
    )

## 3.1 A new `ModifierSet` class

The `ModifierSet` class is implemented very easily by defining the class and the constructor. The functionality is defined by the `Modifier` class.

    setClass("ModSetExample",
             contains = "ModifierSet",
             prototype = list(elementType = "ModExample"))
    ModSetExample <- function(x, annotation, sequences, seqinfo, ...){
      RNAmodR:::ModifierSet("ModExample", x = x, annotation = annotation,
                            sequences = sequences, seqinfo = seqinfo, ...)
    }

# 4 Visualization functions

Additional functions, which need to be implemented, are `getDataTrack` for the new `SequenceData` and new `Modifier` classes and `plotData`/`plotDataByCoord` for the new `Modifier` and `ModifierSet` classes. `name` defines a transcript name found in `names(ranges(x))` and `type` is the data type typically found as a column in the `aggregate` slot.

    setMethod(
      f = "getDataTrack",
      signature = signature(x = "ExampleSequenceData"),
      definition = function(x, name, ...) {
        ###
      }
    )
    setMethod(
      f = "getDataTrack",
      signature = signature(x = "ModExample"),
      definition = function(x, name, type, ...) {
      }
    )
    setMethod(
      f = "plotDataByCoord",
      signature = signature(x = "ModExample", coord = "GRanges"),
      definition = function(x, coord, type = "score", window.size = 15L, ...) {
      }
    )
    setMethod(
      f = "plotData",
      signature = signature(x = "ModExample"),
      definition = function(x, name, from, to, type = "score", ...) {
      }
    )
    setMethod(
      f = "plotDataByCoord",
      signature = signature(x = "ModSetExample", coord = "GRanges"),
      definition = function(x, coord, type = "score", window.size = 15L, ...) {
      }
    )
    setMethod(
      f = "plotData",
      signature = signature(x = "ModSetExample"),
      definition = function(x, name, from, to, type = "score", ...) {
      }
    )

If unsure, how to modify these functions, have a look a the code in the `Modifier-Inosine-viz.R` file of this package.

# 5 Summary

As suggested directly above, for a more detailed example have a look at the `ModInosine` class source code found in the `Modifier-Inosine-class.R` and `Modifier-Inosine-viz.R` files of this package.

# 6 Sessioninfo

    sessionInfo()

    ## R version 3.6.2 (2019-12-12)
    ## Platform: x86_64-w64-mingw32/x64 (64-bit)
    ## Running under: Windows Server 2012 R2 x64 (build 9600)
    ##
    ## Matrix products: default
    ##
    ## locale:
    ## [1] LC_COLLATE=C
    ## [2] LC_CTYPE=English_United States.1252
    ## [3] LC_MONETARY=English_United States.1252
    ## [4] LC_NUMERIC=C
    ## [5] LC_TIME=English_United States.1252
    ##
    ## attached base packages:
    ## [1] parallel  stats4    stats     graphics  grDevices utils     datasets
    ## [8] methods   base
    ##
    ## other attached packages:
    ##  [1] RNAmodR_1.0.2            Modstrings_1.2.0         RNAmodR.Data_1.0.0
    ##  [4] ExperimentHubData_1.12.0 AnnotationHubData_1.16.0 futile.logger_1.4.3
    ##  [7] ExperimentHub_1.12.0     AnnotationHub_2.18.0     BiocFileCache_1.10.2
    ## [10] dbplyr_1.4.2             GenomicFeatures_1.38.0   AnnotationDbi_1.48.0
    ## [13] Biobase_2.46.0           Rsamtools_2.2.1          Biostrings_2.54.0
    ## [16] XVector_0.26.0           rtracklayer_1.46.0       GenomicRanges_1.38.0
    ## [19] GenomeInfoDb_1.22.0      IRanges_2.20.1           S4Vectors_0.24.1
    ## [22] BiocGenerics_0.32.0      BiocStyle_2.14.4
    ##
    ## loaded via a namespace (and not attached):
    ##   [1] RUnit_0.4.32                  tidyselect_0.2.5
    ##   [3] RSQLite_2.2.0                 htmlwidgets_1.5.1
    ##   [5] grid_3.6.2                    BiocParallel_1.20.1
    ##   [7] munsell_0.5.0                 codetools_0.2-16
    ##   [9] colorspace_1.4-1              OrganismDbi_1.28.0
    ##  [11] highr_0.8                     knitr_1.26
    ##  [13] rstudioapi_0.10               ROCR_1.0-7
    ##  [15] assertive.base_0.0-7          labeling_0.3
    ##  [17] optparse_1.6.4                GenomeInfoDbData_1.2.2
    ##  [19] farver_2.0.2                  bit64_0.9-7
    ##  [21] vctrs_0.2.1                   lambda.r_1.2.4
    ##  [23] xfun_0.11                     biovizBase_1.34.1
    ##  [25] R6_2.4.1                      assertive.sets_0.0-3
    ##  [27] AnnotationFilter_1.10.0       bitops_1.0-6
    ##  [29] DelayedArray_0.12.2           assertthat_0.2.1
    ##  [31] promises_1.1.0                scales_1.1.0
    ##  [33] nnet_7.3-12                   gtable_0.3.0
    ##  [35] biocViews_1.54.0              ensembldb_2.10.2
    ##  [37] rlang_0.4.2                   zeallot_0.1.0
    ##  [39] splines_3.6.2                 lazyeval_0.2.2
    ##  [41] acepack_1.4.1                 dichromat_2.0-0
    ##  [43] checkmate_1.9.4               BiocManager_1.30.10
    ##  [45] yaml_2.2.0                    reshape2_1.4.3
    ##  [47] backports_1.1.5               httpuv_1.5.2
    ##  [49] Hmisc_4.3-0                   RBGL_1.62.1
    ##  [51] tools_3.6.2                   bookdown_0.17
    ##  [53] ggplot2_3.2.1                 gplots_3.0.1.2
    ##  [55] assertive.strings_0.0-3       RColorBrewer_1.1-2
    ##  [57] assertive.reflection_0.0-4    Rcpp_1.0.3
    ##  [59] plyr_1.8.5                    base64enc_0.1-3
    ##  [61] progress_1.2.2                zlibbioc_1.32.0
    ##  [63] purrr_0.3.3                   RCurl_1.95-4.12
    ##  [65] prettyunits_1.1.0             rpart_4.1-15
    ##  [67] openssl_1.4.1                 SummarizedExperiment_1.16.1
    ##  [69] cluster_2.1.0                 colorRamps_2.3
    ##  [71] assertive.models_0.0-2        magrittr_1.5
    ##  [73] data.table_1.12.8             assertive.data_0.0-3
    ##  [75] futile.options_1.0.1          ProtGenerics_1.18.0
    ##  [77] matrixStats_0.55.0            hms_0.5.3
    ##  [79] mime_0.8                      evaluate_0.14
    ##  [81] xtable_1.8-4                  XML_3.98-1.20
    ##  [83] jpeg_0.1-8.1                  gridExtra_2.3
    ##  [85] compiler_3.6.2                biomaRt_2.42.0
    ##  [87] tibble_2.1.3                  assertive.datetimes_0.0-2
    ##  [89] KernSmooth_2.23-16            crayon_1.3.4
    ##  [91] htmltools_0.4.0               later_1.0.0
    ##  [93] snow_0.4-3                    assertive_0.3-5
    ##  [95] Formula_1.2-3                 DBI_1.1.0
    ##  [97] formatR_1.7                   assertive.files_0.0-2
    ##  [99] rappdirs_0.3.1                assertive.numbers_0.0-2
    ## [101] Matrix_1.2-18                 getopt_1.20.3
    ## [103] assertive.types_0.0-3         assertive.matrices_0.0-2
    ## [105] assertive.data.uk_0.0-2       gdata_2.18.0
    ## [107] Gviz_1.30.0                   pkgconfig_2.0.3
    ## [109] GenomicAlignments_1.22.1      foreign_0.8-74
    ## [111] assertive.data.us_0.0-2       stringdist_0.9.5.5
    ## [113] AnnotationForge_1.28.0        BiocCheck_1.22.0
    ## [115] stringr_1.4.0                 VariantAnnotation_1.32.0
    ## [117] digest_0.6.23                 graph_1.64.0
    ## [119] assertive.code_0.0-3          rmarkdown_2.0
    ## [121] htmlTable_1.13.3              curl_4.3
    ## [123] shiny_1.4.0                   gtools_3.8.1
    ## [125] lifecycle_0.1.0               jsonlite_1.6
    ## [127] askpass_1.1                   BSgenome_1.54.0
    ## [129] pillar_1.4.3                  lattice_0.20-38
    ## [131] fastmap_1.0.1                 httr_1.4.1
    ## [133] survival_3.1-8                interactiveDisplayBase_1.24.0
    ## [135] glue_1.3.1                    png_0.1-7
    ## [137] BiocVersion_3.10.1            bit_1.1-14
    ## [139] assertive.properties_0.0-4    stringi_1.4.5
    ## [141] blob_1.2.0                    latticeExtra_0.6-29
    ## [143] caTools_1.17.1.3              memoise_1.1.0
    ## [145] rBiopaxParser_2.26.0          dplyr_0.8.3