Date: 2021-11-03

# Visualising Interactions

#### 2021-11-03

CHiCANE supports built-in plotting capabilities using Gviz. For the built-in functionality, please refer to the documentation of `chiance::create.locus.plot()`. Below, we demonstrate (direct) use of Gviz API to visualise CHiCANE’s interaction peaks.

    library(chicane);
    data(bre80);

    options(ucscChromosomeNames = FALSE);

    bre80.interactions <- chicane(interactions = bre80);

# Single restriction fragment

To visualise the relationship between the number of reads and the significant interactions, we can look at a single restriction fragment. The HindIII fragment chr2:217035649-217042355 contains the breast cancer risk SNP rs13387042. By selecting fragment interactions that involve this fragment, we can plot the number of reads linking the fragment to all other fragments.

    # check dependency packages which must be installed
    if ("GenomicInteractions" %in% installed.packages()[, "Package"]
        && "Gviz" %in% installed.packages()[, "Package"]) {

    library(GenomicInteractions);
    library(Gviz);

    options(ucscChromosomeNames = FALSE);

    locus <- list(chr = 'chr2', start = 217035649, end = 217042355);
    locus.id <- paste0(locus$chr, ':', locus$start, '-', locus$end);

    ideogram.track <- tryCatch({
        IdeogramTrack(genome = 'hg38', chromosome = locus$chr);
        }, error = function(e) {
        cat(e$message, '\n')
        });

    genome.axis.track <- GenomeAxisTrack();

    # get counts and interactions involving specific locus
    # TO DO: need to switch this to generic other end in case of b2b
    # add note about p-value/ q-value
    locus.counts <- bre80[ target.id == locus.id | bait.id == locus.id ];
    locus.interactions <- bre80.interactions[ p.value < 0.001 & (target.id == locus.id | bait.id == locus.id) ];

    # create track for visualising read count
    interaction.count.track <- DataTrack(
        range = GRanges(locus.counts$target.id),
        data = locus.counts$count,
        name = 'Reads'
        );

    # create track for visualising significant interactions
    interaction.object <- GenomicInteractions(
        anchor1 = GRanges( locus.interactions$bait.id ),
        anchor2 = GRanges( locus.interactions$target.id ),
        count = -log10(locus.interactions$p.value)
        );

    interaction.track <- InteractionTrack(
        interaction.object,
        name = 'Chicane'
        );

    gene.track <- GeneRegionTrack(
        system.file( 'extdata', 'gencode_2q35.gtf', package = 'chicane' ),
        chr = locus$chr,
        start = locus$start - 5e5,
        end = locus$end + 7.5e5,
        stacking = 'squish',
        stackHeight = 0.3,
        name = 'Genes'
        );

    # plot
    # handle Gviz - UCSC incompatibility with R-4.1.0
    if (!is.null(ideogram.track)) {
        plotTracks(
            list(
                ideogram.track,
                genome.axis.track,
                gene.track,
                interaction.count.track,
                interaction.track
                ),
            sizes = c(0.4, 1, 1, 4, 3),
            type = 'histogram',
            transcriptAnnotation = 'symbol',
            collapseTranscripts = 'longest',
            col = NULL,
            from = locus$start - 6e5,
            to = locus$end + 8e5
            );
        }
    }
    #> Warning: package 'GenomicRanges' was built under R version 3.6.1
    #> Warning: package 'BiocGenerics' was built under R version 3.6.1
    #> Warning: package 'IRanges' was built under R version 3.6.1
    #> Warning: package 'Biobase' was built under R version 3.6.1
    #> Warning in plotTracks(list(ideogram.track, genome.axis.track, gene.track, : The
    #> track chromosomes in 'trackList' differ. Setting all tracks to chromosome 'chr2'

Gene annotations rely on `GeneRegionTrack` objects. These can either be downloaded through BioMart, or loaded from GTF files.

# Longer bait regions

It is also possible to visualise significant interactions for several baits simultaneously.

    # check dependency packages which must be installed
    if ("GenomicInteractions" %in% installed.packages()[, "Package"]
        && "Gviz" %in% installed.packages()[, "Package"]) {

    baits <- read.bed( system.file( 'extdata', '2q35.bed', package = 'chicane' ) );

    sig.interactions <- bre80.interactions[ (bait.id %in% baits | target.id %in% baits) & p.value < 0.001 ];

    # show baits
    bait.track <- AnnotationTrack( GRanges(baits), name = 'Baits', fill = 'black');

    read.tracks <- lapply(
        baits,
        function(bait, bre80, baits) {
            bait.counts <- bre80[ bait.id == bait & !(target.id %in% baits) ];

            bait.chr <- bait.counts$bait.chr[1];

            read.track <- DataTrack(
                range = GRanges(bait.counts$target.id),
                data = bait.counts$count,
                name = ' ', # empty string causes plotting to fail...
                chromosome = bait.chr,
                fill.histogram = 'darkgrey',
                col.histogram = 'darkgrey',
                cex.axis = 0
                );

            return(read.track);
        },
        bre80 = bre80,
        baits = baits
        );

    # create track for visualising significant interactions
    interaction.object <- GenomicInteractions(
        anchor1 = GRanges( sig.interactions$bait.id ),
        anchor2 = GRanges( sig.interactions$target.id ),
        count = -log10(sig.interactions$p.value)
        );

    interaction.track <- InteractionTrack(
        interaction.object,
        name = 'Chicane'
        );

    gene.track <- GeneRegionTrack(
        system.file( 'extdata', 'gencode_2q35.gtf', package = 'chicane' ),
        chr = locus$chr,
        start = 216150000,
        end = 217800000,
        stacking = 'squish',
        stackHeight = 0.3,
        name = 'Genes'
        );

    # handle Gviz - UCSC incompatibility with R-4.1.0
    if (!is.null(ideogram.track)) {
        plotTracks(
            c(
                list(
                    ideogram.track,
                    genome.axis.track
                ),
                read.tracks,
                list(
                    interaction.track,
                    bait.track,
                    gene.track
                    )
                ),
            sizes = c(0.4, 1, rep(0.2, length(read.tracks)), 2, 0.5, 1),
            transcriptAnnotation = 'symbol',
            collapseTranscripts = 'longest',
            type = 'hist',
            col = NULL,
            from = 216150000,
            to = 217800000
            );
        }
    }
    #> Warning in plotTracks(c(list(ideogram.track, genome.axis.track), read.tracks, :
    #> The track chromosomes in 'trackList' differ. Setting all tracks to chromosome
    #> 'chr2'