pax_global_header00006660000000000000000000000064133122054210014503gustar00rootroot0000000000000052 comment=7441627e719b6fec8dab7765c09714cc2d1270d4 psiplot-2.3.0/000077500000000000000000000000001331220542100131775ustar00rootroot00000000000000psiplot-2.3.0/.Rbuildignore000066400000000000000000000000721331220542100156240ustar00rootroot00000000000000^README\.Rmd$ ^README-*\.png$ ^.*\.Rproj$ ^\.Rproj\.user$ psiplot-2.3.0/.gitignore000066400000000000000000000000461331220542100151670ustar00rootroot00000000000000.Rproj.user .Rhistory .RData inst/doc psiplot-2.3.0/.travis.yml000066400000000000000000000001041331220542100153030ustar00rootroot00000000000000language: r cache: packages sudo: required r_packages: - devtools psiplot-2.3.0/DESCRIPTION000066400000000000000000000016621331220542100147120ustar00rootroot00000000000000Package: psiplot Title: Generate plots of PSI values generated by vast-tools Version: 2.3.0 Authors@R: c( person("Kevin","Ha", email = "k.ha@mail.utoronto.ca", role=c("cre","aut")), person("Javier","Tapial",email = "javier.tapial@crg.eu", role=c("aut")) ) Description: Provides functions to create plots of PSI values of alternatively-spliced exons or cRPKMs. Requires PSI cRPKM data generated by the program vast-tools (https://github.com/vastgroup/vast-tools). Depends: R (>= 3.1) License: MIT + file LICENSE LazyData: true URL: https://github.com/kcha/psiplot BugReports: https://github.com/kcha/psiplot/issues Imports: MASS, stats, methods, grDevices, utils, dplyr, tidyr, purrr, readr, magrittr, ggplot2 Suggests: testthat, pheatmap, gplots, ggbeeswarm (>= 0.6.0), knitr, rmarkdown RoxygenNote: 6.0.1 VignetteBuilder: knitr psiplot-2.3.0/LICENSE000066400000000000000000000020701331220542100142030ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013-2015 Kevin Ha Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. psiplot-2.3.0/Makefile000066400000000000000000000001601331220542100146340ustar00rootroot00000000000000install: R --no-save -e 'library(devtools);library(roxygen2);document();install()' test: ./tests/run_tests.R psiplot-2.3.0/NAMESPACE000066400000000000000000000006611331220542100144210ustar00rootroot00000000000000# Generated by roxygen2: do not edit by hand export(format_table) export(get_psi_samples) export(plot_event) export(plot_expr) export(plot_multi) export(plot_multievent) export(preprocess_sample_colors) import(dplyr) import(ggplot2) import(methods) import(purrr) import(readr) import(tidyr) importFrom(grDevices,colorRampPalette) importFrom(magrittr,"%>%") importFrom(stats,dist) importFrom(stats,hclust) importFrom(stats,setNames) psiplot-2.3.0/NEWS.md000066400000000000000000000100451331220542100142750ustar00rootroot00000000000000# Version 2.3.0 - The columns **Order** and **RColorCode** in the configuration file are now optional. Only columns **SampleName** and **GroupName** are mandatory. This should simplify the minimum requirements needed to create a functional config. - Without **Order**, the order defaults to 1,2,...,N where 1 is the first row of the config and N is the last row. - Without **RColorCode**, the default ggplot2 color palette is used. - New subgroup feature: instead of displaying the average PSI of subgroups, the individual point estimates are plotted. - Updates to vignette - Bug fixes # Version 2.2.0 - Support for sample subgroups in all plot functions, through the config files. PSIs of samples in a subgroup are averaged and displayed as a single data point. Confidence intervals are computed by fitting a joint beta distribution to a population of points sampled from beta distributions coming from the individual samples, and then applying the same method as for single samples. - Support for plotting multiple events in the same PSI plot, with events identified with different colours, and samples identified by the color background. - Support for sample columns containing suffixes (e.g. "Sample1-cRPKM", while the config says only "Sample1"). - Support for gene expression tables containing both cRPKM and raw read counts (similar to the PSI and QC columns for events). - Big changes in the preprocess_sample_colors function and its output, to allow for all this. - Use of dplyr (and tidyverse in general) instead of plyr. - README contents moved to vignette # Version 2.1.2 - Fixed bug that occurs when dealing with columns that are all NA - Added CITATION - Converted some internally-used functions to be non-exported - `plot_multi()` now supports `pheatmap` - The `test_data` folder is now `inst/extdata` # Version 2.1.1 Some bug fixes for `plot_expr()` # Version 2.1.0 This release contains new features and some internal updates. In addition, this release now requires **R version 3.1** or higher and **ggplot2 version 2.0** or higher. - Replace `show_guides` with `show.legend` to match API of ggplot2 version 2.*. - Update README - `plot_multi` has been further developed: - Use `heatmap.2` from gplots package to produce heatmap. To minimize dependencies, this package is optional and needs to be manually installed (`install.packages("gplots")`). In the absence of gplots, ggplot2 will be used as before. - Events and samples can be clustered using options `cluster_rows` and `cluster_cols`, respectively. - Add `fill` option for providing custom colours - Simply format of row names - See `?plot_multi` for full set of options - Retire warning for deprecated `lines` option - The option `plot` in `plot_event` and `plot_expr` is deprecated (will issue warning if used). - Other documentation updates # Version 2.0.1 This release contains minor updates. - `plot_event`: default `ylim` changed to (0,100) from (1,100). # Version 2.0.0 Version 2.0.0 now uses ggplot2 to generate plots in `plot_event` and `plot_expr`. In addition to outputting a plot, a ggplot2 object is returned. - Printing of the plot can be suppressed with `plot = FALSE`. - The option `lines` in `plot_event` and `plot_expr` is deprecated (will issue warning if used). - Imports plyr for calculating group means. ### NEW - `plot_multi`: a new experimental function that will generate a heatmap of PSI values for two or more events: ```r plot_multi(psi) ``` # Version 1.1.2 - Change y-axis labels to be horizontal (e.g. `las = 1`) # Version 1.1.1 - Changed minimum of y-axis to start at 0 for `plot_expr()` (#2) - Added check if config and input data does has 0 matching samples (#3) - Other minor updates to documentation # Version 1.1.0 - `plot_expr`: psiplot can now plot cRPKMs. For example, using the new sample dataset `crpkm`: ```r plot_expr(crpkm[1,], config = config) ``` - Renamed sample datasets to: `psi` and `config` (#1) - Deprecated `xlim` argument in `plot_event` - it shouldn't really be used # Version 1.0.0 - This is the first release of psiplot in the form of an R package. psiplot-2.3.0/R/000077500000000000000000000000001331220542100134005ustar00rootroot00000000000000psiplot-2.3.0/R/convert_psi.R000066400000000000000000000025501331220542100160600ustar00rootroot00000000000000#' Convert low/bad quality PSI values to NA #' #' Helper function to filter and return PSI values. #' PSIs are converted to NA if first coverage code is 'N' #' e.g. PSI=100, Coverage=N,N,N,OK,S ---> PSI=NA #' For internal use. Called by \code{\link{format_table}}. #' #' @param t Original PSI plus quality scores data frame WITHOUT the exon #' metadata columns #' @param qual String indicating the minimun \emph{vast-tools} quality score #' for the PSI to be accepted. Defaults to \code{'VLOW'}. See the #' \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools #' documentation} for details. #' @return Data frame with the same dimensions as \emph{t} and low/bad quality P #' SI values converted to \code{NA} #' @import dplyr #' @importFrom magrittr "%>%" #' @examples #' \dontrun{ #' psiplot:::convert_psi(psi[,7:ncol(psi)]) #' } convert_psi <- function(t,qual = c("VLOW","N","LOW","OK","SOK")) { qual <- match.arg(qual) stopifnot(ncol(t) %% 2 == 0) psi <- t qual_vector <- c("N","VLOW","LOW","OK","SOK") min_qual <- which(qual_vector==qual) for (i in seq(1, ncol(psi), 2)) { cov <- apply(as.matrix(psi[,i+1]), 1, function(x) unlist(strsplit(x,split=",",fixed = T))[[1]]) cov <- match(cov,qual_vector) na <- which(cov < min_qual) if (length(na) > 0) psi[na, i] <- NA } return(psi) } psiplot-2.3.0/R/data.R000066400000000000000000000020641331220542100144360ustar00rootroot00000000000000#' Sample events with PSI data #' #' Contains sample PSI and quality score data as produced by \code{vast-tools #' combine}. #' #' @docType data #' @name psi #' @usage psi #' @format A 5 x 22 data frame #' @keywords datasets NULL #' Sample psiplot configuration settings for datasets \code{psi} and \code{crpkm} #' #' Example of how a psiplot configuration file should be formatted. This can be #' passed to \code{\link{plot_event}}, \code{\link{plot_multievent}} or #' \code{\link{plot_expr}} using the \code{config} argument. #' #' @docType data #' @name config #' @usage config #' @format A 8 x 5 data frame #' @keywords datasets NULL #' Sample genes with cRPKM data #' #' Contains sample cRPKM data as produced by \code{vast-tools combine}. #' #' @docType data #' @name crpkm #' @usage crpkm #' @format A 6 x 10 data frame #' @keywords datasets NULL #' Sample genes with cRPKM and counts data #' #' Contains sample cRPKM data and raw read counts #' #' @docType data #' @name crpkm_counts #' @usage crpkm_counts #' @format A 6 x 18 data frame #' @keywords datasets NULL psiplot-2.3.0/R/draw_group_means.R000066400000000000000000000025401331220542100170600ustar00rootroot00000000000000#' Draw group means as horizontal lines #' #' When this function is called, the group means are calculated and plotted #' as horizontal lines. For internal use only. #' #' @param gp ggplot2 object #' @param mdata a gathered data frame of PSI/cRPKM values. Usually comes from #' \code{\link{plot_event}} or \code{\link{plot_expr}}. #' @param reordered a list with the subgroup and group structure of the samples. #' Usually comes from \code{\link{preprocess_sample_colors}}. #' @return ggplot2 object #' @import dplyr #' @importFrom magrittr "%>%" #' @seealso \code{\link{preprocess_sample_colors}}, \code{\link{plot_event}}, #' \code{\link{plot_expr}} #' draw_group_means <- function(gp,mdata,reordered) { m <- mdata %>% left_join(reordered$subgroup,by="SampleName") %>% left_join(reordered$group,by="SubgroupName") %>% group_by(GroupName) %>% dplyr::summarise(mu=mean(value,na.rm = T)) %>% mutate(mu=replace(mu,is.na(mu),NA)) %>% left_join(reordered$group_order,by="GroupName") %>% dplyr::select(GroupOrder,GroupName,mu,RColorCode) %>% arrange(GroupOrder) %>% mutate(GroupName=factor(GroupName,levels=GroupName)) gp2 <- gp + geom_hline(data=m, aes(yintercept = mu, colour= GroupName), lwd=0.5, show.legend = F) return(gp2) } psiplot-2.3.0/R/format_table.R000066400000000000000000000074101331220542100161640ustar00rootroot00000000000000#' Format input event data #' #' Convert low/bad quality PSI values and convert event metadata as a first ID #' column. Prepares input event/GE data for plotting. Calls \code{\link{convert_psi}}. #' #' @param x A data frame of event data as outputted by \code{vast-tools combine}. #' e.g. each row is an event containing exon metadata, PSI and quality scores #' values. If \code{expr = TRUE}, then each row is a gene containing two columns #' of metadata, one column of cRPKM per sample, and, optionally, a second column #' per sample with read counts. #' @param qual String indicating the minimun \emph{vast-tools} quality score #' for the PSI to be accepted. Defaults to \code{'VLOW'}. See the #' \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools #' documentation} for details. #' @param expr Set to \code{TRUE} if formatting a cRPKM table. Otherwise, #' \code{FALSE}. #' @param counts Set to \code{TRUE} if the cRPKM table has read counts. Otherwise, #' \code{FALSE}. #' @param trim_colnames String that must be searched for and trimmed at the end #' of every sample column in x. Useful to trim the "-cRPKM" suffix from expression #' tables. If no string must be trimmed, leave as \code{FALSE}. #' @param short_ids Set to \code{TRUE} to make the metadata column shorter in the #' output, by including only the event ID (for events) or the gene ID (if run #' with \code{expr==TRUE}). #' @return A data frame. If run with \code{expr=FALSE} (default), each row is an #' event, the first column (\code{ID}) contains a concatenation of the event #' metadata delimited by |, and there are two more columns per sample, with PSI #' and quality scores values. If run with (\code{expr=TRUE}), each row is a gene, #' the \code{ID} column contains the gene metadata, and there is one more column #' per sample with the cRPKM value. #' @seealso \code{\link{convert_psi}} #' @export #' @import dplyr #' @importFrom magrittr "%>%" #' @importFrom stats setNames #' @examples #' # For example input, see: #' psi #' format_table(psi) #' # For cRPKM #' crpkm #' format_table(crpkm, expr = TRUE) #' #' # For cRPKM with read counts and the "-cRPKM" suffix in sample columns: #' crpkm_counts #' format_table(crpkm_counts, expr = TRUE, counts = TRUE, trim_colnames = "-cRPKM") #' #' # To keep only event IDs/gene IDs as metadata: #' psi #' format_table(psi,short_ids = TRUE) #' format_table <- function(x, qual = c("VLOW","N","LOW","OK","SOK"), expr = FALSE, counts = FALSE, trim_colnames = NULL, short_ids = FALSE) { if (expr) { if (!grepl("^ID$", colnames(x)[1])) { stop("Invalid column names. Does your input file contain the correct header?") } #Use only the ID column as gene ID if short_ids==T. Else, paste all metadata if(short_ids==FALSE){ r <- x %>% mutate(ID=paste(NAME,ID,sep="|")) } else{ r <- x } if (counts) { r <- r[,c(1,seq(3,ncol(x),by=2))] } else { r <- r[,c(1,3:ncol(x))] } if (!is.null(trim_colnames)){ str_to_trim <- paste(trim_colnames,"$",sep="") #Regexp for end of line r <- setNames(r, c(colnames(r)[1],gsub(str_to_trim,"",colnames(r)[-1]))) } return(r) } if (!grepl("^GENE", colnames(x)[1])) { stop("Invalid column names. Does your input file contain the correct header?") } # Format table to keep only PSIs an ID column. # If short_ids==T, keep only event ID. Else, paste all metadata as ID if(short_ids==T){ id <- x$EVENT } else{ id <- paste(x$COMPLEX, x$GENE, x$EVENT, x$COORD, x$LENGTH, sep="|") } # Extract PSIs r <- convert_psi(x[,7:ncol(x)],qual=qual) r <- r %>% mutate(ID=id) %>% select(ID,colnames(r)) return(r) } psiplot-2.3.0/R/get_beta_ci.R000066400000000000000000000077231331220542100157610ustar00rootroot00000000000000 # This function takes a qual and returns c(post_alpha, post_beta) # Increments by prior alpha and prior distribution beta, uniform by default parseQual <- function(qual, prior_alpha=1, prior_beta=1) { if(is.na(qual) || !grepl("@", qual)) { return(c(prior_alpha, prior_beta)) } ## for INT NA Columns res <- unlist(strsplit(unlist(strsplit(as.character(qual), "@"))[2], ",")) if(is.na(res[1]) || is.na(res[2])) { return(c(prior_alpha, prior_beta)) } if(is.null(res[1]) || is.null(res[2])) { return(c(prior_alpha, prior_beta)) } if(res[1] == "NA" || res[2] == "NA") { return(c(prior_alpha, prior_beta)) } res <- as.numeric(res) if(is.nan(res[1]) || is.nan(res[2])) { return(c(prior_alpha, prior_beta)) } if(is.infinite(res[1]) || is.infinite(res[2])) { return(c(prior_alpha, prior_beta)) } res[1] <- res[1] + prior_alpha res[2] <- res[2] + prior_beta res } #' Obtain CIs from the sampled values #' #' @param betaDist A vector with the values sampled from the distribution #' @param percentile A vector with the two percentiles that will be returned. #' Defaults to 0.05 and 0.95, to give 90\% confidence intervals. #' @examples #' betasample <- rbeta(n=10000, 2, 2) #' psiplot:::betaCI(betasample) #' @return A named vector with the desired percentiles. #' betaCI <- function(betaDist, percentile = c(0.05, 0.95)) { stats::quantile(betaDist, p=percentile, na.rm = T) } #Sample from a beta distribution given the shape parameters betaCISample <- function(alpha, beta, n = 5000) { if (is.na(alpha) || is.na(beta)) { sample <- c(NA,NA) } else { set.seed(79) sample <- stats::rbeta(n, alpha, beta) } return(sample) } #' Calculate confidence intervals for error bars #' #' Helper function to filter and return confidence intervals based on beta #' distribution from Q scores. For internal use. Beta sampling functions #' provided by Tim Sterne-Weiler. #' #' @param q a data frame of PSI and corresponding quality values #' @return Confidence intevals of PSI values #' @author Tim Sterne-Weiler, Kevin Ha get_beta_ci <- function(q) { parameters <- parseQual(q) ci <- betaCISample(alpha=parameters[1],beta=parameters[2]) ci <- betaCI(ci) ci <- ci * 100 return(ci) } #' @title Calculate conficence intervals for error bars of subgrouped samples. #' #' @description Helper function to filter and return confidence intervals based #' on a joint beta distribution obtained from Q scores. For internal use. #' #' @details Individual beta distributions are generated from each sample in the #' subgroup. Those distributions are sampled and the results are used to fit a #' new joint beta distribution. The joint beta is then sampled again to obtain #' confidence intervals for the subgroup. #' #' @param v Numeric vector with PSI values of samples in a subgroup. #' @param q Character vector with the quality scores string of samples in a subgroup. get_beta_ci_subg <- function(v,q) { parameters <- sapply(q, function(x) parseQual(as.character(x)),USE.NAMES = F) parameters[,is.na(v)] <- NA if(ncol(parameters) == 1){ newCIs <- betaCISample(alpha = parameters[1,], beta = parameters[2,]) } else { CIsamples <- lapply(1:ncol(parameters), function(j) betaCISample(parameters[1,j], parameters[2,j])) CIpool <- do.call("c",CIsamples) CIpool <- CIpool[is.na(CIpool)] smean <- mean(CIpool,na.rm = T) svar <- stats::var(CIpool,na.rm = T) const_mom <- smean*(1-smean)/(svar^2) - 1 #constant part of alpha and beta estimates a_mom <- smean*const_mom #alpha estimate with method of moments b_mom <- (1-smean)*const_mom #beta estimate with method of moments fittedparams <- tryCatch( MASS::fitdistr(CIpool,"beta",list(shape1=a_mom, shape2=b_mom)), error= function(e) list("estimate"=c(NA,NA))) newCIs <- betaCISample(alpha = fittedparams$estimate[1], beta = fittedparams$estimate[2]) } newcis <- list(betaCI(newCIs) * 100) return(newcis) } psiplot-2.3.0/R/get_psi_samples.R000066400000000000000000000020221331220542100166750ustar00rootroot00000000000000#' Get samples from PSI input table #' #' @details #' #' When \code{config} is provided, then the samples from the \emph{SampleName} #' column are used to find the indices in the PSI table. #' #' @param df A data frame of PSI input values. #' @param config Config data frame #' @param value If \code{TRUE}, then returns the sample names. Otherwise, return #' the indices. #' @return If \code{value = TRUE}, A character vector consisting of sample names. #' Otherwise, a numeric vector of indices. #' @export #' @examples #' \dontrun{ #' get_psi_samples(psi) #' } get_psi_samples <- function(df, config = NULL, value = TRUE) { sample_cols <- colnames(df[, 7:ncol(df)]) samples <- grep("(\\.|-)Q$", sample_cols, invert = TRUE, value = TRUE) # samples <- colnames(df)[ix] if (!is.null(config)) { if (!is.data.frame(config)) { stop("configdf is not a data frame!") } samples <- config$SampleName[which(config$SampleName %in% samples)] } if (value) { return(samples) } return(match(samples, colnames(df))) } psiplot-2.3.0/R/plot_event.R000066400000000000000000000332411331220542100157050ustar00rootroot00000000000000#' Plot PSI values of a given alternative splicing event #' #' Generate a plot of PSI values for a given exon. The PSI values and #' corresponding quality scores are typically obtained from the #' \href{https://www.github.com/vastgroup/vast-tools}{vast-tools} #' pipeline. #' #' @details #' Plots can be customized via the \code{config} option. Either a data frame or #' the filepath to the config file can be used. Alternatively, plots can be #' customized using a limited set of graphical parameters as described above. #' #' The order of samples (e.g. columns in \code{x}) as it appears on the #' resulting plot can be customized using a config file. If a config file is not #' used and re-ordering is desired, then it must be done manually before calling #' \code{\link{plot_event}} by altering the columns of \code{x}. #' #' If subgroups are defined in \code{config} and \code{subg=TRUE}: #' \itemize{ #' \item{The mean PSI of the samples within each subgroup are drawn as a single #' data point.} #' \item{If \code{subg=TRUE} and \code{errorbar=TRUE}, confidence intervals for #' the subgroup are derived from a joint beta distribution, fitted to a set of #' points derived from individual beta distributions corresponding to each #' sample (see \code{\link{get_beta_ci_subg}}). This is an experimental feature, #' computationally expensive, and CIs may not be shown for some subgroups,due #' to failure in fitting the joint distribution, especially for events with low #' coverage and PSI values near 0 or 1.} #' \item{Subgroups will be ordered by the minimum \emph{Order} value of their #' samples, and assigned to the first group to which they are matched.} #' \item{(Experimental) Instead of computing the average PSI, the individual #' PSI values can be plotted for each subgroup by setting \code{subg.show}. The #' default is "mean", which plots the average PSI. The other two options are #' "all" or "beeswarm". For "all", the individual PSI values and error bars #' are plotted for each subgroup and sorted in increasing order. For #' "beeswarm", the optional #' \href{https://github.com/eclarke/ggbeeswarm}{ggbeeswarm} package is used to #' create beeswarm scatterplots for each subgroup (error bars are not possible). #' As this is an optional feature, please manually install the package first #' before using it: \code{install.packages("ggbeeswarm")}.} #' } #' #' If no subgroups are defined in \code{config}, or \code{subg=FALSE} (default), #' a subgroup will be defined for each sample, preserving their name and order. #' #' If groups and colors are defined in \code{config}, all the samples in a group #' will be colored with the first color assigned to the group. Else, all #' samples will be plotted in black. #' #' If groups are defined in \code{config} and \code{groupmean=TRUE}, the mean #' PSI of the samples within each group are drawn as horizontal lines. The #' colors of the lines are determined by the color set to the first sample of #' each group by \code{RColorCode} in \code{config}. A corresponding legend key #' will also be drawn. #' #' (See also \code{\link{preprocess_sample_colors}} and \code{vignette('psiplot-usage')} #' for details on how to use config files). #' #' PSI values that have \emph{NA} value are omitted and not plotted. #' #' Error bars based on the confidence interval of the PSI estimation can be #' shown by setting \code{errorbar=TRUE}. #' #' @param x A 1-row data frame containing PSI values to be plotted. #' @param trim_colnames String that must be searched for and trimmed at the end #' of every sample column in x. If no string must be trimmed, leave as \code{NULL}. #' @param config Optional configuration settings for \code{plot_event}. Can be #' a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} #' file. Use the latter option if you are calling \code{plot_event} multiple times. #' @param subg Logical indicating whether samples should be subgrouped for plotting. #' @param subg.show Only applies when \code{subg == TRUE}. Default is \code{mean}, #' in which the average PSI is computed for each subgroup. If \code{all}, then #' individual point estimates with error bars are shown. If \code{beeswarm}, this is #' similar to \code{all}, but shown as a beeswarm plot and without error bars. #' @param qual String indicating the minimun \emph{vast-tools} quality score #' for the PSI to be accepted. Defaults to \code{'VLOW'}. See the #' \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools #' documentation} for details. #' @param errorbar Logical indicating whether error bars should be drawn. #' @param groupmean Logical indicating whether grouped means should be drawn. #' Requires \code{config}. #' @param col Vector of colors with length matching the number of samples. If #' specified, this will override the color settings specified in \code{config}. #' @param title Title of the plot. If \code{NULL} (default), the title generated #' by \code{\link{make_title}}. #' @param xlab The x-axis label. #' @param ylab The y-axis label. #' @param ylim Range of y-axis. #' @param cex.main Plot title size (pts). #' @param cex.yaxis Y-axis font size (pts). #' @param cex.xaxis X-axis font size (i.e. the sample names) (pts). #' @param pch Point symbol. #' @param cex.pch Size of datapoints. #' @param plot (deprecated) Prints the plot. #' @param gridlines Logical indicating whether grid lines should be drawn. #' @param show_group_legend Set to FALSE to avoid showing a legend with the sample #' groups and their colors. #' @return ggplot2 object #' @seealso #' \code{\link{format_table}} for performing some initial conversion steps of #' \code{x}. #' #' \code{\link{preprocess_sample_colors}} for pre-processing of \code{x} #' using\code{config}. #' #' \code{\link{plot_multievent}} for plotting more than one #' event in the same plot. #' #' @export #' @import dplyr #' @import tidyr #' @import purrr #' @importFrom magrittr "%>%" #' @import ggplot2 #' @examples #' \dontrun{ #' plot_event(psi[1,]) # #' # Plot with custom configuration #' config #' plot_event(psi[1,], config = config, groupmean=TRUE) #' plot_event(psi[1,], config = "/path/to/config") #' #' # Plot with subgrouped samples #' config #' plot_event(psi[1,], config = config, subg = TRUE, errorbar = FALSE) #' #' # Plot with subroups and error bars (slow, experimental feature) #' \dontrun{ #' plot_event(psi[1,], config = config, subg = TRUE, errorbar = TRUE) #' } #' #' # Plot using custom configuration, changing point symbol, and y-axis #' # scale #' plot_event(psi[1,], config = config, pch = 9, ylim = c(20, 80)) #' } plot_event <- function( x, config = NULL, subg = FALSE, subg.show = c("mean", "all", "beeswarm"), trim_colnames = NULL, qual = c("VLOW","N","LOW","OK","SOK"), errorbar = TRUE, groupmean = ifelse(is.null(config), FALSE, TRUE), col = NULL, title = NULL, xlab = "", ylab = "PSI", ylim = c(0,100), cex.main = 14, cex.yaxis = 12, cex.xaxis = 12, pch = 20, cex.pch = 3, plot = NULL, gridlines = TRUE, show_group_legend = TRUE) { if (!missing(plot)) { warning("The option 'plot' has been deprecated") } if (nrow(x) != 1) { stop("Too many rows!") } qual = match.arg(qual) subg.show = match.arg(subg.show) if (subg.show == "beeswarm") { if (!requireNamespace("ggbeeswarm", quietly = TRUE)) { stop(paste("Please install the package ggbeeswarm:", "install.packages(\"ggbeeswarm\")", "or use the option subg.show = \"all\" instead")) } else { errorbar = FALSE } } # Format input x <- format_table(x, qual = qual, trim_colnames=trim_colnames, short_ids = FALSE) reordered <- preprocess_sample_colors(x, config, expr=F, col = col, subg= subg, multi_col=NULL) psi <- reordered$data qual <- reordered$qual #Subgroups will only be used if the original config had subgroups AND #if the subg argument was set to TRUE. Otherwise subgroups will be overridden #with the sample names (1 sample = 1 subgroup) subg <- all(c(subg==TRUE, "SubgroupName" %in% colnames(reordered$original_config))) if (all(is.na(psi))) { warning("Did not find any points to plot") } N <- ifelse(is.null(ncol(psi)), 1, ncol(psi)) if (N < 2) { stop("Need two or more samples!") } # Set plot title if (is.null(title)) { title <- make_title(as.character(x$ID)) } mdata <- suppressMessages(gather(psi, key = "SampleName", value = "value")) mqual <- suppressMessages(gather(qual, key = "SampleName", value = "qual")) # Pool samples according to subgroups using the info in reordered # (Subgroups equal to samples if subg == F anyway) sm <- left_join(mdata,mqual,by="SampleName") %>% left_join(reordered$subgroup,by="SampleName") if (subg && subg.show == "all") { smsum <- sm %>% dplyr::group_by(SampleName, SubgroupName, value) %>% do(ci = get_beta_ci(.$qual)) %>% ungroup() %>% mutate( lo = map_dbl(ci, 1), hi = map_dbl(ci, 2) ) %>% select(SubgroupName, value, lo, hi) } else if (subg && subg.show == "beeswarm") { smsum <- select(sm, SubgroupName, value) } else { smsum <- sm %>% dplyr::group_by(SubgroupName) if(errorbar){ smsum <- smsum %>% do(m_psi = mean(.$value,na.rm=T), ci = get_beta_ci_subg(.$value,.$qual)) %>% ungroup() %>% mutate(m_psi = map_dbl(m_psi,1), ci = map(ci,1), lo = map_dbl(ci,1), hi = map_dbl(ci,2)) %>% mutate(m_psi = replace(m_psi,is.na(m_psi),NA)) %>% select(SubgroupName, value = m_psi, lo,hi) } else { smsum <- smsum %>% do(m_psi = mean(.$value,na.rm=T)) %>% ungroup() %>% mutate(m_psi = map_dbl(m_psi,1)) %>% mutate(m_psi = replace(m_psi,is.na(m_psi),NA)) %>% select(SubgroupName, value = m_psi) } } smsum <- left_join(reordered$subgroup_order,smsum,by="SubgroupName") %>% dplyr::arrange(SubgroupOrder) smsum <- left_join(smsum,reordered$group,by="SubgroupName") %>% left_join(reordered$group_order,by="GroupName") %>% arrange(SubgroupOrder) %>% mutate(SubgroupName=factor(SubgroupName,levels=unique(SubgroupName))) %>% arrange(GroupOrder) %>% mutate(GroupName=factor(GroupName,levels=unique(GroupName))) %>% dplyr::select(Order=SubgroupOrder, Sample=SubgroupName, colnames(smsum), GroupName, RColorCode) inherit.aes <- FALSE if (subg && subg.show == "all") { gp <- smsum %>% group_by(Sample) %>% arrange(Order, value) %>% mutate(position = rank(value)) %>% ggplot(aes(x = Sample, y = value, color=GroupName, group=position)) + geom_point(position=position_dodge(width=.5)) inherit.aes <- TRUE } else if (subg && subg.show == "beeswarm") { gp <- smsum %>% ggplot(aes(x = Sample, y = value, color=GroupName)) + ggbeeswarm::geom_quasirandom() } else { gp <- ggplot(data=smsum) + geom_point(aes(x=Sample, y=value, colour=GroupName), size = cex.pch, shape=pch, show.legend = show_group_legend) } gp <- gp + scale_colour_manual("Sample Group", values=reordered$group_order$RColorCode) if(errorbar){ gp <- gp + geom_errorbar(inherit.aes = inherit.aes, aes(x=Sample, ymin=lo, ymax=hi, colour=GroupName), width=0.1, position=position_dodge(width=.5), show.legend = F) } # Draw horizontal lines for groups if (!is.null(config) && groupmean) { gp <- draw_group_means(gp, mdata, reordered) } gp <- gp + ylab(ylab) + xlab(xlab) + ylim(ylim) + ggtitle(title) + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1, size = cex.xaxis), axis.text.y = element_text(size = cex.yaxis), axis.title.y = element_text(size = cex.yaxis), title = element_text(size = cex.main)) if (!gridlines) { gp <- gp + theme(panel.grid = element_blank()) } if (is.null(config)) { gp <- gp + guides(color=FALSE) } return(gp) } #' Make plot title #' #' Create a plot title using the event ID #' #' @param x A character containing the event ID like #' "\code{S|TSPAN6|chrX:99885756-99885863|108}" #' @return A character with a human-friendly title with #' event type, gene symbol, event coordinates, and length #' @examples #' \dontrun{ #' f <- format_table(psi) #' print(make_title(f$ID[1])) #' } make_title <- function(x) { event <- strsplit(as.character(x), split = "\\|")[[1]] sprintf("%s\n(%s, %s bp, type %s)", event[2], event[3], event[4], event[1]) } #' Make plot title (version 2) #' #' Create a plot title using the event ID. Returns symbol and event ID. #' #' @param gene A vector or character string #' @param event A vector or character string with same size as \code{gene} #' @return A character with a human-friendly title with format: #' \code{GENE (EVENT ID)} #' @examples #' \dontrun{ #' print(make_title.2(psi$GENE, psi$EVENT)) #' } make_title.2 <- function(gene, event) { sprintf("%s (%s)", gene, event) } psiplot-2.3.0/R/plot_expr.R000066400000000000000000000222411331220542100155400ustar00rootroot00000000000000#' Plot cRPKM values of a given gene #' #' Generate a plot of cRPKM values for a given gene. The cRPKM values are #' obtained from the #' \href{https://www.github.com/vastgroup/vast-tools}{vast-tools} pipeline. #' #' @details #' Like \code{\link{plot_event}} and \code{\link{plot_multievent}}, plots can be #' customized via the \code{config} option. Either a data frame or #' the filepath to the config file can be used. Alternatively, plots can be #' customized using a limited set of graphical parameters as described above. #' #' See Details of \code{\link{plot_event}} and \code{\link{preprocess_sample_colors}} #' for more information on customizing plots. Note that the \code{errorbar} #' argument is not available for cRPKMs. #' #' cRPKM values that have \emph{NA} value are omitted and not plotted. #' #' @param x A 1-row data frame containing cRPKM values to be plotted #' @param trim_colnames String that must be searched for and trimmed at the end #' of every sample column in x. Useful to trim the "-cRPKM" suffix from expression #' tables. If no string must be trimmed, leave as \code{NULL}. #' @param config Optional configuration settings for \code{plot_expr}. Can be #' a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} #' file. Use the latter option if you are calling \code{plot_expr} multiple times. #' @param subg Logical indicating whether samples should be subgrouped for plotting. #' If \code{TRUE}, the average of all samples in a subgroup is plotted as a single #' data point. See \code{\link{plot_event}} and \code{\link{preprocess_sample_colors}} #' for more details on subgrouping. #' @param subg.show Only applies when \code{subg == TRUE}. Default is \code{mean}, #' in which the average PSI is computed for each subgroup. If \code{all}, then #' individual point estimates with error bars are shown. If \code{beeswarm}, this is #' similar to \code{all}, but shown as a beeswarm plot and without error bars. #' @param counts Logical indicating whether the data frame contains read counts. #' Set to \code{TRUE} if the data frame contains two columns per sample (cRPKM and #' counts), otherwise leave as \code{FALSE} (default). #' @param groupmean Logical indicating whether grouped means should be drawn. #' Requires \code{config}. #' @param col Vector of colors with length matching the number of samples. If #' specified, this will override the color settings specified in \code{config}. #' @param title Title of the plot. If \code{NULL} (default), the title will be #' the content of the \code{ID} column in \code{x}. #' @param xlab The x-axis label. #' @param ylab The y-axis label. #' @param ylim Range of y-axis. #' @param cex.main Plot title size (pts). #' @param cex.yaxis Y-axis font size (pts). #' @param cex.xaxis X-axis font size (i.e. the sample names) (pts). #' @param pch Point symbol. #' @param cex.pch Size of datapoints. #' @param gridlines Logical indicating whether grid lines should be drawn. #' @param plot (deprecated) prints the plot. #' @param show_group_legend Set to FALSE to avoid showing a legend with the sample #' groups and their colors. #' @return ggplot2 object. #' @seealso #' \code{\link{format_table}} for performing some initial conversion steps of \code{x} #' #' \code{\link{preprocess_sample_colors}} for pre-processing of \code{x} using #' \code{config} #' #' @export #' @import methods #' @import ggplot2 #' @import dplyr #' @import tidyr #' @import purrr #' @importFrom magrittr "%>%" #' @examples #' \dontrun{ #' plot_expr(crpkm[1,]) #' #' # Plot with custom configuration #' config #' plot_expr(crpkm[1,], config = config, groupmean=TRUE) #' plot_expr(crpkm[1,], config = "/path/to/config") #' #' # Plot using custom configuration, changing point symbol, and y-axis #' # scale #' plot_expr(crpkm[1,], config = config, pch = 9, ylim = c(20, 80)) #' } #' #' # Plot with subgrouped samples #' plot_expr(crpkm[1,], config=config, subg=TRUE) #' #' # Plot directly from a table with suffixes and read counts #' crpkm_counts #' plot_expr(crpkm_counts[1,], config = config, trim_colnames = "-cRPKM", counts = TRUE) #' plot_expr <- function( x, config = NULL, subg = FALSE, subg.show = c("mean", "all", "beeswarm"), trim_colnames = NULL, counts= FALSE, groupmean = ifelse(is.null(config), FALSE, TRUE), col = NULL, title = NULL, xlab = "", ylab = "Expression (cRPKM)", ylim = NULL, cex.main = 14, cex.yaxis = 12, cex.xaxis = 12, pch = 20, cex.pch = 3, plot = NULL, gridlines = TRUE, show_group_legend = TRUE) { if (!missing(plot)) { warning("The option 'plot' has been deprecated") } if (nrow(x) != 1) { stop("Too many rows!") } subg.show = match.arg(subg.show) if (subg.show == "beeswarm") { if (!requireNamespace("ggbeeswarm", quietly = TRUE)) { stop(paste("Please install the package ggbeeswarm:", "install.packages(\"ggbeeswarm\")", "or use the option subg.show = \"all\" instead")) } else { errorbar = FALSE } } x <- format_table(x, expr = TRUE, counts=counts, trim_colnames=trim_colnames, short_ids= FALSE) reordered <- preprocess_sample_colors(x, expr=T, config = config, col = col, subg = subg, multi_col = NULL) crpkm <- reordered$data subg <- all(subg==TRUE, "SubgroupName" %in% colnames(reordered$original_config)) if (all(is.na(crpkm))) { warning("Did not find any points to plot") } N <- ifelse(is.null(ncol(crpkm)),1,ncol(crpkm)) if (N < 2) { stop("Need two or more samples!") } # Set plot title if (is.null(title)) { title <- x$ID } # if (is.null(ylim)) { # ylim <- c(0, round(max(x[,-1])) + 1) # } mdata <- suppressMessages(gather(crpkm, key = "SampleName", value = "value")) #Here the only difference between subg==T and subg==F is that samples need to #be pooled for cRPKM calculations. The rest is just the same (error bars are) #not an option for expression at the moment sm <- left_join(mdata,reordered$subgroup,by="SampleName") if(subg && subg.show == "mean"){ smsum <- sm %>% dplyr::group_by(SubgroupName) %>% dplyr::summarise(sdev=sd(value,na.rm=T), value=mean(value,na.rm=T)) %>% mutate(value=replace(value,is.na(value),NA), lo = value - sdev, hi = value + sdev) } else { smsum <- mutate(sm, lo = NA, hi = NA) } smsum <- smsum %>% dplyr::select(SubgroupName,value,lo,hi) smsum <- left_join(reordered$subgroup_order,smsum,by="SubgroupName") %>% dplyr::arrange(SubgroupOrder) smsum <- left_join(smsum,reordered$group,by="SubgroupName") %>% left_join(reordered$group_order,by="GroupName") %>% arrange(SubgroupOrder) %>% mutate(SubgroupName=factor(SubgroupName,levels=unique(SubgroupName))) %>% arrange(GroupOrder) %>% mutate(GroupName=factor(GroupName,levels=unique(GroupName))) %>% dplyr::select(Order=SubgroupOrder, Sample=SubgroupName, value, lo, hi, GroupName, RColorCode) if (subg && subg.show == "all") { gp <- smsum %>% group_by(Sample) %>% arrange(Order, value) %>% mutate(position = rank(value)) %>% ggplot(aes(x = Sample, y = value, color=GroupName, group=position)) + geom_point(position=position_dodge(width=.5)) } else if (subg && subg.show == "beeswarm") { gp <- smsum %>% ggplot(aes(x = Sample, y = value, color=GroupName)) + ggbeeswarm::geom_quasirandom() } else { gp <- ggplot(smsum) + geom_point(aes(x=Sample, y=value, colour=GroupName), size=cex.pch, shape=pch, show.legend=show_group_legend) } gp <- gp + scale_colour_manual("Sample Group", values=reordered$group_order$RColorCode) # Add error bars if subgrouping with mean if (subg && subg.show == "mean") { # Adjust y-axis to fit error bars if (is.null(ylim)) { ylim <- c(max(c(0, min(smsum$lo - 3, na.rm=T)), na.rm=T), max(smsum$hi + 3, na.rm=T)) } gp <- gp + ylim(ylim) + geom_errorbar( aes(x=Sample, ymin=lo, ymax=hi, colour=GroupName), width=0.1, position=position_dodge(width=.5), show.legend = F) } else { if (!is.null(ylim)) { gp <- gp + ylim(ylim) } } if(!is.null(config) && groupmean) { gp <- draw_group_means(gp, mdata, reordered) } gp <- gp + ylab(ylab) + xlab(xlab) + ggtitle(title) + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1, size = cex.xaxis), axis.text.y = element_text(size = cex.yaxis), axis.title.y = element_text(size = cex.yaxis), title = element_text(size = cex.main)) if (!gridlines) { gp <- gp + theme(panel.grid = element_blank()) } return(gp) } psiplot-2.3.0/R/plot_multi.R000066400000000000000000000255661331220542100157310ustar00rootroot00000000000000#' Plot multiple events or genes as a heatmap (experimental) #' #' Visualize multiple PSI or cRPKM values in a single plot. #' #' @details #' By default, \code{\link[ggplot2]{geom_tile}} is used to generate a heatmap #' and a \code{ggplot2} object is returned. Alternatively, other heatmap #' packages are supported including: \code{\link[pheatmap]{pheatmap}} #' (use \code{usepkgs = "pheatmap"}) and #' \code{\link[gplots]{heatmap.2}} (use \code{usepkgs = "gplots"}). #' #' Input is similar to \code{\link{plot_event}}, \code{\link{plot_expr}}, or #' \code{\link{plot_multievent}}. Subgrouping of samples is also supported (see #' \code{\link{plot_event}} and \code{\link{preprocess_sample_colors}} for details #' on subgrouping). If subgroups are activated, the PSI for each subgroup is taken #' as the average of all the samples in the subgroup. #' #' If \code{cluster_rows = TRUE}, then a hierarchical clustering using \code{hclust} #' will be performed on a distance matrix computed by \code{dist}. If \code{config} #' is not specified, then the samples will also be clustered. #' #' To set the colours, use \code{fill} option to specify vector of colours. #' By default (\code{fill=NULL}), PSI uses a yellow/blue gradient, while cRPKMs #' uses the "YlOrRd" color brewer palette. #' #' @param df A data frame of input values (PSI or cRPKM). If the latter, need to #' set \code{expr = TRUE}. #' @param config Optional configuration settings. Can be #' a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} #' file. #' @param subg Logical indicating whether samples should be subgrouped for plotting. #' @param expr Logical - \code{TRUE} if plotting cRPKMs, \code{FALSE} otherwise #' @param counts Logical indicating whether the data frame contains read counts. #' Set to \code{TRUE} if the data frame contains two rows per sample (cRPKM and #' counts), otherwise leave as \code{FALSE} (default). #' @param trim_colnames String that must be searched for and trimmed at the end #' of every sample column in x. Useful to trim the "-cRPKM" suffix from expression #' tables. If no string must be trimmed, leave as \code{FALSE}. #' @param qual String indicating the minimun \emph{vast-tools} quality score #' for the PSI to be accepted. Defaults to \code{'VLOW'}. See the #' \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools #' documentation} for details. #' @param xlab The x-axis label #' @param ylab The y-axis label #' @param title Title of the plot #' @param cluster_rows Logical to cluster rows using hierarchical clustering #' @param cluster_cols Logical to cluster columns using hierarchical clustering #' @param fill A vector of colours. e.g. from \code{colorRampPalette}. #' Default is \code{NULL}, which will choose the palette automatically. #' @param usepkg Default is \code{ggplot2}, which creates the heatmap using #' \code{\link[ggplot2]{geom_tile}}. Otherwise, use \code{gplots}, which calls #' \code{\link[gplots]{heatmap.2}}. #' @param ... Additional parameters passed to \code{\link[gplots]{heatmap.2}} or #' \code{\link[pheatmap]{pheatmap}}. #' @export #' @import ggplot2 #' @import dplyr #' @import tidyr #' @importFrom grDevices colorRampPalette #' @importFrom magrittr "%>%" #' @importFrom stats dist #' @importFrom stats hclust #' @examples #' # Uses ggplot2 by default #' plot_multi(psi) #' plot_multi(psi, config = config) #' #' # Use expr = TRUE for cRPKMs #' plot_multi(crpkm, expr = TRUE) #' plot_multi(crpkm, config = config, expr = TRUE) #' plot_multi(crpkm, config = config, expr = TRUE, cluster_rows = TRUE) #' #' # To use pheatmap or gplots for plotting, set usepgk option #' plot_multi(psi, config = config, usepkg = "pheatmap") #' #' # To enable sample subgroups, set subg = TRUE #' plot_multi(psi, config = config, subg = TRUE) #' #' # Working with expression tables with read counts and suffixes, enabling subgroups #' plot_multi(crpkm_counts, config = config, expr = TRUE, trim_colnames = "-cRPKM", counts = TRUE) plot_multi <- function(df, config = NULL, subg = FALSE, expr = FALSE, trim_colnames = FALSE, qual = c("VLOW","N","LOW","OK","SOK"), counts = FALSE, xlab = "", ylab = "", title = "", cluster_rows = TRUE, cluster_cols = ifelse(is.null(config), TRUE, FALSE), fill = NULL, usepkg = c("ggplot2","gplots","pheatmap"), ... ) { qual = match.arg(qual) usepkg = match.arg(usepkg) # Format input formatted_df <- format_table(df, qual = qual, expr = expr, counts = counts, trim_colnames = trim_colnames, short_ids = FALSE) if (expr == FALSE) { formatted_df$ID <- make_title.2(df$GENE, df$EVENT) } reordered <- preprocess_sample_colors(formatted_df, config = config, subg = subg, expr = expr) psi <- reordered$data %>% mutate(ID=formatted_df$ID) %>% dplyr::select(ID,colnames(reordered$data)) mdata <- psi %>% group_by(ID) %>% gather(key="SampleName", -ID, value="value") #Determine if samples must be subgrouped subg <- all(c(subg==TRUE, "SubgroupName" %in% colnames(reordered$original_config))) #Do subgroups if subg==T, use the samples as subgroups if subg==FALSE. #This part could be a separate function, called also from plot_multievent. if(subg){ sm <- left_join(mdata,reordered$subgroup,by="SampleName") smsum <- sm %>% dplyr::group_by(ID,SubgroupName) %>% dplyr::summarise(value=mean(value,na.rm=T)) %>% mutate(value=replace(value,is.na(value),NA)) %>% dplyr::select(ID,SubgroupName,value) } else{ sm <- left_join(mdata,reordered$subgroup,by="SampleName") smsum <- sm %>% dplyr::select(ID,SubgroupName,value) } smsum <- left_join(reordered$subgroup_order,smsum,by="SubgroupName") %>% dplyr::arrange(ID,SubgroupOrder) smsum <- left_join(smsum,reordered$group,by="SubgroupName") %>% left_join(reordered$group_order,by="GroupName") %>% arrange(ID,SubgroupOrder) %>% group_by(ID) %>% mutate(SubgroupName=factor(SubgroupName,levels=unique(SubgroupName))) %>% arrange(ID,GroupOrder) %>% mutate(GroupName=factor(GroupName,levels=unique(GroupName))) %>% dplyr::select(ID, Order=SubgroupOrder, Sample=SubgroupName, colnames(smsum), GroupName, RColorCode) heatmap_data <- smsum %>% dplyr::select(ID,Sample,value) %>% spread(key=Sample,value=value) %>% as.data.frame() rownames(heatmap_data) <- heatmap_data$ID heatmap_data <- subset(heatmap_data, select=(-ID)) if (is.null(fill)) { if (expr) { # Use RColorBrewer::brewer.pal(6, "YlOrRd") fill <- c("#FFFFB2", "#FED976", "#FEB24C", "#FD8D3C", "#F03B20", "#BD0026") } else { fill <- colorRampPalette(c("yellow", "blue"))(20) } } if (usepkg == "gplots" && requireNamespace("gplots", quietly = TRUE)) { #Make heatmap with gplots #Preformat data for gplots::heatmap.2 col_colors <- smsum %>% ungroup() %>% dplyr::filter(ID==smsum$ID[1]) %>% pull(RColorCode) dendro <- "none" if (cluster_cols && cluster_rows) { dendro <- "both" } else if (cluster_cols) { dendro <- "column" } else if (cluster_rows) { dendro <- "row" } # Not ideal, but need two function calls if we want option to have # ColSideColors or not. Seems like heatmap.2 can't take an empty # ColSideColors -- you have to specify something or don't use it at all. if (!is.null(reordered$original_config)) { gplots::heatmap.2(as.matrix(heatmap_data), Colv = cluster_cols, Rowv = cluster_rows, dendrogram = dendro, ColSideColors = col_colors, col = fill, margins = c(10, 35), trace = "none", key.xlab = ifelse(expr, "cRPKM", "PSI"), xlab = xlab, ylab = ylab, main = title, ... ) } else { gplots::heatmap.2(as.matrix(reordered$data), Colv = cluster_cols, Rowv = cluster_rows, dendrogram = dendro, col = fill, margins = c(10, 35), trace = "none", key.xlab = ifelse(expr, "cRPKM", "PSI"), xlab = xlab, ylab = ylab, main = title, ... ) } } else if (usepkg == "pheatmap" && requireNamespace("pheatmap", quietly = TRUE)) { if(!is.null(reordered$original_config)){ smsum1 <- smsum %>% ungroup() %>% dplyr::filter(ID==smsum$ID[1]) col_colors <- smsum1 %>% pull(RColorCode) names(col_colors) <- smsum1 %>% pull(Sample) anno_colors <- reordered$group_order %>% pull(RColorCode) names(anno_colors) <- reordered$group_order %>% pull(GroupName) anno_colors <- list(Group=anno_colors) anno_col <- smsum1 %>% select(Group=GroupName) %>% as.data.frame() rownames(anno_col) <- smsum1 %>% pull(Sample) } else{ col_colors <- NA anno_colors <- NA anno_col <- NA } pheatmap::pheatmap(as.matrix(heatmap_data), cluster_rows = cluster_rows, cluster_cols = cluster_cols, main = title, col = fill, annotation_colors = anno_colors, annotation_col = anno_col, ... ) } else { #We go with ggplot2 if (cluster_rows) { # Perform hierarchical clustering of events/genes hr <- hclust(dist(heatmap_data)) heatmap_data <- heatmap_data[hr$order,] } if (is.null(reordered$original_config)) { hc <- hclust(dist(t(heatmap_data))) heatmap_data <- heatmap_data[,hc$order] } heatmap_data$id <- rownames(heatmap_data) m <- gather(heatmap_data,key="variable",value="value",-id) m$variable <- factor(m$variable, levels = colnames(subset(heatmap_data, select = -id)), ordered = TRUE) m$id <- factor(m$id, levels = unique(m$id), ordered = TRUE) gp <- ggplot(m, aes(x = variable, y = id)) + geom_tile(aes(fill = value)) + theme_bw() + theme(axis.text.x = element_text(angle= 45, hjust = 1, size = 9), axis.text.y = element_text(size = 8), panel.grid = element_blank(), panel.border = element_blank()) + xlab(xlab) + ylab(ylab) + ggtitle(title) + coord_fixed(ratio = 1) gp <- gp + scale_fill_gradientn(colours = fill, na.value = "white", name = ifelse(expr == FALSE, "PSI", "cRPKM")) return(gp) } } psiplot-2.3.0/R/plot_multievent.R000066400000000000000000000250341331220542100167610ustar00rootroot00000000000000#' Plot PSI values of multiple alternative splicing events #' #' Generate a plot with PSI values for several exons. The PSI values and #' corresponding quality scores are typically obtained from the #' \href{https://www.github.com/vastgroup/vast-tools}{vast-tools} pipeline. #' #' @details #' Like in \code{\link{plot_event}} and \code{\link{plot_expr}}, plots can be #' customized via the \code{config} option. Either a data frame or #' the filepath to the config file can be used. Alternatively, plots can be #' customized using a limited set of graphical parameters as described above. #' #' See Details of \code{\link{plot_event}} and #' \code{\link{preprocess_sample_colors}} for more information on the usage of #' the \code{config}, \code{subg}, and \code{errorbar} arguments. #' #' Unlike in \code{\link{plot_event}} and \code{\link{plot_expr}}, #' sample colors in \code{config} or \code{col} are now shown only in the #' background, as the point colors are now used to differentiate PSI values from #' different events. In addition, a line connects the points from each event, to #' increase visibility. The color of each event can be set using the #' \code{event_col} argument. #' #' Also, note that using \code{subg=TRUE} and \code{errorbar=TRUE} together is #' an experimental feature, computationally expensive, and CIs may not be shown #' for some subgroups, especially for events with low coverage and PSI values near #' 0 or 1 (see \code{\link{get_beta_ci_subg}} for details on error bar estimation #' for subgrouped samples). #' #' @param x A data frame containing PSI values to be plotted. #' @param trim_colnames String that must be searched for and trimmed at the end #' of every sample column in x. If no string must be trimmed, leave as \code{FALSE}. #' @param config Optional configuration settings for \code{plot_event}. Can be #' a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} #' file. Use the latter option if you are calling \code{plot_event} multiple times. #' @param subg Logical indicating whether samples should be subgrouped for plotting. #' @param qual String indicating the minimun \emph{vast-tools} quality score #' for the PSI to be accepted. Defaults to \code{'VLOW'}. See the #' \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools #' documentation} for details. #' @param errorbar Logical indicating whether error bars should be drawn #' @param col Vector of colors with length matching the number of samples. If #' specified, this will override the color settings specified in \code{config}. #' @param event_col Vector of colors, with length matching the number of events #' (rows of \code{x}). If left as \code{NULL}, event colors will be set with #' \code{\link[ggplot2]{scale_colour_hue}} #' @param title Title of the plot. #' @param xlab The x-axis label. #' @param ylab The y-axis label. #' @param ylim Range of y-axis. #' @param cex.main Plot title size (pts). #' @param cex.yaxis Y-axis font size (pts). #' @param cex.xaxis X-axis font size (i.e. the sample names) (pts). #' @param pch Point symbol. #' @param cex.pch Size of datapoints. #' @param plot (deprecated) Prints the plot. #' @param gridlines Logical indicating whether grid lines should be drawn. #' @param lwd Line width for errorbars and the line connecting PSIs from each event. #' @param show_event_legend Set to FALSE to avoid showing a legend with the event #' IDs and their colors. #' @param show_group_legend Set to FALSE to avoid showing a legend with the sample #' groups and their colors. #' @return ggplot2 object #' @seealso #' \code{\link{format_table}} for performing some initial conversion steps of #' \code{x}. #' #' \code{\link{preprocess_sample_colors}} for pre-processing of \code{x} #' using\code{config}. #' #' \code{\link{plot_event}} for plotting single events. #' #' @export #' @import dplyr #' @import tidyr #' @import purrr #' @import ggplot2 #' @importFrom magrittr "%>%" #' @examples #' plot_multievent(psi, config = config) #' #' # Example with subgrouped samples, custom title and no error bars #' plot_multievent(psi, config = config, subg = TRUE, errorbar = FALSE, title = "Highlighted events") #' #' # Legends can be hidden separately #' plot_multievent(psi, config = config, show_event_legend = FALSE) #' plot_multievent(psi, config = config, show_group_legend = FALSE) #' #' # Custom event colors #' plot_multievent(psi[1:3,], config = config, event_col=c("red","black","orange")) #' #' # Use of errobar = TRUE and subg = TRUE is experimental and computationally expensive #' \dontrun{ #' plot_multievent(psi, config = config, subg = TRUE, errorbar = TRUE) #' } #' plot_multievent <- function( x, config = NULL, subg = FALSE, trim_colnames = NULL, qual = c("VLOW","N","LOW","OK","SOK"), errorbar = TRUE, col = NULL, event_col = NULL, title = "MULTI EVENT PLOT", xlab = "", ylab = "PSI", ylim = c(0,100), cex.main = 14, cex.yaxis = 12, cex.xaxis = 12, pch = 20, cex.pch = 3, plot = NULL, gridlines = TRUE, lwd=0.5, show_event_legend=T, show_group_legend=T) { if (!missing(plot)) { warning("The option 'plot' has been deprecated") } qual = match.arg(qual) # Format input x <- format_table(x, qual = qual, trim_colnames = trim_colnames, short_ids = T) reordered <- preprocess_sample_colors(x, config, subg = subg, col = col, multi_col = event_col) psi <- reordered$data %>% mutate(ID=x$ID) %>% dplyr::select(ID,colnames(reordered$data)) qual <- reordered$qual %>% mutate(ID=x$ID) %>% dplyr::select(ID,colnames(reordered$qual)) #Check two or more samples if(any(rowSums(!is.na(psi[,-1]))/(ncol(psi)-1) == 0)){ warning("Could not find any points to plot for some events") } #Subgroups will only be used if the original config had subgroups AND #if the subg argument was set to TRUE. Otherwise subgroups will be overridden #with the sample names (1 sample = 1 subgroup) subg <- all(c(subg==TRUE, "SubgroupName" %in% colnames(reordered$original_config))) # Set plot title if (is.null(title)) { title <- "MULTI_EVENT_PLOT" } mdata <- psi %>% group_by(ID) %>% gather(key="SampleName", -ID, value="value") mqual <- qual %>% group_by(ID) %>% gather(key="SampleName", -ID, value="qual") #Pool samples according to subgroups in reordered sm <- left_join(mdata,mqual,by=c("ID","SampleName")) %>% left_join(reordered$subgroup,by="SampleName") smsum <- sm %>% dplyr::group_by(ID,SubgroupName) if(errorbar){ smsum <- smsum %>% do(m_psi = mean(.$value,na.rm=T), ci = get_beta_ci_subg(.$value,.$qual)) %>% ungroup() %>% mutate(m_psi = map_dbl(m_psi,1), ci = map(ci,1), lo = map_dbl(ci,1), hi = map_dbl(ci,2)) %>% mutate(m_psi = replace(m_psi,is.na(m_psi),NA)) %>% select(ID, SubgroupName, value = m_psi, lo,hi) } else { smsum <- smsum %>% do(m_psi = mean(.$value,na.rm=T)) %>% ungroup() %>% mutate(m_psi = map_dbl(m_psi,1)) %>% mutate(m_psi = replace(m_psi,is.na(m_psi),NA)) %>% select(ID, SubgroupName, value = m_psi) } smsum <- left_join(reordered$subgroup_order,smsum,by="SubgroupName") %>% dplyr::arrange(ID,SubgroupOrder) smsum <- left_join(smsum,reordered$group,by="SubgroupName") %>% left_join(reordered$group_order,by="GroupName") %>% arrange(ID,SubgroupOrder) %>% group_by(ID) %>% mutate(SubgroupName=factor(SubgroupName,levels=unique(SubgroupName))) %>% arrange(ID,GroupOrder) %>% mutate(GroupName=factor(GroupName,levels=unique(GroupName))) %>% dplyr::select(ID, Order=SubgroupOrder, Sample=SubgroupName, colnames(smsum), GroupName, RColorCode) #Now on to the plotting gp <- ggplot() + geom_blank(data=smsum, aes(x=Sample, y=value)) if(!is.null(reordered$original_config)){ #Background with groups groupbg <- smsum %>% dplyr::filter(ID==smsum$ID[1]) gp <- gp + geom_rect(data=groupbg, aes(xmin=as.numeric(Sample)-0.5, xmax=as.numeric(Sample)+0.5, ymin=-Inf, ymax=Inf, fill=GroupName), alpha=0.1) gp <- gp + scale_fill_manual("Sample Group", values=reordered$group_order$RColorCode) } #Core plotting of events gp <- gp + geom_point(data=smsum, aes(x=Sample, y=value, colour=ID), size = cex.pch, shape=pch) if(!is.null(event_col)){ gp <- gp + scale_colour_manual("ID", values=reordered$multi_col$EventRColorCode) } else{ gp <- gp + scale_colour_hue("ID") } #Lines joining points from the same event gp <- gp + geom_line(data=smsum, linetype="solid", lwd=lwd, aes(x=Sample, y=value, colour=ID, group=ID), show.legend = F) #Draw error bars if(errorbar==TRUE){ gp <- gp + geom_errorbar(data=smsum, inherit.aes = F, mapping = aes(x=Sample, ymin=lo, ymax=hi, colour=ID), width=0.1, show.legend = F) } #Final touches gp <- gp + ylab("PSI") + ylim(ylim) gp <- gp + ggtitle(title) gp <- gp + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1, size = cex.xaxis), axis.text.y = element_text(size = cex.yaxis), axis.title.y = element_text(size = cex.yaxis), title = element_text(size = cex.main)) if (!gridlines) { gp <- gp + theme(panel.grid = element_blank()) } #Hide legends according to arguments if(show_group_legend==FALSE){ gp <- gp + guides(fill=show_group_legend) } if(show_event_legend==FALSE){ gp <- gp + guides(colour=show_event_legend) } return(gp) } psiplot-2.3.0/R/preprocess_sample_colors.R000066400000000000000000000317711331220542100206430ustar00rootroot00000000000000#' Preprocess PSI or cRPKM data frame using configuration file #' #' \code{preprocess_sample_colors} re-orders PSI or cRPKM sample columns to a #' specified order, and it defines sample pools and colors. Order and colors are #' taken from a pre-defined tab-delimited file (see \code{details}). #' #' @details #' \code{preprocess_sample_colors} depends on a pre-defined "sample inventory" #' database file in tab-delimited format. This file is species-specific and #' consists of five columns: (optional) \emph{Order}, \emph{SampleName}, \emph{SubroupName} #' (optional), \emph{GroupName}, (optional) \emph{RColorCode}. The header is required in #' the file. Order of the columns is flexible. #' #' For example: #' #' \preformatted{Order SampleName SubgroupName GroupName RColorCode #' 1 Oocyte_a Oocyte EarlyDev firebrick4 #' 2 Oocyte_b Oocyte EarlyDev firebrick4 #' 3 Embr_4C_a Embr_4C EarlyDev firebrick4 #' 4 Embr_4C_b Embr_4C EarlyDev firebrick4 #' 5 ESC_CGR8 ESC ESC firebrick #' etc..} #' #' where: #' \itemize{ #' \item{Order: A specific ordering of the samples from left to right of the plot.} #' \item{SampleName: Name of the sample. MUST match sample name in input table.} #' \item{SubgroupName: Use to define sample pools that will be plotted in the #' same data point (see \code{plot_event}, \code{plot_expr} and #' \code{plot_multievent}).} #' \item{GroupName: Use for plotting the average PSI of samples belonging #' to the same group. Averages will be calculated from the individual samples, #' not from the subgroups (to avoid overrepresentation of subgroups with fewer #' samples).} #' \item {RColorCode: Color name as specified by \code{\link{colors}} or hex #' color code (\code{#RRGGBB}).} #' } #' #' The \emph{SampleName} must match the column names in \code{data}. It is possible #' for \code{config} to contain more samples than the \code{data}. In this case, #' the extra samples will be ignored. It is also possible that #' \code{config} contains only a subset of the samples in \code{data}. In this #' case, only the samples specified in the \code{config} will be plotted and everything #' else is ignored. #' #' If a \emph{SampleName} or \emph{SubgroupName} is matched to multiple groups, #' only the first match will be used. Similarly, if a \emph{GroupName} is matched #' to multiple \emph{RColorCodes}, the first one will be applied to all elements #' in the group. #' #' To use the \emph{SubgroupNames} in \code{config}, \code{subg} must be set to #' \code{TRUE} AND \code{config} must contain a \emph{SubgroupName} column. If any #' of these conditions is not met, one subgroup will be created for each sample, #' preserving their name and order, and overriding any subgroups in \code{config}. #' #' The colors in \code{config} can be overridden by specifiying \code{col}. This #' was mainly added to support the \code{col} option provided by #' \code{\link{plot_event}} -- particularly when \code{config} is not provided. #' #' This function is also used for formatting cRPKM input data by setting #' \code{expr = TRUE}. #' #' @param data A \emph{n} x \emph{2*m+1} data frame of PSI and quality score values #' where \emph{n} is the number of AS events and \emph{m} is the number of samples. #' If \code{expr=TRUE}, a \emph{n} x \emph{m+1} data frame of cRPKM. In both cases, #' the first column corresponds to the row metadata. Metadata column values must #' be unique, duplicated values will be discarded. #' @param config Filename of the configuration file for \code{data}. Also #' accepts \emph{m} x \emph{4} data frame of the configuration file, or an \emph{m} #' x \emph{5} data frame if the SubgroupName column is included. #' @param subg Set to \code{TRUE} to define a subgroup structure using the #' \code{SubgroupName} column in \code{config}. If \code{FALSE}, or if the file #' does not contain this column, samples will not be subgrouped (a separate #' subgroup will be defined for each sample, preserving the sample names). If #' \code{FALSE} and the file contains a \code{SubgroupName} column, that column #' will be ignored. #' @param expr Set to \code{TRUE} if formatting a cRPKM table. Otherwise, \code{FALSE}. #' @param col Vector of colors with length matching the number of samples. If #' specified, this will override the color settings specified in \code{config}. #' @param multi_col Vector of colors with length matching the number of rows in #' \code{data}. If specified, this can be used to define the color corresponding #' to each event in \code{plot_multievent()} #' @return #' A list containing: #' \describe{ #' \item{data}{data frame of PSI/cRPKM values with columns re-ordered} #' \item{qual}{data frame of quality scores with columns re-ordered. \code{NULL} #' if \code{expr = TRUE}} #' \item{sample_order}{data frame with the order corresponding to each sample #' name} #' \item{subgroup}{data frame with the subgroup corresponding to each sample. If #' \code{subg=FALSE}, or \emph{SubgroupName} is not present in \code{config}, #' a subgroup is made for each sample, preserving sample names.} #' \item{subgroup_order}{data frame with the order corresponding to each subgroup.} #' \item{group}{data frame with the group corresponding to each subgroup} #' \item{group_order}{data frame with the order and color corresponding to #' each group.} #' \item{multi_col}{if \code{multi_col} was specified, a data frame with the #' color coresponding to each event/gene ID. Else, \code{NULL}.} #' \item{config}{if a \code{config} was supplied, config data frame summarising #' the order-sample-subgroup-group-color relationships described in #' \code{sample_order}, \code{subgroup}, \code{subgroup_order}, \code{group} #' and \code{group_order}, after correcting for ambiguous relationships. If #' \code{col} was supplied, colours in config are overridden with \code{col}. If #' no \code{config} was supplied, one will be composed with default parameters.} #' \item{original_config}{data frame with the \code{config} supplied to the function} #' } #' @seealso \code{\link{plot_event}}, \code{\link{plot_expr}}, #' \code{\link{plot_multievent}} #' @export #' @import dplyr #' @import readr #' @importFrom magrittr "%>%" #' @examples #' #Tables from vast-tools need formatting before using this function #' a <- format_table(psi) #' reorderedpsi <- preprocess_sample_colors(a, config = config) #' #' b <- format_table(crpkm,expr=TRUE) #' reorderedcrpkm <- preprocess_sample_colors(b, config = config, expr = TRUE) #' #' # Subgroups can be avoided even if the config file has them #' reorderedpsi <- preprocess_sample_colors(a, config = config, subg = FALSE) #' #' # Mapping colours to events (e.g. for plotting with plot_multievent) #' reorderedpsi <- preprocess_sample_colors(a[1:2,], config = config, multi_col = c("red","blue")) preprocess_sample_colors <- function(data, config, subg = TRUE, expr = FALSE, col = NULL, multi_col = NULL) { if (colnames(data)[1] != "ID") { stop("Input data may be invalid. Check that format_table() was executed first.") } R <- list() N <- ifelse(expr, ncol(data) - 1, (ncol(data) - 1) / 2) if (!is.null(col) && length(col) != N) { stop("The length of col does not match the number of samples") } if(!is.null(multi_col) && length(multi_col) != nrow(data)){ stop("The length of multi_col does not match the number of events") } #Filter out non-unique events if(length(unique(data$ID)) < length(data$ID)){ warning("More than one row with the same ID detected. Plotting only one row per ID") multi_col <- multi_col[!duplicated(data$ID)] data <- data %>% filter(!duplicated(data$ID)) } #Defining event colours #If in multi_event mode and no event colours provided, default ggplot2 will be used if(!is.null(multi_col)){ multi_col <- tibble(ID=data$ID, EventRColorCode=multi_col) } else{ multi_col <- NULL } #Try to use config from argument if(!is.null(config)){ if (is.character(config)) { config <- read_tsv(config) } original_config <- config # check input file [changed to allow flexible config column order, and subgroups] if (!all(c("SampleName", "GroupName") %in% colnames(config))) { stop("Incorrect formatting of headers in config") } if (!"Order" %in% colnames(config)) { config$Order <- seq(1:nrow(config)) } #To use the subgroups in the config, the column must be there and subg==T #Otherwise, subgroups equal the individual samples. subg <- all("SubgroupName" %in% colnames(config),subg==TRUE) } else { #Make our own config and set subg to F if (is.null(col)) { #If no colours, use default col <- rep("black", N) } if (expr) { data.new <- data[,-1] qual.new <- NULL } else { data.new <- data[, seq(2, ncol(data), 2)] qual.new <- data[, seq(3, ncol(data), 2)] colnames(qual.new) <- colnames(data.new) } config <- data.frame("Order"=seq(1,N), "SampleName"=names(data.new), "SubgroupName"=names(data.new), "GroupName" = names(data.new), "RColorCode"=col, stringsAsFactors = F) subg <- FALSE original_config <- NULL } #Override colors in config if col argument is there if (!is.null(col)) { config$RColorCode <- col } else if (!"RColorCode" %in% colnames(config) || all(is.na(config$RColorCode))) { Ngroups <- length(unique(config$GroupName)) col <- gg_color_hue(Ngroups) names(col) <- unique(config$GroupName) config$RColorCode <- col[config$GroupName] } # keep only tissue groups that are present in input data # (to take into account samples that might have been excluded) config <- config[config$SampleName %in% colnames(data)[-1],] if (nrow(config) == 0) { stop("No matching samples found in config. Are you using the correct config?") } # Re-order the PSI table config <- config %>% arrange(Order) %>% mutate(Order=seq(1,nrow(config))) new.column.idx <- sapply(config$SampleName, function(x) which(colnames(data) == x)) data.new <- data[,new.column.idx] #If subgroups are not enabled or they are not present in config, #then make subgroups equal to samples. if(subg==FALSE){ config <- config %>% mutate(SubgroupName=SampleName) } sample_order <- config %>% dplyr::select(Order,SampleName) %>% dplyr::rename(SampleOrder="Order") %>% as.data.frame() subgroup_common <- config %>% dplyr::select(Order,SampleName,SubgroupName) %>% group_by(SubgroupName) %>% dplyr::arrange(Order, .by_group=T) subgroup <- subgroup_common %>% ungroup() %>% dplyr::select(SampleName,SubgroupName) %>% as.data.frame() subgroup_order <- subgroup_common %>% dplyr::select(Order,SubgroupName) %>% dplyr::summarise(SubgroupOrder=min(Order)) %>% arrange(SubgroupOrder) %>% mutate(SubgroupOrder=seq(1:nrow(.))) %>% dplyr::select(SubgroupOrder,SubgroupName) %>% as.data.frame() group_common <- config %>% dplyr::select(Order,SubgroupName,GroupName,RColorCode) %>% group_by(SubgroupName) %>% dplyr::arrange(Order,.by_group=T) group <- group_common %>% dplyr::select(Order,SubgroupName,GroupName) %>% dplyr::summarise(GroupName=first(GroupName)) %>% as.data.frame() group_order <- group_common %>% ungroup() %>% group_by(GroupName) %>% dplyr::select(Order,GroupName,RColorCode) %>% dplyr::summarise(GroupOrder=min(Order), RColorCode=first(RColorCode)) %>% dplyr::select(GroupOrder,GroupName,RColorCode) %>% dplyr::arrange(GroupOrder) %>% mutate(GroupOrder=seq(1:nrow(.))) %>% as.data.frame() config <- sample_order %>% left_join(subgroup,by="SampleName") %>% left_join(subgroup_order,by="SubgroupName") %>% left_join(group,by="SubgroupName") %>% left_join(group_order,by="GroupName") %>% dplyr::select(Order=SampleOrder, SampleName, SubgroupName, GroupName, RColorCode) %>% as.data.frame() if (expr) { qual.new <- NULL } else { qual.new <- data[,new.column.idx + 1] names(qual.new) <- names(data.new) } R <- list(data=data.new, qual=qual.new, sample_order=sample_order, subgroup=subgroup, subgroup_order=subgroup_order, group=group, group_order=group_order, multi_col=multi_col, config=config, original_config=original_config) return(R) } #' Simulate default ggplot2 color palette #' #' @details #' \url{https://stackoverflow.com/a/8197703} #' #' @param n Number of colors #' @return vector of colors of length n gg_color_hue <- function(n) { hues = seq(15, 375, length = n + 1) hcl(h = hues, l = 65, c = 100)[1:n] } psiplot-2.3.0/R/psiplot-package.R000066400000000000000000000026661331220542100166200ustar00rootroot00000000000000#' Produce PSI and GE plots based on output from vast-tools #' #' \code{psiplot} is an R package for generating plots of percent spliced-in (PSI) #' values of alternatively spliced exons. It requires input from #' \href{https://www.github.com/vastgroup/vast-tools}{VAST-TOOLS}, an RNA-Seq #' pipeline for alternative splicing analysis. #' #' @details #' This package uses input data generated by vast-tools. A sample dataset #' (\code{psi}, \code{crpkm} and \code{crpkm_counts}) and sample configuration file #' (\code{config}) is provided. #' #' The main functions to generate plots is \code{\link{plot_event}} and #' \code{\link{plot_expr}} for PSI and cRPKM values, respectively. Two other #' functions, \code{\link{plot_multievent}} and \code{\link{plot_multi}}, allow #' plotting of multiple events in scatterplots or heatmaps. #' #' \code{\link{plot_multi}} can be used to plot multiple events in the form #' of a heatmap. #' #'See \code{vignette('psiplot-usage', package="psiplot")} for usage details. #' #' Report bugs and issues to \url{https://github.com/kcha/psiplot/issues}. #' #' @name psiplot #' @docType package #' @seealso \url{https://www.github.com/kcha/psiplot} #' @seealso \url{https://www.github.com/vastgroup/vast-tools} #' @seealso \url{https://www.vastdb.crg.eu} #' @examples #' library(psiplot) #' plot_event(psi[1,]) #' plot_event(psi[1,], config=config, subg=FALSE) #' plot_expr(crpkm[1,]) #' plot_expr(crpkm[1,], config=config) NULL psiplot-2.3.0/README.Rmd000066400000000000000000000065541331220542100146120ustar00rootroot00000000000000--- title: "psiplot" output: md_document: variant: markdown_github --- ```{r, echo = FALSE} knitr::opts_chunk$set( collapse = TRUE, warning = FALSE, comment = "#>", fig.path = "man/figures/" ) library(psiplot) ``` [![Build Status](https://travis-ci.org/kcha/psiplot.svg?branch=master)](https://travis-ci.org/kcha/psiplot) # psiplot psiplot is an R package for generating plots of percent spliced-in (PSI) values of alternatively-spliced exons that were computed by [vast-tools](https://github.com/vastgroup/vast-tools), an RNA-Seq pipeline for alternative splicing analysis. The plots are generated using `ggplot2`. For a demo of psiplot, take a look at the companion Shiny app: http://kcha.shinyapps.io/psiplotter-app. ## Installation See [Releases](https://github.com/kcha/psiplot/releases) for the latest stable release or get the most up-to-date development version via devtools: ```{r eval=FALSE} if (!require("devtools")) install.packages("devtools") devtools::install_github("kcha/psiplot") ``` ## Getting started ### Quick start psiplot takes as input the PSI and/or cRPKM results generated by vast-tools (e.g. after running `vast-tools combine` or `vast-tools diff`). For example: ```{r eval=FALSE} psi <- read.table("INCLUSION_LEVELS_FULL-Mmu53.tab", header = TRUE, sep = "\t", stringsAsFactors = FALSE) ``` To plot a single splicing event, use the command `plot_event`. In this example, we use the provided sample dataset `psi` and optional sample [configuration](https://htmlpreview.github.io/?https://github.com/kcha/psiplot/blob/master/vignettes/psiplot-usage.html#customizing-plots) table `config`: ```{r plot_event} library(psiplot) # Plot an event using provided sample dataset plot_event(psi[1,], config=config) ``` Several events can be plotted together with the function `plot_multievent()`. This allows users to compare the inclusion patterns of small groups of events: ```{r plot_multievent, eval=TRUE, warning=FALSE} plot_multievent(psi[c(1,2),], config = config, event_col = c("black", "red")) ``` ### Vignette See this [vignette](https://htmlpreview.github.io/?https://github.com/kcha/psiplot/blob/master/vignettes/psiplot-usage.html) for more detailed usage, including how to customize psiplots using a configuration file. ## Issues Please report all bugs and issues using the [issue tracker](https://github.com/kcha/psiplot/issues). ## Related Projects - [vast-tools](https://github.com/vastgroup/vast-tools) - [VastDB](http://vastdb.crg.eu): A database with PSI values computed with vast-tools in many tissues and cell types of several species. - [psiplotter-app](https://github.com/kcha/psiplotter-app): A companion Shiny app for visualizing PSI plots based on this package ## Acknowledgements - Manuel Irimia - Nuno Barbosa-Morais - Tim Sterne-Weiler ## Citation Tapial, J., Ha, K.C.H., Sterne-Weiler, T., Gohr, A., Braunschweig, U., Hermoso-Pulido, A., Quesnel-Vallières, M., Permanyer, J., Sodaei, R., Marquez, Y., Cozzuto, L., Wang, X., Gómez-Velázquez, M., Rayon, T., Manzanares, M., Ponomarenko, J., Blencowe, B.J., Irimia, M. (2017). An Alternative Splicing Atlas Reveals New Regulatory Programs and Genes Simultaneously Expressing Multiple Major Isoforms in Vertebrates. Genome Res, 27(10):1759-1768. PMID: [28855263](https://www.ncbi.nlm.nih.gov/pubmed/28855263) psiplot-2.3.0/README.md000066400000000000000000000063311331220542100144610ustar00rootroot00000000000000 [![Build Status](https://travis-ci.org/kcha/psiplot.svg?branch=master)](https://travis-ci.org/kcha/psiplot) psiplot ======= psiplot is an R package for generating plots of percent spliced-in (PSI) values of alternatively-spliced exons that were computed by [vast-tools](https://github.com/vastgroup/vast-tools), an RNA-Seq pipeline for alternative splicing analysis. The plots are generated using `ggplot2`. For a demo of psiplot, take a look at the companion Shiny app: . Installation ------------ See [Releases](https://github.com/kcha/psiplot/releases) for the latest stable release or get the most up-to-date development version via devtools: ``` r if (!require("devtools")) install.packages("devtools") devtools::install_github("kcha/psiplot") ``` Getting started --------------- ### Quick start psiplot takes as input the PSI and/or cRPKM results generated by vast-tools (e.g. after running `vast-tools combine` or `vast-tools diff`). For example: ``` r psi <- read.table("INCLUSION_LEVELS_FULL-Mmu53.tab", header = TRUE, sep = "\t", stringsAsFactors = FALSE) ``` To plot a single splicing event, use the command `plot_event`. In this example, we use the provided sample dataset `psi` and optional sample [configuration](https://htmlpreview.github.io/?https://github.com/kcha/psiplot/blob/master/vignettes/psiplot-usage.html#customizing-plots) table `config`: ``` r library(psiplot) # Plot an event using provided sample dataset plot_event(psi[1,], config=config) ``` ![](man/figures/plot_event-1.png) Several events can be plotted together with the function `plot_multievent()`. This allows users to compare the inclusion patterns of small groups of events: ``` r plot_multievent(psi[c(1,2),], config = config, event_col = c("black", "red")) ``` ![](man/figures/plot_multievent-1.png) ### Vignette See this [vignette](https://htmlpreview.github.io/?https://github.com/kcha/psiplot/blob/master/vignettes/psiplot-usage.html) for more detailed usage, including how to customize psiplots using a configuration file. Issues ------ Please report all bugs and issues using the [issue tracker](https://github.com/kcha/psiplot/issues). Related Projects ---------------- - [vast-tools](https://github.com/vastgroup/vast-tools) - [VastDB](http://vastdb.crg.eu): A database with PSI values computed with vast-tools in many tissues and cell types of several species. - [psiplotter-app](https://github.com/kcha/psiplotter-app): A companion Shiny app for visualizing PSI plots based on this package Acknowledgements ---------------- - Manuel Irimia - Nuno Barbosa-Morais - Tim Sterne-Weiler Citation -------- Tapial, J., Ha, K.C.H., Sterne-Weiler, T., Gohr, A., Braunschweig, U., Hermoso-Pulido, A., Quesnel-Vallières, M., Permanyer, J., Sodaei, R., Marquez, Y., Cozzuto, L., Wang, X., Gómez-Velázquez, M., Rayon, T., Manzanares, M., Ponomarenko, J., Blencowe, B.J., Irimia, M. (2017). An Alternative Splicing Atlas Reveals New Regulatory Programs and Genes Simultaneously Expressing Multiple Major Isoforms in Vertebrates. Genome Res, 27(10):1759-1768. PMID: [28855263](https://www.ncbi.nlm.nih.gov/pubmed/28855263) psiplot-2.3.0/data/000077500000000000000000000000001331220542100141105ustar00rootroot00000000000000psiplot-2.3.0/data/config.rda000066400000000000000000000004601331220542100160450ustar00rootroot00000000000000‹…’ÍOÂ0ÆË¾p‹&$þ$ PïÓxæ›éÖn!”•´4^ý³=9ßmmb ÃÓ½¿§OÓ½ëçMšl„‡ü @žeàÁ0BŠá•¼©¶5Bþ=PºÝhú0ÙmÓóh šôk†SÆ9Þ}²qfcjãÜÆ…Kl|tòã\µàê°tÙU#uùUcqj8ïñ±•RQ©Ñɳ‹e´¢J`vžÞ”,uÈÎ †Ë9WPr± ¦è™:&XìjAisjØ]– K©/᛫ öI*“¤Ë„à#žVï©sN,ø×´_êÆó¾ahÛöÇ 4‹&}jó]*LÈЫ.dpnÍßùçŝޑ¬3θÈ8éÞô·ÓÉ5psiplot-2.3.0/data/crpkm.rda000066400000000000000000000034611331220542100157200ustar00rootroot00000000000000‹íœKhGÇU[y9~H¶c'é#‡BI ‘?D›jmÙ–K$E±I °ìcl-Ù‡º»JêöÒKÏ9–ôÐKrÎ¥—œz(ôÖB …МÚss(„–І¤³»³+ߎbè¡PA,ÏÿûßüvvföÎÖÚÕâØÕ±L&3’Íf3#£ô×ìýñJ&›9B¿hnɌÎÐF`ÌÑYpj½Ù®K>%¾¼À“ÏÊ\ya‰+/žKÉ…åby©ŒˆvÚ­•æ"ke;ÍÆZüûZ«Qˆª]½ViW Ž»](cc£³R ß“A9Iúñ·ÏÞx°Uyü]ðù^ZëÝ}8váCi´vöã_7¥7Ú­‰0äm<;ýÇ7·¯W~ ÔÞ=©&e‚”½Ö“Î|U >ÒFP¦v?É»°*O‚´»¥÷nÐÖåÇRööõ  4Ïò;Ÿ‡ñ$o.,Ÿ©|ù 4Ho…ÝŸ‘rŒ÷ Ók?ß¡Ÿ/’¼ù;a;É+œ y¤|ÔOåoÆñntœI^žåýÀŽoáiÄý,jWFÇ%•¾}#¨<è/À:ýgå^ýD*_ ëH¹h<+OÂîÆ¤Sh\¤¯ƒ2§¤ÚOa¢ô>‡é°ü©ÊSVïí ì< Yl*žÇæJ,ŽéНœÝv‹ û×¹uÖ¦z2¬ŽOé/^ü…ŒY¯G4¶8¨>|?bm¶’F^°nGXÎŒæ˜&Ñ|Ç•µ®â*šOܸß$DÏÿ£:¹AÝé«&ù7Eòƒ"†í“"PŠ@(E "PŠ@(E "PŠ@(E "PŠ@(E "PŠ@(E "PŠ@(E "PŠ@(E òG ²¯ÿñmPêG>Hþ–»¹ÒXg¿O­èFÏñˆ¬¾£mµ.6bø\uú¶ïa»Æ·kCì:ß®§ì.±3 Ë|{ &–}|Ų ÇÞ ¦cnÅó]GÛõ‰Ìù=:Y5]'®¬@ ì3«ŽMdKq]çJ™…¡áiêð4õ%iÚð44ZÓ«®bØòº­;~dÍ€Hš\u‰âùè ¦˜g™¼Þ3ü.J9†b­J\¢Óì[(mD†&iC“Ð LT»Ž‹çÌd,"k].–Kde"œ_T­Y…âòÒ2œ_{ôTíMRWRµC1e½¸°XLYC®ªÖ[¸˜Ï*«Å´N%j  QÝXJ„bÊÚjvÒ¬¡ˆ¬ŽéØhÖOÆ"œï‘ê;–cÀ}g†@Ú\ó]Åön×# s>ECé¸>ù e¤ÁãX#š¡÷Ñ™ŒE`=¹n©®‘ %¹°t«'î«\(òZhÙpèmY.q™×‡x^Z¨íži¡Ø³_¡%¹xn¿B¡gŸBÅ¢\,íS(ò€BÇ‚ÌjӭݪÒ]îùs8RóÑ&˜N›Þ@½[1 Åäõ†‚p®·«òfﮉÊ5«\³Ê7k\³Æ7ë\³Î3—¹Ìe>s™Ë\ÆÌù CuÕ¤— 4ö{ e~ÃulŸÞÔvݾ';&<„ãé0H?ã»4¶ œäàB­Þ–Óç=7áv±I_N'c‘gUyV•kÕxVt®nn¬µªÀ8I¨bc½WMq2V4Zmd¤´MMÛðĽhè6ÙÅ3&Q¹fkƳœÉ:׌fÆDݸ™ºý›ŒEžUåYñyŠTgÅ÷¶u:ÕPÑ ¦qŒ„cÄ—´PÜæ·ÑU}×êueÛÑñCÄ ˆ MÒ†&¡ƒÌ7ˆ©Øœó齸ކæ:;tC…ëm û‘FNö±@@–6¶´‘e²Ñ÷4ÆT¢rÍ:׌wS&®Á™&é³}бÐc ÁYÆl8“±i³…ýx$¥mjÚ†Fbî’iìÐÓn뼇¯ùTR_º©¸»xÆ"Ϫò¬)×2Ð-Îïч$¨C†ö  I@‹`6 „÷ ð© ÅPO®ãùŠçe~>$£ ô! ú<·ˆoØxp§8“-E뛊 ÅàUŸ{Ä5z]â*&¼ê§Ã }¬}À€GCÞÕµ-Å4Ãw4­×çÂAh÷LBl<‰Ê5«\3~?ÒV·†Ÿ­s™oWùvTýx»ß“;Äê9n|ÇòNpâðX:ÁpxøÀ•kV¹f¼§2Yãšñ…¾ÓݵúiŒXåš1F¬Â¥²K4ñ€d¾]ãÛñ»µX×ùvüníÊjU¦W3 3ùvoG03Wº½Eo†Ð»)biû¿úœ¼úÜé/¹þr^|À¹YjŠéd[é›>ê&~Wz˜Zåèÿ!L•cþ«ÓCmŢ뮛EØ,ÁæyØ\€ÍEØ\‚Íåˆ0óü ž„wTpsiplot-2.3.0/data/crpkm_counts.rda000066400000000000000000000040151331220542100173070ustar00rootroot00000000000000‹í\]häÖVgÇÞ¬cg<Ž½Ù¶YJJÙºìÌøoh¶#{lËzœ‰gH²ú¹¶ÕÕÏTÒìÆÍK_ …RòPhIò’<ô)/¥4O Ú—¶ÐBaÛPJû’‡ü”BHÙ¶!Εt%ùÝYC+v¬Ñw¾óÝOG÷^If÷7Ÿ©O=3%IRA:W,J…sôk±@ÿ|A*Jè~Z÷†·lEwGNàKÒ¹*Åæè§L?“Œ3»µ×ï\K·^æÁKµ&^^åÂ+×rpm­Þ\m"G“ƒ~o}o…{ÝÍäûf¯[cß'úí›»‰ÛÚ5×;¨Õê ±;X¯Ñ})”“å?½ûƒG^ßo½÷ûpûƒ¼9|åîÔõïÊç:¯ÍïŸ;ò£ÿŽ{3Q€æÌDv¤¹çé¾+IS¡5ý‘$C’®þ+ÕÝþèʇo¾ðlëaÖðU¹#Ká&ŸŒÚ“ûE#Üäí°™Îk™ný§tS’.þ’^”MIªžHÒÆAª{}-h}ʾrW~ü=zò=¹øÂ³aƒò"Óü,Šgºå¯Ðýw¨ÏŸP¿?§eø±$=þ\ª»Ù“Z/¿ È_‹ì?&—Y=&Þùë‹t{)Ó-î‡5¥ÿ–¨ßßÒÏIªý-Õ]|1⧺µ«ÑùÊ•Øgëÿì<¾×9Óx)Ö=ÿwºûíÇOIÒ£íT·ÂtÿÈê»|/®ËGñqën\W¹ñ›G–3ÝÉEº_¥2´æ…·é÷_IÒW³ú.†§}å?­WÃìùçåæÍ¨¹÷‡Ö‘Ý)ù2¾n“ÿ û•Ù ÞHk|Ž±í¬Ÿý:´qYîü9–¿Å®Ó\dïrëkïë×Q?»Lëyézø2­ÃûÔó½–×Ñ`žÐ-Õ÷ÙXIÀ)C Ô«žjD¿à¹w®:÷Y;…ïÓ?'''ÿCÄ¢?$:›(^÷o±c6¡NX³–SÕ]Ë"zàzŠ~¤zª/i7 у?#r¦c¸#Í"ŸF¤’‰˜N@…aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„aEXV„•Ï»•0;û½nòãÛPê-¾þ–}o½»Å¾Ï®æÐõ‰¢}CßïÝè&æ3¸ÿ„Ñu>]C7øt#G÷ˆ£Zy3 ̧çÌ$0 O¯ÛŽé:€;Ã0@,¯ûçêÇñ¹r ‡F6,Õ0ˆ§¨ÐHzuÃuˆb«žçÞA)ó04>MŸ¦Ý'MŸ†ª5·á©¦£l9†¬*ˆ€¤Ò†GT?@'5›¢€<Ïà­¡¡”‡P ZkhIJF6J«‚ÈØ$}l*ÂLûÈõpŸ)% ¢î*õfc€¨ „ý‹¢»V_[]ƒýëžÓÞ!»jN;sÔË+õ5áx èn¯ÇÃàU¥`w£Þ€ÔÙÍè¶·Ws"0Gíí ò^#Q]ËuP¯/% ìï1ꛇ¶kÂyg†@ÚB <ÕñoÏ' s1E¥t½€<‡Jcð<6‰n#t%P/mÙš§Ä"J­¡ÔVï aÇý"—D¾Q¶]ÚÁ£AÛTju,óå1œû õƒ°Á¥û %œ³„V•úµ³„"ÎBõºRoœ!s€ÐCáLf÷éÔn·é,çü©•x̧Í ÖÂ)X¦jñZCA8·úme§†g×å’5.Yã“u.Yç“ .Ùà‘›\ÏM¾ç&×s{®l›šçj½M ÚŸ€”ÅmÏuúdÐ9öF¾âZð.æÃ ýa?¦±C p‰G€O ݾ’¿îå †ÓÅQ=|;-% ªñ¨—ªó¨èZ?¸³½Ùkât !ÅîÖ°óÉ@¨höúˆ8Cyš–§áŽ{Ã4rŒ{LŠrÉ:—Œ{9ƒ .õŒ™]óvîñ¯”€<ªÆ£âë£:ŠŸmwiWC¢3 ã ‡ˆoixÀ! «Ýc{x¤8®_"ª 26I›„N²Ò%–êpÌçNàx뚺çÒ Ž· ô Ý=ØÙ§BQú˜ÒG”Rwäë®ÆlŠrÉ—ŒgS.]Áê±yеÑk Á^ÅXáRÂAº×Ã~:†ò4-OC•XxÂ2éew ÞË×b. ]?q[õŽñL@UãQ‘¥rÏRuB§t$\9…IÐÆ$ŒmA“€Á|ˆžà[Š¡–<×Ô÷ËÊ)|L¶–ácŒ1 ¸;ï“ÀtpqgSž8ƒmUYªOÅà]Ÿ‡Ä3‡GÄS-x×χAúTÿ– _ŒøT×·UËŠÖh|ªÇçÂ"ô‡!.BŠrÉ—Œ×GúáèÖñ»u9ƒùtOGêû£¡2 öÐõ’'÷0'Ïe–ÃÇ'ž¢\²Æ%ã9•Á:—Œoôƒ£c{”·‘ \2¶‘ ° öè‹&.hóé:ŸŽ×ÖÜàÓñÚÚÓm…ÞͰ™ æÓu>™©>}äÒ;P¼2„Ö¦`ˆ¥½ô9›-}ŽˆŸÞ9 Ÿ8·HIIÂyƒ¨#+@Í$k¥Pªÿ?„9¹9Æá/ÎôU›Ž;¸*RJ@xˉÑ:ŠW:b´Á£6¸Ô%u‰K]æQ—¹Ôu…K]åQñZOŒ®ñ¨k SHD›û8^Vpsiplot-2.3.0/data/psi.rda000066400000000000000000000046451331220542100154040ustar00rootroot00000000000000‹í\;pÛȦ%Ù²(K–-ãK.N&irsX¼¹˜%å,êaê"eæf8Kœ€’ö)Õ5©ÝæRæÑÞLª¤Is)Ò$ÅUén&MšTW\•™svì ÐN‘&7ËIüß÷íî÷ïþX€œŸìœƒæy³Ñh,4—– ‹ðpi¾\k,5Vàûâx2„¯›ðð|nÀçõ‚Zê¶vT|¼sÜUëðÒñé#•ëãÖþÄëœ+Šf+¦Ía@±U½ª³”Lå0¢&7Ö7‚ËTµê–­¨–®lgtDå¡î†ešævv`éfMkM·òÖºjTiÅ0ÌŒV,€½¾‰hý¡ªަ›–±]e&×2“Æcø<Ï|þ%Ã%ð6cÁ±©’IŽ˜ÄÔMÉ6L[ÊsÓÁ;•$sJ·”œÒ€p_€\w©2¢ v‘hEË–gNªÌÑ;Å6·‹mfú4År¤š‰Ì1ÃVtnÚ®õŠƒ…¶JŽO.vÔ†o먡{òQ=Ü7Æ¿ù{óÝŸ¹ç—'ÿúŃ?ºï9ÃǯôÁôæÑc‰üõ\Ñ E|-ßî!¢x¿¶êZ2€Ù[&%\µT© \ÕÔdE—4ÙÁÕø×Í’UK2TÙÆ“öMJÇüsYQ$èJQh¢þ‹~ðåŸÝûðõÓ¸ç¿Gy>qŸ|ˆÂ·ç$ú 2:pt–JÄ6æd =ª2°%ËQd ÌÏn([‡f[O×4”Œj ·º®˜ŒU °)¹ùÚ~ÿOÙâºçh¾ Ü“¿¢Çßæ¤\pÓ@k5ð€ÏEuUUÖá´(ºlÔNK dëkA‡@ReÇž;œeʪ-iŠlƒJ¹1Éê:›këpëçÿØûÄ}ëE¶¾nï'YýºÇ¿Eð–ûþ_>‚ý×.¯ªBƒš¤:°­Bõ­ªETïŽEë½2!ÀzVÊ–2gu‹is X"’cÃz©Så Ή&i–l[$e7[ͦ»õqžêágyE¿w‘¥ê¾ÿiVñ¯Oh²¡JÀ„+èÌ­hUA"4/DôjÒš¢É6<ÍmGVÕù2`+²àŽ;}EÚ<Õ-M‚¥hÚ›EºwŠ•>ûu~bŸœîWÕ† tX¯ªlÍ;ùÐòÀ"s`-š²S¿kåUm¢åƒçqýÉžweà ËDKH®ÃõÛ–£°uý½­¼~¿ûϧèážý2Û®ÜÓM =æd[³|0¸AÀjTçíÑ=šsफ़ÊJ}ÉfÙf…/Bp»×ç稰$Ý„åðÊtM“IçâÞ8ÉkùLÝCÅìž~‘Çëù¢séÞ'ûC+†cçýZsöË¢æÑbèºMW£èä°ÈÒÒe$xr’êàèLÂÏ|Iá5@w ÆP票ÉlM†·|å»ÍëAäM&El¼©'?M½QÈÉWÒä¹C5AwQ Á——/_þ›.MÆaPÜÆB|½^Ä\»ð²v¡h³$QÓ$í—^êÓ0Åã _ýŸõs‡ö3Œ§áÅ×#« ÚÏ ™ùQ(Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3ÂŒ0#Ì3__3¨=ý/mü/ר³Ï pi¯sØÁ‚Î;‡§8h=Ù)‚ýÓ}í΢¨}TDËí£îñAç[x4Ž“IØ÷ `•Û'¼&à5AU3à5V“†±±c@Uð:ÖG£x˜ÄEt3Û|4™¦Ip5…“—#·(BÇiEÞ`¦}C¢Yk%qØyiš<'ºÛ%°^ë×iýzmP§¥¹Þj¥Þ0îwâA2½,°u#Ê›­4ô&Sb´‰c¢X/Îx8½$º2JGn‡iè‡Q4í:‹Õ*ƒ%Íf¹}™¤téVŠáúÀÑN Ÿ‡tm!°7RM~áEJ½ì‡Ó Kücà BZ_88Æ¿«p3è<øÛšÊxÊâRÿÝö®ÅôÂ|xÊŽB†O¢$&U´R„´~r`2¼%C|¾Ý.D»‘ÃÓÔ‹'ÏÂt‚·°»<ÎdŸ¤ÓðC’mQo;a0ÌÈÜ!á·:#?íçúªÖW­çc\÷ê8Ò2gwX6Yy;}ж÷ëÙ¹­{S4€>§uÁ¾ªµÕ'?+VÓ±¯h @hs[g,i}ǣܡFmx¾àMëýj~Þ³Ú5búE't ½¨Üo¦uÝéµûû*Ý?p\QøœÂ¯(NTN1àçéøp8ãcuw觉Á}ÌÝÝ4‰§ðâ²w•Î&ý$¶6+iÃQWÉ,¾(¨7j(zÅÙ;èõÙ•X%=»öC/¥[øJò¼_æ}žÊ<ýëû»;Çm"FÓ¶Û·™±ó¶÷»œeÎg9¦&qxEW ÇEÀ)‚ŠbÀ)èª, Ÿ1Wó•"äy¿Ìû<”yæžã®%i~386,±!Ç>-±OéÕóàj4¾ìÇÉ€Þ„­³X­2¨QR·«Ý0òâÒMÐÑšìƒ4¹€›iˆ¢Yì⊹¼GñÅovg“ ¢¹4q\Q 8Å ¢9ÓµÃpVœÎɈܛ•@º¶ã™X)BZ½‡Ç´î—³ Ìù,GóØ8ІpâãAù~ó.S'GϼôŠViò¼_æéˆÍãÈ B¸Å.nQ¤FåWTu}­¤u‚e× œyeúL“ÉÔ›†ÌÈ©QUP£TTL¥< §Ã˜ÎGÇ4ƒyÁ,òðG¯2J¯>Óáø2L½oû‚´Yêýtˆoio cz î¼(Ê~j[ãr¾ÃÁ4›Þ8 ØfƒãŠÂçÌ'¨*þ€Þ௠ªñy íçno6£q’â+ZÁlUêï¥4¡ยð9…_Qœ‚¹œ^^fì(E\Qøœ‚™'ˆ¤ðV™Îªš€×UÍ€×0Ÿ|ÏZí>Ü<éX¨j^CÇZ;»Là6˜þ#Ÿ2Kà6úmÛ×}'q›~'q1 'dg¬ù>â:ßv ŠpƒåAøÔ›ESn˜kx ´Ÿÿ(\¥»{¸»ÿõ7Ë=oÏ üñl¥é› Ìž×ʼÆóz™×yÞ(óÏ›eÞäy«Ì[ PSI=NA For internal use. Called by \code{\link{format_table}}. } \examples{ \dontrun{ psiplot:::convert_psi(psi[,7:ncol(psi)]) } } psiplot-2.3.0/man/crpkm.Rd000066400000000000000000000004711331220542100153570ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{crpkm} \alias{crpkm} \title{Sample genes with cRPKM data} \format{A 6 x 10 data frame} \usage{ crpkm } \description{ Contains sample cRPKM data as produced by \code{vast-tools combine}. } \keyword{datasets} psiplot-2.3.0/man/crpkm_counts.Rd000066400000000000000000000005031331220542100167460ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{crpkm_counts} \alias{crpkm_counts} \title{Sample genes with cRPKM and counts data} \format{A 6 x 18 data frame} \usage{ crpkm_counts } \description{ Contains sample cRPKM data and raw read counts } \keyword{datasets} psiplot-2.3.0/man/draw_group_means.Rd000066400000000000000000000014511331220542100175760ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/draw_group_means.R \name{draw_group_means} \alias{draw_group_means} \title{Draw group means as horizontal lines} \usage{ draw_group_means(gp, mdata, reordered) } \arguments{ \item{gp}{ggplot2 object} \item{mdata}{a gathered data frame of PSI/cRPKM values. Usually comes from \code{\link{plot_event}} or \code{\link{plot_expr}}.} \item{reordered}{a list with the subgroup and group structure of the samples. Usually comes from \code{\link{preprocess_sample_colors}}.} } \value{ ggplot2 object } \description{ When this function is called, the group means are calculated and plotted as horizontal lines. For internal use only. } \seealso{ \code{\link{preprocess_sample_colors}}, \code{\link{plot_event}}, \code{\link{plot_expr}} } psiplot-2.3.0/man/figures/000077500000000000000000000000001331220542100154165ustar00rootroot00000000000000psiplot-2.3.0/man/figures/plot_event-1.png000066400000000000000000001241371331220542100204510ustar00rootroot00000000000000‰PNG  IHDR àzŒß4iCCPkCGColorSpaceGenericRGB8U]hU>»sg#$ÎSl4…t¨? % “V4¡´ºÝÝ6n–I6Ú"èdöîΘÉÎ83»ý¡OEP|1ê›Ä¿·€ (õÛ>´/• %ÚÔ (>´øƒP苦ë™;3™iº±Þeî|óïž{î¹gï蹪X–‘š®-2âs‡ˆ=+„‡ ¡WQ+]©L6O wµ[ßCÂ{_ÙÕÝþŸ­·F qb³æ¨ ˆð§UËvzú‘?êZöbè·1@Ä/z¸ác×Ãs>~ifä,âÓˆUSjˆ—ÌÅøF û1°Ö_ Mjëªèå¢b›uÝ ±pïaþŸmÁh…ómçϙŸ>„ïa\û+5%çáQÄKª’ŸFüâkm}¶àÛ–›‘?ÜÞš¯¦ïD\¬Ûª¾Ÿ¤­µŠ!~ç„6ó,â-ˆÏ7çÊSÁØ«ª“ÅœÁvÄ·5Zòò;À‰º[šñÇrûmSžòçåê5šË{yDüú¼yHö}rŸ9íé|èó„–-ü¥—”ƒăˆ¡FAöçâþ±ÜJjåI.’£[/ã]m¦èÏK 7ÔKëúR ÿD³‹r€¯Y«QŒOÚ-¹êëùQÅÎ|Ÿ|…6«¾ ³ (˜0‡½ MXd(@ߨh©ƒ2­Š_¡fçÀ<ò:´™ÍÁ¾Â”þÈÈ_ƒù¸Î´*d‡>‚²üެÓeñ«…\c?~,7?& ÙƒÏ^2Iö‘q2"yŠ@ÿ«g Ÿ|U\ ï@IDATxìœEöÇßìÂ’sT@ žbÆ€ˆ ŠP0`V<0ŠÊ™ïÌéÔ3¢r1!¢"&D‘ •œóîö¿~…5ÿžžžÙ™Ùé陞ßû|v§»ººÂ·:¼~õª*d) dˆ@A†òa6$@$@$@$@$  På…@$@$@$@$QT@3Š›™‘ På5@$@$@$@$QT@3Š›™‘ På5@$@$@$@$Q2š[–d¶}ûv1³OU¬XQ ã–¬¤¤DvîÜ©ãT¨PAð±‡ë€¿þHQQ‘=(j»´´TvìØžÈ¹Q'ÙþüóO©]»¶T®\ÙÊM   ÈyiíØ±£T©REÿ5ªÌÖ¸òÊ+Ãñï½÷Þpü—_~9nÒÃo¥J•¤iÓ¦Ò½{w¹ñÆ]Í>ø æ¹Pˆwß}w2dˆ,X° œ_Y<òˆ4iÒD^ýõ²¢ò8 øF /P;íñãÇÛw£¶aå,+¬-[¶ ÿ5oÞ\¶lÙ"S¦L‘[o½U+¢k×®J°ÀÚÏmÑ¢…Ô©SG–-[&O=õ”ì³Ï>róÍ7»žkœ:uª\~ùåö n“ @VÈk´nݺ²páBùꫯb6ÎÇ,Ë—/×VÍX‘ºté"¿üòKøï×_(œHwï½÷(‡÷ß¿ëé{î¹gø<¤±hÑ"Yµj•¬X±BFŽ)¡PHþñ,¦nW‚‡~XN:é$)..v‹Â0   È*y­€öéÓG7F< 'ºÙá—Ù£G¤®sçÎrûí·ëó&OžœÔù 4ÐçÞsÏ=Ú_uРA²nݺˆ4æÏŸ/Gy¤\rÉ%:ÖR d;¼W@1 (–ŠG'N”Ã?\ûd¦Ò˜­ZµÒ§mÞ¼9•Óu·z›6mdéÒ¥òßÿþ7"‡zH¦M›&t|ûí·Òµk׈ãÜ!   l$× hýúõå˜cŽÑÝÞnÝðï½÷ž¬Y³FÎ:묔Ûîµ×^Óçžp )§1`À}î?þ‘F»víä7ÞÏ?ÿ\û‘Fä d)¼œ†ÉÞ}ûö•wß}WÆ'ðå´ ºßa!=ýôÓeöìÙöCÛPRí]ì˜^ ~£ðEº‡z¨Œ=:âœdvZ·n­£Ï™3'â´óÏ??bŸ;$@$@$@$ ò^=å”S䢋.ÒÝðcÇŽ ·ÙÖ­[µuS)Õ«W/î¶ËäÉ'ŸìvHjÖ¬©»ÎËJÃõä¿5j¤·~úé§xÑxŒH€H€H€r‚@Þ+ ˜òJ&,˜3gΔ åýn¿0:tè w‘v²‚é›Ì4Q±O!   \'@ô¯D7<äÕW_Õ]ñPJ{öìù×ÑòýLŸ>]'_Ðde̘1ÚŸkË÷ïß?ÙÓŸH€H€H€²Ž}@ÿjŒb¯ZµªÀ÷óÏ?ÿ”~ýúénùò´¦bºë®»ôtL˜Î ]ú‰Ö‘Ç’œ¸ôŸÿüGŸrÛm·IQQQ"§3 d5* 5OµjÕ´‚hº»“é~ÿòË/£VJ‚¹~ýz)--Õ9üóŸÿ”Ž;F] X‹~÷Ýw‡oÛ¶MV¯^ÞÇZð<ð@Ê#èà qƒH€H€H€²„P[C  (ÖaOÆßÏ/[¶Ì–’è¹C±RQûöíõršft}D$µƒ)›ìçbª¥ÝvÛMÐåŽ%@/¾øb®r䄯}   œ&²”ät Xx    œ"ÀAH9Õ\,, ä>* ¹ß†¬ ä* 9Õ\,, ä>* ¹ß†¬ ä* 9Õ\,, ä>* ¹ß†¬ ä¼W@—.]ª×~ß¹s§n8Ìé‰ÉàKJJâ6$&˜G¼í۷Ǘ|È»¬?{ÙP¿DË‹¹IËŠ»aƤª†ü·nÝšÔ97nL*>ʽyóæ¤ÎI¶È‹ $*©”)Ñ´g®“Dã§«‡!ŸDÌÓ=ûòƽá…$[Þd¯)Sædšs’ýÅs ¬áŸj=Ê*S6µU*Ï%ÔÏ™•+W–UU}<Õg@*×C*lqþ(ÞX³fL:U~øá=ÿw¬ÜæÌ™#ï¿ÿ~¬ÃÁ Ç< ù*êaluíÚÕêÕ«WZ.ó¢Z=ôP8Ìmãã?ÖñZ´hávس°ãŽ;Nç‹2–õ·×^{…Ëñæ›oêø–º ÂáÎ ¥\Yjò|W-#qxíÚµÖW\aÕ­[Woܸ±uÚi§Yóçψgßyçw¬.]ºXj)Rý§&ä·î¹ç{”ˆíŸ~úÉêÝ»·U£F GË–-­Áƒ[¿ÿþ{D<û΄ t™+V¬h©•£¬=öØÃ5j”…º¸I*õxúé§­ƒ>تR¥ŠÎ£yóæÖ}÷Ýg©˜[V²erM$ J)ÓkÖ¬™†ÔÜ“xøá‡u/½ô’{ª–¥µ d©Et\µì­¥Z°>ÿüó˜ç$z×Ú½gÏžQ§àþV B”ù÷ÜsÏEœ›lyS¹¦ìÆcøüóÏ—Y~Ô×g<Áóî°ÃÓüÕêm®QË[×DmÙÐV(N²Ï%[,0jݺµµÏ>û؃£¶Ëó ˆw=DeôW@<¶±ÎQF}=Ô®];VßÂgΜiÍž=Û·üÓ‘±2TY7ß|³¥V;ÔœÍ;»R¥J–ZÑš2eJT6_ýµ…÷ôäÉ“£Ž-_Ây+÷ß¿VŠ~þùç0ƒ\Q@6lhA9‹÷×­[·p½°q饗ꛠY³fú!qð¯óÏ?_ÇÁË7] lâÚo¿ý¬ /¼Ð:âˆ#ô>Q·Å7ß|£ùV®\ÙêÓ§5pà@ åF(‹3ýï¿ÿÞRK¢êã¸aQ(“ˆEÞ¼yöâèí1cÆè㈃°ZÍÊÂÍýƒ:ÈUAL¦(ãСCuz(Ûé§Ÿ®)<°‘Ç!CÒR¦¨DÒൊ1|\€E,tÕªU–ZÝKÇ©U«–¾öÝw_½Åñõ×_O¹¶Ê e5iÒD§å¦€"?”­¬¿G}4\†TÊ›Ì5Î诲âC§¬òã8îÃxrûí·‡Ó‰¥€–§ñòƱli«dŸKözA‰ïÑ£‡æOMå¹dò)ëz0ñì¿e±µÇµog«:vìØœWÂTžuÒI'ékïÀN8A¿K `pÀ:\­|èj9÷ÜsµÒª–ó¶7Wà¶óV…E ¬kvÉô‰'ž°;¡mû¬>¦–Õ/ {|Íã%wê©§ZPjŒüë_ÿÒá‡rˆ Ò¿° â Êà§Ÿ~>¦º•Âexï½÷ÂáØ0–×믿Þƒ‚ßáÇë<œ Æo¿ýfÁê‰r}ðÁ:>þ­^½ÚjÕª•wZ[“­Çÿþ÷?”XÅŒ,^¼Ø‚UyÛë—J™Lš^üz¥€B1G/AõêÕ5pˆ¥€^pÁ:N÷îÝ#¬ÒæÚ©_¿¾¥ÜERª>®Gä?çõ×­[§?¶`µrþÅVR{þÉ–7ÙkÊT4Q†ª{4ªì¦.xŽáã Šüo¼a’Žú…5ÉÜ+`妀¦Z¨ÌbdC[¥ò\2ÕY°`uôÑG‡¯·X hªÏ€D¯SûoYlíqíÛÙª€žy晚s.[ñŽÆ½Ö©S' ï=§ ×Å<»T·|Äa\kø°¿òÊ+#ƒ¶“· èu×]§ÆŒmd5kVØBøßÿþ7\wÜèÅÙ'Ÿ|ÇÚ°®àfqÞ(8Žî?ûöÛo±«Å(°:żèÐÕnT¤…Fùʘ`ý»lÙ2}3¢|x`yùå—õ9‡z¨ ÿÞ{ï½ú¾@¤R¤î?üÐ$þ½úê«õK–%#É–ÉœçÕ¯ è/¿ü¢»ÏM{áEŒíX ¨±v:»› X™.ù¯¾ú*iO>ù¤Î÷˜cŽÑ¿n h¬D—,YbÁ: ‹¼Ó½#™ò¦rM¡LÉ2ŒU\ƒ`?zôèXQ,寨»‹q›P§šj=bfê8 m…"%û\Â9P ñ±‚çXÃ¥¿±ÐTžå¹ÊÖ (ZØ9ùä“õuòî»ïÆÌÀ\K·Ýv[T<ÏpÍ¡G&¨’—ƒ6mÚ$ªËM”ŸüíoSÏ’ôŠz˜Èå—_.ÊßJ”r&ªûYn½õV‰5¨FùîÈ%—\"êE*ª{[”©^Ô—üúë¯é-˜JMYåÎ;ïÔé"O¥ÜitõÅ©×ÜrË-¢|ó"òUJ«À!^uˆzEÃŽ²¦ê°^x!|LÝtz[u7„Ã̆RòEùxŠúº3ÐA¹ˆz)в8J:uLTýÛ¨Q#)**ÒŽÛpè7¢ü1õ¦zA˜ ð¯R.ô¶R¨ÃaÉÖã»ï¾“éÓ§‹reÐá„þÚøç?ÿ©¾Œ92|(Ù2…OLaCùËÊÝwß-à¹ÿþûË)§œ"¯½öZÌ”ÔCL_÷ÊZ¢¯ÕÍ#ê#$*þøñãE¹?ˆú —GyD”kƒœsÎ9aÇxeù”iÓ¦‰rqõÑ!Ê‚•†= e‘Õ ¡£ÚÛ ÊÅC—ut” ÷ò1b„[”¸a¨ŸêÞõ¡"ʺ7™ò&{M™Œ’ehγÿ*Ë»(7"ý̸ñÆí‡"¶¯¹æQnFòÔSO‰òߎ8fvR­‡9?Þo¶´ʘìs çàuÕUW ž3¸çLJà˜ëúÁ nÏ%„§z=”—-ò6¢>BD}Lë÷òÕ×ï$å®`‡'Nœ¨ïÍüQ?Î;ïÑöSÂÛx¯ã¾¾öÚku˜‰Ÿl9ñœ|æ™g¤ÿþÒ¡C9öØcušêC5œW"tQñ˜Ñq=á=¬\Í¢â(ã~'ãX ªf¯^ÿùÏô—‰z0GE+¯]]ÆiÐ m|äöÜsOmù0™Âê¿Huqé?t}£;Íì#/¾øÂD׿fR*]ð&!|Ñüñ:|¥a`òDÚ¦ëÛÄÅïc=¦»uÛ㸺Ñõq¤iÄøåÙýkÍ1üšîöD¡<þøãáòÙÓPœ°5×nACwjçÎõ9vNÉÖã•W^ÑiüãÿÐÙ"]t·«PD;–§Lös“Ù†•~Eh7øË+$öín%ƪ^Ša$¸Ø»Îo¸á†ˆ¬ËÃÅ_¬Ó7ףዠº{qA0¸qbY@aÃqX¼ÕD8/c Gù¢>8ô9j4¨ó¶ÈÃß÷ÀÁýé'j5×,§n’LyMZÉÜÈ3Y†Îrª ÿot½ÇTh\H.ºè"~•Óšj=œårîã—-m…²¥ò\‚/,Íüñ‡®ž2 h†±, É>—h*×CyÙ"_cŽd® Ô ï*\'p¡ÂL»¨n} ãpŸ‚)ÜkŒ?î+û}n?·¬m0F¯ˆñãG/ö?úè#ý.D™”á(üì±§gÞëÆ ÓÁ©”î[¨ òÁ3ï¼—±Á·É¸ày‰óðN‡_o²‚ž@¸Í`ÌFP%/»àጠcÒ¤IQíjP šQÖ¥˜æåŒ‹Ë.øƒ´•µ!| é!Êž(2æU_²&ØR_{á›çÙÅ( Ê꣕!(D±þo,Áß;ä?ŽöóÌà rÜ\HJ¥ão«ûਣŽÒç@yu(®è–€o)ºÀÕ—¨…¿S0òe‡ë¨¯I«^½zúŬ¬¾}ÉÖÃtãã倇0H†~1{œÿ’L™œç&²7 ‚ÂŽÝïOYluÝQ6e‰ÐIaxÉàŠ^’¨Øâf0bP(7P¬ à¨¯p ÝÖnR–ª,Há-<Ìá×d°í½÷Þ–Ó y`>Îp/8妛nÒeƇ $e1¾»nù"½dÊ›ì5…ôݤ,†Îs0²í† ±÷3”øC£½!FÉp* éª‡³,ÙÔV([yŸKH£,qÊû Häz([”bP\KxØÝ¯ðlÆ3J¦ýÙk;œ£¬Ÿá1˜uÄ bÃ3¤<Ë´M›6úºwûè2þ¹æ¾N¥œxî ^øX†2jËx~ªÞ9×g¾‰gÿÅ»a‘þ 8ÿ†XïZûù؆ÿ(Î…‹F%/P3²Úî³h×( æ¢)ëש€âk ÊsôÚÂ… ­Ë.»ÌÂ@#ÿûßõ× Q§Ë^v1 hYåÂq7ë‘=-cYD\LûKPNÄÁKÏM0zÇ¡L@ð Â>”7‹*â…S̸ ”¤aþ Ð» ¬pPTM<ó ßûç&[ã_§º`´B VŒ–ÆWÔya4#:»$S&ûy‰ncä=ò†ÒàÕe¥_²PÄ!vÔ9ÕŽ›Qšv`£€bªœ_–$ò²\´h‘¶Ø™ö1¿öû¡¬|psÜ_vßÞdP´òÆt`ñ$Ñò&{MÅÊ3†æ\X—Ì´.˜^-–€XÙ{Qb) éª‡½,ÙÖVéx.¡~‰( å}”u=”—­i'»ê´t"ŽyÀàbÄ(vx÷9Ÿ«%î1§/¿9?‘ßX (FÇ#mÌLb Å3T#É–S¹¡èwôóÁfÒÂ/,«Èï¦D×ž×Æ¢‹óÍ”K|Ø›ž$·4•[•ŽoïÉs‹—«ayçª"í÷¨.W¿ „CÔ—œöƒ˜Ûü6ÜþrÈCYxD½ðE}éèhªKC|ðAß5Ϧö9ãŒ3LþUmx²sÕíqÌìÀw¾—ñþÔ =êéÚ}Kà‹_'7QФV®n‡E½ä"ÂM|„›íˆjÇyŽó8˜ÀÏ>Eꥩ}{T¿¿ÄW99òÈ#Eu™jøw}öÙgrÇwÈܹsµÿ­øNÚ”%Ñz(ë­>“ã@Yà›¨FékßGøÃÂOþ[F’-“9/™_ä Q]íQ§)+µ¾vþýïG+§¨¤^ÎCÚ¿~šåð+õPÕÕ+ðïRS/i¿Zeåõ²MÈo çç~ŒÊz›R±Ôƒ\ŸëþÅÁdÊ›ì5•R¡'½ýöÛ‚4Ô<¿¢¬þŽ£»váãkõÖ¾º®‘lé®G6·UyžK6d17½~¤ƒ­³ðÊ'âÝdŽãþ„à¹êø~:ŸªgFÔ‡ŽjžSÎóʳ_t´Ÿ²HF,_v¥„ég‰3ýDˉ÷RµO½²v:“5ÅŸscù¯eA¾Æìb, åý"‚… é+¥Ä2£~•Óµ=«ð¶Rœu\XÝDݸú8ü]˜ÉêÑé&fä²½ Ù-Âð…h\`Á2bf2°»5˜cÆB€._#ÉÖ>Â`+´ÛWªq¡@׿‘dËdÎKôÖV|MãÏ­LÎtŒ4V|S^̉kÄX=ÜFfš8ö_¥@jNn> htáÁ]ÓÓØå7÷›éN·wn›î15Ð*âP¢PÌÿˆö„‹,?n’ly“½¦ÜòDX<†Îsàúz¨Fç!½¯>¾ôó ½Në|, h²õPƒó´–dûº!ÙØV(W:žKeY@Í=•ès årJ¼ë¡¼líy h,VܸÖ0Û˜ÆJáÕV|åáëLuUëûÅ‹Šs亚D\çn·>Ú‹cÂí£×qÂñçÆÚí{šöm¥Ä Fò*Gt½l*¬Œ˜‡À"éX¢•².˜aìÕG€$[ÕÍ©“ÅO”Á)˜k«‘dËdÎKô£Da½†¥Á­L±ÒQ hRñ‘ޱ+ÍDÂa•Æ=‡kÙ|Í›óP~5JT7²nKÕ­fEýb,Fq+ÿMmý€Ä¬ X\pí*_6=:Ü7¿Æú©^à‹›$[Þd¯)·<“ ÃH\ðBùc=Ð#€^´¹Rd"’7×*FÍ«¬¶è£‡!Ùz`3Rٞʕ­m…r¦ó¹d¯·}ÛËg@:ØÚËj¶Ý,~8†öÄ}ª”O5üëù ”*Ç«å=Ñóë>¬žÊ•K_‡¸®ñî2×q¸j#Ñršw’r=ŠÛ;Š´ÑË Kl,AïfðÀ;3á8Eùƒ fœÁŒ7˜Éï)<×qÏÚÏ;ˆÑ[ìÇ‚°w (¦ôÁ e.6/<ºBñ‡)) 8)ÿ­ª/A÷2”2üBùÄ´8Ê¡\O¥cºÂÔ¨n]4õu“Ö"ª//ÝD1Åfü᥅]“jîKË€sSã\71áPžà5XFp 7›]ð0C7ÚÓBAÔhf=åº'¿SŒ;Àõå®_tè‚Âá&袄(¸Ô”×yŽ 7õ0 ¨°åŒª÷•uIÿ*+«þM¥L® Ç D]qí@ŵåöâÀÔH-Z´ˆšÎ*N²ž2×±¹†œÙÛÈy̾nGˆ²Èˆ}º/{(g8†ºcz"»à>RZ„n°X’lyM½ÌµãLׄ›kÊy<Ù}5€A¿üàzW71¬0…þÜ/<>Òì ¨)¯ónê)æÜºXq=⃒mm…2%û\Â9Ɉ×ÏÓ¶©²Uãnä<WÜ;ªg.êÇÜÄtã£ß A?žƒo½õ–îºVó®êlœ[&ïDËižEjfQ#ØÍé)ýªPÚSÕáýK`(A¾jŒˆ`º(;ìbî%óþ³ ÂvA*‘L °àËʾâÓ)Pª `*§ãp²x ã†ÿ”+ä Ë!§ç½Dyà+Š»Q>q²Q´ð¥•.AÞýúõÓÊ ”_X‚Œ@ÅÍ€æ?S®æVÞ ¸ÃGÆø´†ª Ô b÷1Ä—ÄÓ;ýƒBŽêl¾NqÃâëÆ7ŠQXá[Åu‚…ÓMpCCT÷’þÅ1™zàÅ ò†EÉ)Æ„—1$•29ÓLd_è7åŠêiÊ”Hz^ÆQ]c:ùXagÅ* ®ÄuûÜ}ø]ã8|v‚¹ø ´ãÞÇË4–$[Þd¯©Xù&Žù:!ñæ/Vî ®œÀFM+£Ï‡"‹}Ì I¶¦·íbÿÃ3.[Û õLö¹„s’¯Ÿåe«.xw™ {ãC¯÷؃õ6z÷œ‚÷•¡®ƒÍµæŒ“È>Œ7 ,¬xGÁbˆçrãÒ=BjäºkÒ‰–ÓÜû¦ÎÎÄÞ›cP–`No¼ûñ^SƒtcF‡‚ …ïA7K©ù0P3½ÄL#§¨Î;1Ó5اœ0ŒOZ*> ñfæWTL’ú¾§ð-Áœ Êúj­X±Bûv¨‹'b!DÆÜ†êK]‡ß‰]Êãj|ûb­|MùsCª‰ôuyà;j,§©¦U2>B8޹ó0UÊoŸ «ßÿOøîðAZê¡b‚õ¯z8†WbÂFÌHy¬V¤,&XÿÂ?l1E“RªÃÇ’­f.@:o¯Ÿzp„çÊÃuFR)“zð멎0›@"b–pÃÎz¶ð/‚PL=ä&Æ_ÍÍ«Æ$"êÃA3róEÛáš‚–ú‰H÷‹™¦SžÙ~Řj£jË’D|@1ZíˆéŸâI*åMöšrË?C{|ø[¢n+sÙãÅÚŽåŠøé¨G¬|M¸ßm•ìsÉ”Ûþ‹ûmËo2•g€=}l'z=ØÏK„­=>¶(ꃩ‡Ô}8 VÃ<“ÕÇv8ÜøVâž6S™ƒ¸‘f±K²Ï8LÁ†t0Uœ›`WNú×ÍG2Ùrâݤ¬‘:=çûóîš±˜1Áv(£úXÓS/)å<â4Ì´içì³ÏŽ8fvÀÇݦ2qrù_y'f hL§ã”ò( H iâ‚2…IÞñbÇÍ¡¬u:Ü8é#®X£¬Ú!Sá`º ,™§ºõ‹[YE#LÊØ”õg˜ÿ<4Üo”‚éŽP~ă`D}‰…•b0 ªV{ÒƒaÔW¿ë+ÃsŽ5ʼšæŠ©)œbÖ¢G¡H©‘Ü$ÔeÂCÉ.x(ÀùÇ0ýÖÇ %5Ó€®+Òq~$[8µ›‡Ö W~¼zú#(ñÈW­*e/’^ö0Ù2AÙGZ·vD¶(ÂfUÔŠƒrŸÐƒ¥ŽZI—§ø­€¢ æšRÖ~KYàõµƒNæ¥È9qµqÎ/k*1¤ŸÈ‹×¼Í$Õ8/–$[Þd¯)·|U8Ì">ØR‘x h:êQV™ün+”/Ùç’³Ne) ©<—œy$z=ØÏK„­=>¶Š7xŽã‡/ø€5Fç=c;Ü£8 7ÞÊ:¨ŸcPÌad±K²Ï8Ï~ ò´ä›t1èÏ;üaЩSR)'ÞæÙ…ÓÚað­y`)[gÝœùš}°5J(ʨ,¢š/¦VÂ;Â,Pƒç¾[šx&â~‡Çù|4yäúo^* °ôá‚€2ç”ò* H/;³*„¹A TBy± ¾0Íz±&.8Ìɇ‡n„c\#F5ñËú…©|`“΢IÏí×ÌÑ ¥Ù>™=&¯‡bÅÎä ELM©ã–ŒÃh}£@â(ÁXÀž®ýdŒŠ7«p˜<”¿^Én4ç`¾UXe¡Ü˜øøÅ`çdÛæœd벪)8Â+!}Ì‘éöƒ<’-“yØ&ª€"(–xÀâ¡fê ¶jš’ðŠ-&ŽûeE X/&SVüâ# uǃÚ)æ%.T ØÑyÇ›ïÖ^†dË›ì5eÏ Û‰(ª«N×Ï–T%žŠ4Ë[²Ê•ˆ’äu[¡ŒÉ>—ìõ*KEÜdŸöô±Èõà<'¶ÎsŒ ÃÞ0h˜{Tu kÌyŽQìð‰g¹Q¤ðŒAOÞ¯NIö‡ž\«æ]ã6ç±™¹Êœ›¤RN¤ƒž((â&oð@q]âþHV0€roÓ–PÃi«e·µÅnu¶§ ¥ñÁ8¨’— (Óà"@—›‚‹ &v5g˜E3žÀšÉ¢±’›’ï\?Ž¡ 7ºÖcÝ<ör¡NXÉuD×u"‚—-º0uO"LP¬æƒtý l‰H2eRƒÐôK'‘tíq [姪ÝìDzq«ƒàžÀõàì’ By“½¦²±Î(S.Ö#ÙkËÜ;É<—’m¯džɦíU|Ü›x–ÆzîÅ=Z¸©™_¢&¥w–/•gÒF/”Û³“¸CAsöB™|S-§9.B¨R§«“‰“Ì/x.R:®7Ü_e –:…Ž¢û•5gç­Š•‰07¢Yß:g[Ïyð=‚Â>ÇiÎWŠ $§b—H%½xÆ¡— =_j6×"¤RNׄ|D(,ÊΟ|(ЧYæÝ(xõŤÓ ©µÂõj@ª±M0I ã°:®Gû*Y/3$ ¤ë‡öjž`Î`ÌN¢ïè™M<*¶oÉb& ˆrsð­ ™È8oPÀU_H°ëe3›y€,dž¹ì0… …H€‚F ]Ï8åw/j‚^ŠÓÑ©ÅAC¥§‡„â©îŠò÷\ýìª`ßÉ·mÌe§™õÊ*ÊW'j]Û|ãÁúúCsÁRH€H `.U,‚€yw•t=ã0w5VÂ|Ðè1²¯¾ç,K*åt¦áǾL&jªHQ³ ø‘}Fó ¡ƒ?£923    ¼&×]ðyÝò¬< øD€ ¨Oà™- ä+* ùÚò¬7 øD€ ¨Oà™- ä+* ùÚò¬7 øD ¯¦aRË`‰Z>Ò'Ô»²UËq‰Z³[ÿùZ2Ç„ øSˇyº¿Išº±íüm‡Trχ¶\›A“ ·]¶¼0·fº¦J Ú5ÈúxG ¯Ð)S¦ˆZƒU¯:ãÒø)¯_¿^Ô R¹råøsð¨ZnM¶oß.µjÕÊÁÒÇ/2^„h»ªU«JQQQüÈ9xT­{,j½eÁܸAÔ ÷}µjÕù’UëTkåõ š`~f¬T§–% ä‡í† ô5éç"&L¿ýíoznÏ ]?¬OvÈ+MÉsÕºÛ¾µŠZ·V¿ƒø¢ÇK/‹ÆûÆ×«Œa©X¾|¹V®¡„MÖ­['xÙ7hÐ hUÓõZµj•~Áâã/h²zõj­œÅ›”;WëŒÚµk×êa sµ1˽bÅ mŒ€‚í—|ýõ×~eÍ|óœ@ðúJó¼AY}   ÈvT@³½…X>   * kPV‡H€H€H€²Ðlo!–H€H€H€F€ hÀ”Õ!   l'@4Û[ˆå#   €ðUÅœ‘ñs/–%‰Ä)+ '   ÈßÐÉ“'ˉ'žèZÓ·ß~[.»ì29öØceèСòÍ7ßDÅK$NÔI    ð€/ èÔ©Såž{îÑË6: |÷Ýw2vìXéÖ­›<öØcÒ¦M¹öÚkeþüùá¨‰Ä Gæ @VȨŠ%ãn¹å=z´4iÒÄÄÝwß­•Ï>}úHË–-åꫯ–¦M›ÊøñãÃñ‰ŽÌ     ¬"QtÞ¼yòý÷ßËí·ß.½{÷ÖëÛi`Y²ß~ûM/—i?üðÃå‹/¾ÐA‰Ä±ŸËm    ì"ѵà[·n-/½ô’É+¯¼EbÙ²e:̹u½zõkUc=îDâìÒ«1@ k“)))Ñi ?åò» ^Ôß  bÝLØv^\9Þ¦™mÔëÒ´~C¡·Š©£Ýün;äO!?dT­^½zÜ:e±fÍšñjÔ¨¡¶õëׇÊxqêÔ©£Ïÿý÷ßå裧եKÙsÏ=eùòåá0?6POSW?ò÷:O¿ùzY¿ 6þ‚*An»µk×µÙt½‚Üv«V­ lÛmÙ²Eðç—lݺկ¬™ožȨZëÂÂBÅX0M|³_\\,‰Ä1çA½óÎ;̞ͮ=[ªU«&µjÕ ‡ezÊ ,À•+WÎtÖžç·mÛ6ÁÔZ~òõª’° íªT©¢ÛÏ«|üJ/@ôàc/h‚zÁÿ÷~… YõÈK jÔ ÖAÔ/h²sçN­œáº4ï ÕÏ”Š+êçŠ_õÂûˆB~Ȫ§qݺu5ƒ7F°0ûU«V•D☓ÿÔSO5»²råJ­ø!Ü/1?ËàUÝñ¢ß±c‡±nè4A¬Ú Jvë%JZ¥J•ôŸW׿_é‚å,ˆm‡Z|áÃÏüâìE¾¸.¡€úÙvAü(ó¢­˜fú dtRYŇ¯'dÍš5Q±/`|á''âdî d¬S@›5kñnHaü w¡€–ÇœÇ_    ì#U (ü˜N;í4Á*GŸ}ö™ö'7nœ,X°@.¾øbM/‘8Ù‡™%"   0²Ê…êÕ«—,Y²DFŽ©E4oÞ\†.{챇)sBq‘¹A$@$@$@$U|S@ûöí+øs ¢¯¸â ¹è¢‹ôÜŸ5rFÑ#YËŠuH€H€H€H€²‚@VuÁÛ‰`Ī›ò™l{|n“ øO kPÿѰ$@$@$@$@^ êU¦I$@$@$@$“Иhx€H€H€H€HÀ T@½ Ê4I€H€H€H€b   xA€ ¨T™& @LT@c¢á    /Põ‚*Ó$   ˆI€ hL4<@$@$@$@$à* ^Peš$@$@$@$@1 P‰†H€H€H€H€¼ @Ô ªL“H€H€H€H &* 1Ñ𠀨€zA•i’ Ä$@4&    ð‚P/¨2M    ˜¨€ÆDÃ$@$@$@$@^ êU¦I$@$@$@$“Иhx€H€H€H€HÀ T@½ Ê4I€H€H€H€b   xA€ ¨T™& @LT@c¢á    /Põ‚*Ó$   ˆI€ hL4<@$@$@$@$à* ^Peš$@$@$@$@1 P‰†H€H€H€H€¼ @Ô ªL“H€H€H€H & 1ð€eY²sçNÙ±c‡¯µ+))ñ½ ^@½ ~óõ¢n¸v ÅÅŬ_ii© ŽAl;´™i»P(¤·ƒôm rÛ¡n………Aj6]Üs~¿Ìs;ppY¡¬'W (Z èöíÛ}k–Áë:ûÉ×ëºmܸQðT rÛÙ?FƒØ~An»Õ«W±ÉtÐÓ‡?¿Äϼýª3óÍY«€NŸ>]6mÚ$'žxb)(ž—_~¹4kÖLÚµk§õêÕK.½ôRí+ +h¥J•txݺuå¾ûî ŸÿÍ7ßh?R vòS*T(¿ËàEý·mÛ&ø bÝ`%€5ƒÞŠŠŠ¼Àçkš[Ôü´°29?ö|-Tš2G½ðÑò ²ö‘—rmñœ„/Y9 _…_~ùe”õÕ†… ƒœÝf:&ŽŠOßÅÁ”H€H€H€HÀ Y©€ÂÇÝfö‘ï¦ò°b)¹f„ÒC©ˆf?³!  È"T@3ЖšVªäÀCE¾Ÿ-˜ (¤&ÙÇ´E%‡#–Ú‚XŸªÑïj|hëV)yäñÀÔ+mÃ: @¶ š)½äJ÷\~úI¬©Ÿ¸Ë¡ÐÒñµ2]ðÕ7RëÁ[—_-%u‹¥”Q 8 Puñ`ßúaŽ{ªPÐ~üÉýXŽ„Zó~‘Ò3ÏÖ¥Ý5ý¼ÚTJ¨lÝ&¥J¥ €“P'/öëÕsOµ PÔ’OîÇr$Ôšñ¥¨ÉX£K»s§X~žc!ÖŸJq“æRÚ¤…ÔÛ¯£TlÑz×þ“OçXMX\  ÈT@3Ð#®qÏeóf x‚û±\ --]Ò ²ªVMBç9÷l)Pí[vÖû¡¶ûÅ®7 Ä%Ó+!Å­Y,8ót±6lkèÅb©µì¥R% 5ÛC ?ûXBÕ«gQI“/J¨ëÁ"nJ¨ªgèØ£“O0ËÎ)ënám·HɆ bÝ}¿”öî%EœŸe¥dqH€H€H ·Ðš¡ö*2X ×ü!–R8KÎ:S g-¡X]ó*S:² µn%ÏïêŽO*U­ªH­šRðè¿Ó‘Ó   Z@3Ø ¡:uD*V«Q# e0go³*8µ·„>ýPv\y­|7K þy§ >WBü¾ñ–úiïƒÒeëöl,ËD$@$@%pC£ºríœÙR×£1 ;vìúõëË>ûì#3gÎŒªÛyç'Ï<óŒ¼ùæ›Ò³gϨãÙ0iÒ$éÝ»·¶€žqÆå.ÒŠ+¤M›6:t½7kÖ,*ÍeË–IË–-åàƒ–>ú(êxòËÚ°„î#ªQý’â3û«®êã¥HùHMv<ÿ‚¼þ?©ðê®n– Õ¯Tu!ÉégIÉeä¢j¿ ÉæM›¤XYçñ54)Q #lP³TW3T¬X1hÕ“ªnèÒDý‚&;•ò²I]›¸. ռɓõª7¬¢Pµª¸é“„^zQ­^F$í¥Ø¾}»lU‹®Æh¿n¸AöÞ{o©çP€üñG¹÷Þ{å'µb 6X»uë&×\s)fï¿ÿ^n¾ùfùç?ÿ©Ø7ÞxCÖ+‹9âÝrË-º›¿|ðÎcÀ€rÒI'IÁ_ãF¥­®'Ÿ|²ÜyçòÃ?h…ï´ÓNKH~ë­·äé§ŸÖç¡Ëü裖#F„Ë æsÏ=§-ÿþ÷¿]•Oœ×´iSAùÖªž 0„u®·Ýv›ÜqÇúõGY«ê³Ï>+¿üò‹>ÿ¨£ŽÒåA×¾‘áÇËNÕÛõÀ˜ ýûè£ \^zé%—a{ûí·Ë«¯¾*¨k… 4—ÁƒK#5–¥Ü h¾ˆ2s[_~ù¥¯ÕÝ^·±µåºÑ¾–Á«Ì·Üp³µ½F}¯’÷5Ýâõë­RÉÚúØ“¾–ëÌÕCÎRy¯’÷5]eQž7¿[Ê·Ê×rx•ùªU«,ÕmçUò¾¦«ÝvÅÅž–ë̗/_n)…É«äJwäÈ‘ÖêÕ«Š›j¤ãŽ;=­ÖÀ­O?ýÔR Pܤ&Ožl)…ËÚk¯½¬ .¸ÀRÝö–²ê4”>wÊ”):ìˆ#ް”h)ÅÈj×®ëׯŸu衇Z7¶”Ÿ¥ÕºukþÐC…ÏÇq5¨ÈRƒ},ÕnÝ}÷Ý–h¤ãM˜0!O)¶:L)xá°o¼Q‡)wëÊ+¯Ôy+ÅØR>­–òy ÇsÛ8äCô¹sçÎu;3L)ú<”yí¶ÛnÖÙgŸ­ã_|ñÅúê¤R]¥ô[ÊÒª¼sÖ†ÓDùöÛo¿ð¾Ùg´ÑæÍ›ua«ŠiFJñµþþ÷¿[ÕªU³ºté’–ç)¾òF¨€zÛÔT@½åëeêT@½¤ëmÚT@½åëeêù¢€BÁ5Š”eѶ”ÕѺÿþû-5' ±oÕ®]ÛZ¹reø˜-®•Pe…³° 1J”O|dÒ„| œee€ò¤|-M4­ "ÞM7ÝÃÇæêÕ«[ª\‡;ÐY³fYPîŽ?þxKY'Ãç¾ýöÛ:_{zჶ (­(KII‰-´ìM£€B©þóÏ?õ PM¾P´ |ýõ×uy œIVEYq™:uªN󪫮2A)ÿÏ«[]M”̰~™/¥SÞ—ÐÂEzxlãB$@$@uëÖÕ~Œÿûßÿô¨o¥\ ¶•åPw?þøãžþy™6mšö5àf¢¬{¢Dí–aÂñ{æ™g ºÀ`º$ˆR¼t·1¶Q†jê'øVÚ¥†r]Q–½p\°×éÓ§‡ÃíèvWÊ£(%,¢»ƒ†à*€.öx‚nuøÅòÈ#2gÎùù矵¿'|A!PBí¢ºêí»?J»(«¦š„f=HZµj僻ï¾ûê8˜³ÔmÐ|,!ð/ýÇ?þ¡·Í?ø›# ¾2¾ªæ˜ùUL=ê#Þ¡%b#Êò¨çL…Âj N² üdUw|„ÂnŽwèÐA+óP¼/Ö@6Ãñĩԛ¸±ø`} f¢jHñ×!Õ• >½ô’¥›7KH}ÝQH€H€Hà‹/¾K/½T[ú D:Ö@5@(<;¬~ˆEs`¢«Úºí!P~Ò%fx{z¿þú«ÞuS0q£öÑ=¥Ó$ÙÊ ”6{W¸ý8¶û÷ï¯Gícäù1Çs†çy±öa+¸8Í…jÎqt׃3VV”Ñ)¦ÎÎðX|gyWj*pfÆ}   H^½zédÔÀÝíîLŠÜìÙ³ÃÓaú(˜j P„ò©…çe­s¦È>\ÔÈüˆ¨O=õ”V ÿö·¿E„›#Ê‹+¦`² Ü0¿ª±ÊâXµ$8X¢ûß”~¸¸‰³ŽX0ÓZ9o·sË c|Y„xœH€H€H %XÛ|ìØ±rÝu×é.kø€B!RC§µÒƒ®w5’îŽGèrÇœ—è~îܹ³>ØÃßRøÖe@¸„“R¡'a“‘¯'~å•WäÉ'ŸÌéôµ4§ 4HÔtN:è@ÉÆúö˜·Š æ÷Œ'p À@&0€‚%ƒ…°"ü\1ß'Ö‡G7–Å*Iñ«KÁš Ë1üOaU…僩`#˜ìó}¢ÎpP³hÈ}÷ÝÓ]Ê&– ½è¢‹D¼×ó°bÀæ^-¯P-/AžO$@$@$“Àµ×^«WþÁ²›X÷ÝXö0Ê”'3vÊ ”@(„ð…u>j¾Rï$FšC9C·}:Êï¹çž«ÿàói&€¿þúëc&Џ1cÆhå‘1ŠeÛ¶mcžk ¬…¸°¸bxüAÀJ¤šk4!K#|M1kQL„ 1”xX)1B~ÿý÷7ÙjEƒºžxâ ]øpâ<¬Æ¿[§àî(#ºï;ì0yðÁÓò_Kqª©ð奿s2ÎØþŽzM¤ä‚!RåŽ[3–g¦2‚_ ¾P¯I¦òõ:5Ñ›”¼ Vw:ÿB)9½=x„lS~x&ÒÇW3¾¶ÍK yf*Ô _ùxÙá¡4Qóê)Xе45 #€aerú¶¡®°vaHy}éÊëè`u!ûhìò¤WÖ¹°ú¡Û>’ˆOpßb:$(‰ñ|*ã¥ï”)tGÃZåsñâÅzT|¼sœÇð|™?¾„î÷T¯SÔ#Õñ †"›ª è¾ÇÌf’[Z¸·Ð°òšAWöxð7tëCA\§ÎPös’ݦ4YbŒŸwJöQ_kvMƒQðÆ$)™0Q çý ¡V-óŽ+L$@å!EÒ9mR¬ô0É>)V¼t„ããS2%+PÞ̺îÉžkŸ®º¢j¥#{Ò®ÛPN“)·Ûzõ® 'ÈAHIÀbÔü#P|bo‘ÅKD Ô•íÜ5ÿ\É!GŠ¥æ{£ $O ¯, 0ýcrØXs{%/ù3°FFøùY†äKØf$_êV0ýsQ~*Q´ã³/Dºí !ÇÐv¸?‚Ôv¦ ̈Yt•Qð< jÛ™6Ãu™j×f6·9Ú ÷žŸ÷yng3'¯ÊÖµkW %š,²°”ÊäõÑ©¹‡ä• ¸ÙÌC͉·¡E*y ^ÒeÚ9O ð…ÿìR>Õ Þ.ã^™K!  Hž@ä[5ùóyF‚Jú PSøô“ÐÆMRøÚz»ô™ÈU LŠÑ2H ¤æF+\û§Èyu®¥û·“‚÷&KÁ§e°ÌŠH€H€‚E€ h¦ÚsµZöJýíì¤V€¨_Oo«~ÁLåÎ|ÊA ¤&AÝs—N¡ôÒ‹¥à¸cË‘O%  È+P?›»pÊ[:û j)+ø3UªQÃÏâ0o   ð- ¾¡gÆ$@$@$@$Ÿ¨€æg»³Ö$@$@$@$àvÁû†ž“ €€¥æèVsn‰òQKiÝ÷Ÿ~úI¦M›Ë~{ì.¿ý¹sç Ö8Çúò;v”ã?>">æDýî»ïdêÔ©Ò¨Q#9ᄤN:q¸“>´€¦%S"  H‚€¥”¾’¡KIíFRÒ¤¹”Ôm,ÖŒ/“HaWÔO>ùDn¿ývùöÛo#þ-Z¤#LžvÊ)§hk*•OÐH¿PM?S¦H$@$@$Pëçy"µk¹ÇZô«{xœPt›·mÛ6âϬg~ï½÷ ”ÐC=Tš6m*ƒ ’yóTþJ°œíìÙ³eß}÷J½¶ššâ vÁ{Õ©’ Ä#Р¾H(†¬fÍxgºëܹ³<þøãÇš4i¢÷1ÿ6Ž¡+þ³Ï>“ñãÇK×®]åÓO?•víÚIM•ßÊ•+e÷Ýw8Ÿ;ÞˆÑòÞeÈ”I€H€H€H tØ¡"͔ EÁÝzSTXYÕ«Wׇ0xÈüÕP‹¾lÛ¶MŽ;î8Ù¼y³ÉQG%=ôœzꩺëévêÔIf̘‘ÅêÕ«¥C‡Ú74âwÒB€ hZ02   d„*V”Â/ÔÔIJ©REËTת%¡[n”ÂAç&“Tܸðáܱc‡\sÍ5jì]K`cÀÑ矮§cÂÉ„4zôè° å#å1°‰VѸxS>È.ø”ÑñD   ò)å°pû‘y¿ˆ¬]+²Ok ÕSŠh ψ3÷Þ{oíë9aÂ8p 4lØPw·ïܹSFŽ)Ý»ïiÄGÈ< Æ “+VHqq±ôìÙSÆŽ‘wÒG€ húX2%   $ „ 4¶‰”L2^x¡à/–4hÐ@Þzë-)QÞÃ׳qãÆQQ1/(þ6lØ æÃ¯¥ÌFÀ€r Z.|<™H€H€H WÀBê¦|ÚËIï ÐÔ{ÆÌH€H€H€HÀF€ ¨ 7I€H€H€H€¼'@Ô{ÆÌH€H€H€HÀF€ ¨ 7I€H€H€H€¼'ÀAHÞ3f9LÀÚºU¬‰¯ ~!¡_JiµªêÒYBjº @ò¨€&ÏŒgä5k¤tÀàp Ÿ~VJÕ_ÁýwS Sá $G€ hr¼;ßì¶›®ýSJKKe劕zã*UÕŠU«æ Ö—H€H€ÒF ®jY–à/ ©µ\ñG! Ð×tíÚR ¨µ}û®eâ¨|©‰Y  Ä„tðÁë•0qkY}ûöõ¡øÌ’H€H€H€H ×ĵ€žþùÒ£G„êÔ¶mÛ„â1 @~ˆ«€^pÁùM‡µ'   H;¸]ð&·o¾ùFðgä×_•+¯¼RŽ8â¹á†dùòåæI€H€H€H€H .¸ (FþöêÕK:wî,¯½öšNhóæÍrÒI'ÉSO=%5jÔGyDïoýkžÄ¸¹yp0ÑARdÍ$I€H€H€²€À?ü ãÇ*É‹/¾(kÔtz^ËóÏ?/Ð(‰ˆ«€ÞsÏ=2eʹóÎ;åïÿ»Na?þø£üïÿ“7ß|S¾úê+™7ožüë_ÿJ<×81¡Èöïß_Î>û숿»îº+⬷ß~[.»ì29öØceèСÚˆˆÜ!  ÈJ˜h窫DêÔ©VMd=D¾ÿ>ù¢¾ÿþûræ™gjÝÄ~öˆ#dÙ²eö O¶¯¹æšŒ(ºžÞ§Dã* ï¼óŽVðЀ°vBÞxã 9蠃䨣ŽÒû-Z´Ð•f̘¡÷ËûoáÂ…²xñb9äCtÞP0ñwÀ„“þî»ïdìØ±Ò­[7yì±Ç¤M›6ríµ×ÊüùóÃq¸A$@$@$ÝÔk\|PdÝ:‘-[D–.éÐAäã“/w³fÍä /”µkׯ‰$@$@$@YC`Α©SE-ô]¤¿:]£Ä Q :Ëå—_îëú믗víÚi%µU«VòóÏ?ëx0²ÁÐÈ AƒdâĉÃÒìØ±£`ZJ(¤§œrŠœp ‹çÊ\;yòds“$W­­&à¶›®?øà½"Œ])E~sçÎ4f:VL(•˜ÜÍ¿sÅŠòÛo¿éPöü?üpùâ‹/ìAÜ&  ÈRÊ›O”šá*醮Çâ>¨Ì©ÐUÐ[k—•+WÊ /¼ õ‡iÓ¦ÉèÑ£åÑGµGq݆oé矮] ¡ëÔªUK»üÁ=qÔ¨QòÜsϹžÇÀ² Ć ÝÞ€ St¥J•N¶õêÕÓÝã&i(ƒŸ|ò‰òáPNiX@1éýwÜ¡¾Œ¦*Ÿjrúé§K¿~ý´Rjâ Dä†r­S6| œ*(Ø¥W—””DŒÐG=†??eô» ^Ôß|0±nh3Û΋+ÇÛ4ó¡ípïù¾ bÝpÕ£Ýü~¦˜ç¶·w¡{êxÿõºŽŠð—×_TxYu”3)\ó0$ SF0º¨¨H[?†C°pÞ{ï½&Šëï^{í¥{Xqpÿý÷×ãa0½ÁPLáHI@\ô¦›nÒþž°nÖ¯__¾ýö[yøá‡¥bÅŠÚýÊ+¯èJP1(¾íÛ·—aÆió6òܱc‡ 80<ʬfÍšÙÁG7òúõë•3³òfVòçŸÊÑGŽ×¥Km©…ÕOÙ¢]ðTñ›¯—\áód¿Ÿ ·>Pƒ,An;øàUà{h÷?Ìt=ýÌ»kW‘&MDùlB¬¹ê-OYN>ùdí*ˆÊF h£wõ¢‹.2Aá_ô¸:}BÍÁêÕ«›Mùè£ô éáÇëAÐPp1 ›’¸ (V7Â@$|MÀòh¾*½sÎ9G+Š0uï¶Ûn©•Àv.ønÀ‘~Lu饗j37¬ °ŽBŒ•SïØöí¬¢v¿|í@Q5 ª97“¿x š ?×  d°2Ãu#h‚‡Ú®ªZí45V&ç‡]ê‰za ^$øxšàƒ/Pû‹2(u„á×&º=Ïü ÔïQ\“x®ø%~>Ïð(Åøeèx_¹²(EP”’(jHùˆ<ðÀZ0ó”ŸvÚiºÛ}Ï=÷”Fé]è.&LÐ=»sઆ+Ì{>xðà¨Àâ‰AÑwƒ×˜1c´1.*""WE ‡v˜þs¦ånÑ¢EÒB‚O—T¨PAzö앜€gÍš%K–,‘ºuëêãN+”Ù·ßÈ•ÕÕl·€Â¿&x„û)¨§ßeð¢þpІĺ™n\¼,‚X¿mÛ¶éjë†ë‚{ßÏ—­÷Ò„‚å,ˆmgê‡v3Ư8ú‘.>Œü~øÍŠ'nQL½C7lO°Š–WLW<¬¡ôâBqlݺµþ÷'Ÿ|RCïj÷îÝe¿ýöÓr]ašuÝ0 ‹ðà]wÔQGéÁJ.Q”2ÐXià‹;Ê'òÁKp©šƒ#ÚíB£T"O(¾çIJ؇uî   Ü  tAéÔ©|eÅêŒNÁ¢9vWŒ‚Ç”0XÙ{Báç *9Ç—Ìœ93œ,F½ýõ×zZ&à“˜9ʃìæ]£uâ$úá‡êi øuRWF‘y%P>aöÆôvÁ`$(¤»ï¾»V@ÑEïñŽ}û\¡öó¹M$@$@$@°|Ú•O;§òi?f߆>å“R>qP¬r„ù71Wº²1â}À€áe9Ë—uôÙ{ï½·ì»ï¾z>OøkbÞÑgŸ}V¾üòK9묳t÷¾X é³Ï>ÓfðqãÆéyH/¾øâèDB$@$@$@$UâvÁ?óÌ3Ò¸qc=ã?¾àó…ÁŸzê©i¯”ËÛn»M¬Ç(3,ŸðÏ8÷ÜsÃùa`üAGŽ©N`"|ćyœB$@$@$@$Ýâ* ¿üò‹ñeÌÕp‡õJ¢W‚Ñi÷ÝwŸöÑÀAŒ®wŽ~„ ýŠ+®ÐÓ)`d2Ρ ä¸ (uÓ²ÀGζìT ÓYe (Â_Á;ö1!ëÍ7ߌM Ä$WíСƒ^=KÙÁä«XɆcf¥¿$@$@$@$@$àF ®úøã»Ã0    H™}@SFÇI€H€H€H€R!@4j<‡H€H€H€H eT@SFÇI€H€H€H€R!@4j<‡H€H€H kÌš5K0neéÒ¥eÂé'Ÿ|R¾øâ‹ˆðòîLŸ>]fÏž]Þdòú|* yÝü¬< øKà–—FËžCKƒþÕ¥ËUídþ¿$] wß}W/Ïí<ýÉ'ŸÈСCeüøñI§ï„_|Q¦L™/ •A€ h€x˜H€H€HÀýÆž*÷¼v§¬\¿B¶îØ"s—þ(\¾|ñógIgxÐAɸqã"Î{ùå—SJY½zuÄ´‘fns_»v­|ÿý÷‚eȲxñbY¿~½38¼¿mÛ6ùá‡dÆ á0nÄ'@4>%  ð€ÀOK~”É3ßR«4*õ럽&*¬¬€víÚI… Â]ãÅÅÅòÑGI÷îÝç¶iÓF–-[¦÷1ŸyÆ ñ`Ñìܹ³Üxã‚8؇@¡ìÚµ«œ|òÉÒ­[7¹òÊ+u¸ý߇~(-Z´ÐÇš7o.O?ý´ý0·c  ƒI€H€H€¼#kgíjµ]3øyÙ\×ð²ûöí¶‚¾ÿþûrä‘GêuÊ:JãØ±cåõ×_—7ÞxC[CqÎèÑ£e¿ýöø˜Î˜1CæÎ+¿ÿþ{DrcÆŒ‘^xAŽßu×]bYVDîD Í„!$@$@$@¨S½®„BîjHµJÕRÊ ¨ñ÷D÷ûYg•P:ƒ üüñZÑìß¿¿>ïË/¿”^½zéíŠ+Ê;ï¼#»í¶[8Mtáúé§òÜsÏéóGŒ¡•×tz g  ÷–PY   ì#pð>‡H½õ\ véIÑ]Ý®­[·–*UªÈÌ™3µ" ¨]B¡îrG˜Ý×sÀ€?ϳÏ>[&Nœ(‡~¸>­~ýú²sçÎp¿ýö›lÚ´)¼¢¢"2dˆuÑEɤI“¤U«Vq¸M€ h4† xL rQe™zÇ—:—j•« ,¢5«Ö”¡Ç“+z O9wXA‡ &=zô‚‚H5§nݺ2gÎö[o½ÎãÔSOÕS5 8POÛ´hÑ"­xžvÚiòÚk¯ üE·oß.Gu”¬X±"|^ƒ ƒŸ ˜|ðÁÒ¬Y3›øs|¨º ”Ò²„ÊgY„"SäÁ=È+={îªîÌ™ðo*”+®È«ê³²$@$@>ˆôÎõ©Ì–H€H€H€H PÍŸ¶fMI€H€H€H +PÍŠf`!H€H€H€H PÍŸ¶fMI€H€H€H +PÍŠf`!H€H€H€H PÍŸ¶fMI€H€H€H +PÍŠf`!H€H€H€H PÍŸ¶fMI€H€H€H +äÕDôXuKpmß¾ÝWøÅÅž—Á %%%:Y¿ùzQ7³bmÐÚN]Šríµ…òÚkÕ5’ÓN+‘gž)VKVzAÑŸ4Ñf,ÉDÁ2±¸>ƒxß™6CÝâ-˜«íŠvÃsÓ϶3Ïí\eÈrç.¼R@ÑL¸ÙÌ É¯fà Ãï2xQwó" bÝŒš ×O:Û®}û*²xqH]!ìë¯Èĉ•TØfµ6t:sò/-ó‚Åo(´«žþ•&ý9›k3ˆ÷½íL=ÓOпQ'¿ßÈŸB~È+/Ÿ*UªHµjÕü`­óܸq£^ƒÖÏ2xUy<È`ajÝÐv•”i°jÕª^!Ìhº&ˆüú«¨àÿg[ZR×§ÈÃW“;îøÿð\Þ‚móæÍR¹reÝ~¹\·²oÛ¶M yß¡n[·nÕ÷\- ¸.+V¬èkÛ! øA ¯P?3OÈV_|©|šrªoùðC³Ç_ ÈnøÈ|æ™g\ Ù¦M­äãô€pÃ@Põ‡;s%ß 4n,Ú×ÓÍ%ºIß‹Wî,^,òÔSp»)-[ª«ÞB© žxýû‹´n]îä™ @šŒ3F{ì1Y¿~½´k×N^yåiÚ´i©ÃUãÛo¿Õñ«ÿ õu}æ™gêýêÕ«ËÊ•+¥V­ZT@&š™ˆT@3Ù¹@ÖèÝ[äºëÜ‹5dˆ{x.…þñ‡È#ˆòo- ªK¢,!"‡J4—Ú‘e 6{î¹Gn¸áí ‹šNŸ>]vß}wùꫯ¤sçÎ UÖÍGp³+yë­·déÒ¥á}„ÁÕÁîÿ½hÑ"í.¶÷Þ{«ÒÿWƒœáÆ}§víÚHFÀ±š5kê}øð.\¸P»Õí±Ç: ÿpÞܹs¥^½z²Ûn»…ùIàÿÉG†sH àZµùòKQy(f+Ê-$wÝ%rÒI¹_ùƒY±Bä›oŠU+Êøñ;äØc•ƒ+…H +üüóÏ2|øpײ\yå•2mÚ4×cÉÞxãZ9r¤ôíÛW,X ÷UNðï½÷ž4oÞÜ5ÇGŒ¡-ªÈsâĉê92^ÿ®]»Vzôè¡•ÍuëÖIûöíÕl"¯É²eËä˜cŽ(·K–,‘¶mÛÊË/¿œl‘ó">мhfV’Ü tê$ê)Ò¯_±ú’/>*(¦ ðšÀ¬Y³ÖE(pNÁ±t ”Æ7ß|S}˜®ÐÛž|òIùý÷ßµEÓ-<^þãÆ“Ž;Ê£>ªg×éÕ«—|þùçòÃ?H‡Ç1(Jï¦M›®”Hœˆ>’÷H ï ‡¨Y³R©SÇ¢ò™w­Ï “€êׯs~Wøl¦[êÔ©£­–-Z´ÁƒKÆ ¥k×®êÙç/XBçÏŸ/ƒ ’óÏ?_+µÔÔ"Ý»w—3fh‹è-·Ü¢ó¡òéN2¯, ˜‡Z¹k¨Áî02ºjU•?¦LÉDn™Ícóæ5eJYµ*³ùf"7LU´zuõ‹©¼2‘cfóX·.$jÆõõžÙ|3‘›zGhY´(Èú­[W¨ýÛ+JéóïÊ©«–\ûãÓO?•5kÖè®kÌÝé…4RJÀ€ôèzŒdÇèxøjÆ Ç"(¬­Õ¼m°nÂ"úçŸê¢aš'X8añ„+âžuÖYÚïó¥—^Ò 'RÀÜ£°”R¢ „Ô4Vtp0CðE§á<з ââÅÃ&ˆ/ ¬„º1&˜ ˜@ÅW2ü’‚øñ0`Àv™5«PfÏžúÍ7;õ(ø)S‚9 µP@ñ‚ šà% ¾zAT@1´fZ?ÚoÔ¨QrÍ5ר¥w²ön¡ö@ÙuKb…cÞÛn«FmذAD8 Pª‘žŸ  ð5 !ùŠŸ™“ xMÀø€Î›R/¯scú$@ÙNÝüNåeŽ ¼›ò‰sðñàT>C•Oˆ-T@c³á &e³gOQ#TwYu/¿¼‚4PH! ð—Pù3wð•€ *Ÿ|"ʽ ¤Ü'vm+ÿü@ÈQG‰$ ʇp—ƒ[IIHu犨éú($@$@>žÃ—Ï@™= 䵞r¤G‰w‚W>ö²çž»¦+Ë¥z8Ë eZ DUËûEÁ>Â1Ž €®Ê‘•å d1* YÜ8, xMàÞ{EMw"j®Å jÍôb=A ÊÍy¥óbªqQRIÍì³r%Ð(0   šAØÌв@³f»J´n]©ò,Ñ>’ÙVÆTʃ)×ÔÔ|®‚…`å¥ øG€> þ±gÎ$@€ò9fŒ{â>(¾®<ã^*†’ @~ š_íÍÚ’@Þ8ï<‘I“DÍ!¹kî¥úõ-yôQ‘Ë.ˬ( d-* YÛ4, @y œ|²ÈÛoëd^zi§\xaySäù$@$@é @4™ @¨€&ŒŠI€H€H€H€ÒA€ h:(2     „ PM#’ ¤ƒÐtPd$@$@$@$@ àDô £bD \"ðûï"ãÆ‰,Y²ë;ûÕW ä‡Dz÷æDô¹ÔŽ,+ @0 P f»²V$÷.¹öZË*‚Kžx¢PB!‘V­¨€æýÅA$@¾ ê{°$@^8ì0QË‹â¯XV©õ7ëÖ­+•°<…H€HÀwôõ½ X   È/T@ó«½Y[   ð@V+ ¥¥¥¾bH€H€H€H€ÒK ë|@·nÝ*O=õ”¼ÿþû²zõjiذ¡ôêÕKú÷ï/*ì*.â 2D .°"htèÐAFŒÆ    ì"u è=÷Ü#Ÿ}ö™œ}öÙÒ©S'™>}º<óÌ3²cÇ:t¨¦·P o]¼x±ôíÛWªV­&Ú´iÓð67H€H€H€H€²“@V) ›6m’÷Þ{Oúõë' ÐÄöÛo?ùí·ßdÒ¤IatÁ‚R¥J¹ä’KÔ´*j^ @ÎÈ*Pø|>\N9唀Mš4‘-[¶ˆñ ?¾´lÙR+ŸÎnøˆ¹C$@$@$@$u²ÊZ³fMíïi§¥óƒ>XB vé˰€ÊwÜ!S§N•jÕªÉé§Ÿ®-§v‹hqq±ZeI89(±%%%‚p?uò» ^Ôß| ±næC'¨m‡úá/ˆm‡{’ ÷¾÷Ú-¨×¥i;\—æô‚¡_ifCÛ™ç¶_ ˜oþÈ*Ô­ž|òIY¹r¥Üzë­áÃP@ñ@jß¾½ 6L&Ož,?ü°ö8p`8ÞòåË¥Gáý.]ºÈ¾ûî«Ó ú°EA´WPeãÆ‚¿ JÛnýúõAm6]¯ ·Ýš5kÛvT‹?¿dÛ¶m~eÍ|óœ@V+ /¾ø¢<ÿüóÚ÷³mÛ¶º© x^~ùåÒ¬Y3i×®Ã(ùK/½Tž{î9m5«Ô¯__ž~úépO›6MjÔ¨¡WD fxcíÚµz5ûà© Á³ìðÅìN:žåáW°T í`m7×—_eñ"_ø_ÃÚT«V-/’÷5M<36lØ ïýŠ+úZ/2GÝÐóƒg[ЃOqmâºD¯WÐdݺuRTT1˜6Óu âó,Ó ™_j²V}â‰'´ByÞyçɹçž®¦bêÙ³gxßltëÖMfÍš¥»Üá Áu衇š(2gÎ}³û}á~—! %xY@‚X7ÓMÔ¶ÃÇêĶ3®;P>ƒZ?Ô1ˆu3Ýî¨[P|8 ^~¶]¹¦ñµÆ¤<$UƒL=ò KçàÁƒM°þ…… ƒœ]Æ¢h÷8‘;$@$@$@$@YA ëÐñãÇkËçu×]'gœqF¤¥Kÿ¯½3—©üÿø×v]˵\{ ¡$Kˆ’PÒB)I›úk¯ŸI»%J”_›Š´ Zô+i%DI¢"Iú¡RÙ²]×ù?Ÿï¯3ÍÜŽs¯™9Ï3ŸÇëš™3sÎyž÷÷Ì3ßó}¾Ë¯ª”Nž<9â=#!5Ó¡‡±/H€H€H€H€‚E PKð7nX?(¿˜3fDÐÂ2{½zõô}(ªXj?òÈ#5GèÂ… ¥gÏž ]ʈè,_ äH P èìÙ³ui}ùòå2dÈlnÓ¦ :T†®9Cñ!X>ýî+šmgn    @) XrÏiÙ=+©jժɈ#4R«rÈ!¡¡Y?Ë×$@$@$@$@Á"(4Z4H;âbê‘h9ðó$@$@$@$`À!Ù}%   ˆžÐè™q    B ZxÜ•H€H€H€H zT@£gÆ=H€H€H€H€ A€ h!àqW    è Pž÷    (* …€Ç]I€H€H€H€¢'@4zf܃H€H€H€H ¨€w%   ˆžÐè™q    B ZxÜ•H€H€H€H zT@£gÆ=H€H€H€H€ A€ h!àqW    è Pž÷    (* …€Ç]I€H€H€H€¢'@4zf܃H€H€H€H ¨€w%   ˆžÐè™q    B ZxÜ•H€H€H€H zT@£gÆ=H€H€H€H€ A€ h!àqW    è Pž÷    (* …€Ç]I€H€H€H€¢'@4zf܃H€H€H€H ¨€w%   ˆžÐè™q    B(^ˆ}¹+ tÓ½/¼~ŸdffÊÞ½{%µdª)ZD&Üò9¼Z݃~>H þh?sž‘H€HàÒJ•“#j)eJ–‘ek¿“C*ÕÔ×)ÅS°ß"°‰@RY@=ÏÓ»éÝ»w'TFûöí“D÷!0.4džk-##ÃÉñÁÒ„1º(;Œ –4_ŽºÁ‘ÿöïßïœìZÞRZ\×RÞYð–Ì[>Wîïño9¬J-•˜K×(®ÇDÿøßG¾†E’J…\0Yã/‘ “N¢û‹ñc\. Ì\Ÿ«có¿k®ŽãBóÇ©/ùÏÌ(:ŒÍÉñ`Îô¯G.Ã"I¥€)RDRSS¥téÒ ѶmÛ¤D‰ íC¬ïûk%’o¬Æ†?È.%%ÅIÙùÖAe«õŽ;¤dÉ’ú«k$QÇݵk—-ZÔÉës%Z¢çíXÉ×e¢ŠO*5 V¢äq @€> €Æ]H€H€H€H€ N€ hÁÙqO     ZhÜ…H€H€H€H à¨€œ÷$   (* €Æ]H€H€bOà-ô$›wlŠýÉx ¸`ø[\qód$@$pp<;í)ùmóZA¼Ÿá£nµzryǫΠx”}™ûäÂw•O¾›£½hww+¹¢ã52ª×s ìOM$p0 P=˜4y, ˆ÷¿|G–þü­lÙ±EŠšsåÊ”—6GµuBmvsYóÇêˆÂf•*å«ÊàCãD˜§!ˆ%* ±¤Ëc“ @ŒL8M|Ú€vR¡LEy½ÿÛ1:S|ûÓï+åç?ÖD(Ÿ~žý`” ¼ð>)V¬˜¿‰$@– ¨¥‚c·I€HÀEë·¬“ŠeÓsê"íÜ»3Ç÷¸‘HÀ.T@í’{K$@N¨[½žìÝ·7Ç1îËÌÒ)‰«d—c§¸‘H @¨€w" ˆêkÈù'^”ã¡G_?ŽËï9’áF°PûdÆ“ €ÓFþëY¹æô^RÄüC«”VYF^÷¬\Ðöb§ÇÍÁ‘@2`R2I›c% K<~íhi×ð$¹ü‰2ûù‚¥y6 w$•ºßÛ¯)KþØúGÂ$¸iû&Ù•¹Kvïß°>ÄêÄ;vì;wJ±RîE¨zæÚì2Šì•Rîù mÛ¾U222DRbuu$î¸ûöeÙm–ýÅ3%%¥dâ:£3g˜ñíÉØ#‰œ×b44Ù±û/=ôV“jÊÅñmÚ¾QR3Re·'Vó<îî½îýå9h~ Šx¦¢'qèÄ= ”§æŽ½ewÅál< ›@…_ªÊ’÷–J¥J•‚ÝQöÎ9Ie­œVEú_8XoP'a‚ܲe‹¤–,)©¥J%¬±:ñnS‘e÷ž=R¡B…X"aÇÅ}ÚV#»Ò¥KKŠ‘Ÿkmç_ɾÌL)W®œkC“L3®íÛ¶IÙ²e¥x‰Îo諃¥LÉ2Ò·ÛÎŒ Ýí»¶É’ÿ.–g?/LîÏô´t©X&Ý© ¤m[·J‰”)•À߃ÉÏOÑJZÎ\<ˆ5’J-U²”´iÜFZµj•0­[·NÊ”)#iii ëC¬N¼}ûvùË(2Õ«WÕ)vÜýû÷Ëúõë¥|ùòª„&¬#1:1nŒ°_¥J•!q‡Å¸6nÜ(éééRÒÁ›‡gÞ©‰è»·¹0qò™_™ó¢Ü6®wè¨Ã& Öç ýFÕjÚnû“ 6HjjjBoü½·ÄvŒì¿¥’JµTFì6 d#+áà‰ýeÉêÅÆ*X\ÆLZ®=ãúlŸ³qÃIMN‘IwM•½{÷ |˱ªR´hQ©U¥¶ÃaŸI€r @4(ÜD$@A&‹|ÃëëÈŸý)'mï;öF?sŒÌþ…õËÔ5+*øÛ½{·üùçŸRµjUëÇäë‰}#D`ÐDPç9I€H žù`¤‰ìßR>ýC­ü}…¼µàMÿ%I€H °¨€V4ì äL`Ö73$sf¶7wîÙ)Ó½—m;7 @Ðp >haH€H éesN™S¤H©”Ë{y’oÇ‘@÷îÝA›{LÖø¶–0Ù:wî,}ûöc/x*H,Z@ËŸg' ¨ äV+éÂÎ9þ¼¨ÇâK‘ïH½´páBY½zµ>‡ÊFÉD€Ðd’6ÇJ$à3Zœ)Ãz>,^ºCs8¢fz‰â%dôõã¤MöNŒÑåALœ8Q‡W«V-éÒ¥‹Œ9Òåárl$#Z@sÄÂ$@$l}ιM>~pÔ®\GÔl(sÌó‹Ú]ìN³w$@$ð7Z@y) €¥Ž­ßJjTŸ›6mÒ\’+VL¦ás¬$@–°Výàƒäý÷ß—eË–Iݺuåú믗-ZX.vŸH€H€H€Ü'`e¦¯¿þZzè!éСƒ<ûì³Ò°aC¹ãŽ;dåÊ•îKŒ#$ °ž@ff¦ìÛ·OvïÞ-û÷ï·~< DKÀJô‘GQåó¼óΓúõëË­·Þ*5kÖ”×_=Úñóó$@$@$WóæÍ“Úµk˺uëd„ R½zuÙ»wo\ûÀ“‘@¢ X§€nذAÖ¬Y#íÛ·`×®];ùüóÏ#¶ñ ‰ÀòåË¥mÛ¶²víZA ¬ ðã…+Ù®]»‚ÔUö…bJÀ:P|iѪT©¦R¥J²eË]Ê(ZôzuFF†üôÓO¡Ïýù矂/"ƒ–±š’’¢µCsä –’öìÙ#¿þú«##Š®¯Ò¥K«ü"ß±ÿÕÎ;K‚iiiö&Ë0®íÛ·KÙ²e¥xq림,£ÉþrÇä-"eÊ”Éþ¦å[0‡ÿõ×_òË/¿h •åÃÑî÷íÛ7Û0°%«{;wÎö~,7lܸ1–‡ç±I WÖÍÆ˜ŒÐÊ•+1(üpâK Ï…µ´k×®¡Ï5hÐ@fΜɻÌ>! ÜÀ4HÿâÙŸjժɰaÃâyJž‹”€u h±bŴ㾕ӗ£ÿË~ƒ•tâĉþK™6mštéÒEŽ8âˆÐ¶x?Ù¶m›ZÐRSSã}ꘟ(ü˜²ÞÄüÄq8–Ê »R¥J9iÅÒ,…°ºÖ0.X a!tÕŠùÖy×, °ÎÃÀàÏñ¶³_}õU¶a`e ñ §Ÿ~z¶÷b¹á¥—^r†m,9ñØŸ€u hzzºRÀ’Zxó_‡OÂøB·lÙ2ô±E‹IóæÍ¥U«V¡mñ~§süº¸Ô ÀB ‡z׬ëëׯ—òåË;ùC÷üØgumqAŽ–1w”,YÒ…!EŒÁå< ¸©…ëTÕªUÅ7>D ÞÂ#FŒÈà ܼÊ›Üx6¬ ²‘@"X„_O´Í›7GðÂk(u.úAE ”/H€H€¬%€€ÙÏ>ûLû_¡B½©mÒ¤‰þ¦Å[ù´";îë, P@kÕª¥ïmÚ´ ðÍš5 ½æ  "N8Aó.\¸P-óˆOpÑ=$ˆìÙ§à°ÎŠ¥ŠîÝ» *!á.Qד&MÒhwTCb#   €;ÏÃ;ŒÊgÐ…ÅþÅ„€uPP8çœs4-Gÿþý5p }o¿ývý"Ç„J$@$@$@$pÐX©€b©¢OŸ>Ò«W/Íý‰4l$@$@$@$@v°n >+–0¨|†ás   >«ÐàãeI€H€H€H€² š•_“ Ä”ИâåÁI€H€H€H€² š•_“ Ä”ИâåÁI€H€H€H€²°2 SÖADózõêÕ -׉šÔ(·æbÉPÔßµkW¶2©ÑÈ'¨ŸE-x”{-[¶¬¤¦¦µ›î×öíÛeß¾}òÇøAÝãB­ûråÊIJJJP»Yà~alE‹Õñø Ý…FpmbÞt¥|8jÌ)¸&1¯$ªáúa#DH*´E‹2wî\ùõ×_ÁZÏùõ×_K•*U¤fÍš ëC¬NüÛo¿Éúõë¥yóæ±:EÂŽ›™™)‹/–:uêHåÊ•ÖX7f¸hÔ¨Q¬N‘°ãîܹS–-[¦UgÒÒÒÖXxÅŠªœÕ«W/V§HØq¡­\¹Rš6mêäÍ÷ß~+¨jH‰jõë×—Ò¥K'êôUÜå 70Ç—nݺÅýü±>!ªŠ-]ºT¦NëSÅýø?üðƒVO{ùå—¥U«Vq?¬OxÙe—©õsÔ¨Q±>UÜ?kÖ,¹á†dΜ9R£F¸Ÿ?Ö'<å”SäôÓO—»ï¾;Ö§âñI pè8‘°C$@$@$@$à6* nË—£#   Àà|œEòÓO?©ÏO¥J•â|æØŸõþù§¸è‹† $ø¢U¯^ÝÉ`øî"à£V­Z±¿Pâ|†½{÷ |\ág‡@×|Ú ãâõŽ;¾å‡~¸”(QÂ5ÑɪU«4 ql$l¨€&›Ä9^   H0.Á'X<= $* É&qŽ—H€H€H€L€ h‚ÀÓ“ Ä–üìàßÊfI“&ÉÏ?ÿl_ÇÙc < PÍÑÁù‚<\nß}÷¼þúëòé§Ÿ v\jbü¶mÛæÒ°t,k×®•7ß|Ó¹qùZ¾|¹æ‘œ8q¢¿É™Gä¦6mšÊrt­½ð 2räH?~¼kCÓêN .¥²‘@²HªJH‰òš5käÊ+¯”aÃ†É 'œ¨nÄä¼òïÿ[¦OŸ®Æ(ʼnJH=ö˜/nÿå…ÊY J¢dÞÕW_-—\rILX&â ï¿ÿ¾¼øâ‹ZBõÿþïÿÑ…˜Êgß¾}¥aÆZü!f'JÀ¡pbl6lÐxÜüAŽ®”…ò‰¢¨<ößÿþ7„cwÊ?üP~øaÙ½{·ž‰èï¹çžØG&€ 4‚AÝw(j ùóçÇáŒñ;ª-r¬Ÿ#éIDATY²D-PfPÑ%+_{íµøu"FgBE'ü0\tÑEúãÞ©S'Áx]²ZÔ­[WŠ)"Ï>û¬ R+-\ù|ðÁ¥dÉ’® MP¼7³Gu”L™2E«W=ñÄÎ)Ÿ}úô‘«®ºJp¿oß>'ä÷Í7ßÈ< ÿú׿Tv¸¡…BêÚï‚Ââ bN€ hÌ‹Z(pä!tI EíÉ“'KÏž=¥Y³fjñ<묳¤qãÆ‚å%Û”èvíÚÉÅ_¬yo¿ývAþV,Ç£6¼ Ul¡€¢4d芊ܑ°"§©¯|âðÕW_Õï¬OPlm¸þPCJLÅŠ5$Æ÷ÒK/ÉsÏ=gu)\ßò åóüóÏ—#|«žÃO–B¸\{íµ!%´wïÞrÿý÷‹ódÕ Lg!Ÿ´´4õµûä“O7¸q€_!ü%;vì¨ ©ãÃ\R­Z5¢‚€?XtqC„ïáÛo¿­Ö_(¢|ðUbƒ¯.Ž`ôÜCÚ¶m+ï½÷žº1ùÛm}ìСƒVTëׯŸ¼ñÆróÍ7«sJ¯^½¤hÑ¢rÛm·Ym¡·U6ìwü »×´øŸ6¹ÎØ A]ÂE©<”Ì;ùä“õ‡KfXb‚ÊÆ†É%òÎ8ã ý±÷ǰ`ÁY·ntëÖÍߤ ,_§¦¦†¶ý äË ¯P£Œ#~O:é$Á{ø12% M›6AN®ýÃr4Æ7Šc=VÝ'°Ä{Úi§E(¹ €oÀrï–¤á‚ú–-[jO¡t# Æ ‹½M J¬Ö˜? 3¸Á<ôÐC¡±Pä±Êè…^hÓÐ$===[¡lÃZ]»vmëËüÖ¯__—Þá_þÇÈÒ¥Kå‘GÑ9ïÁÏ|êÔ©zÃ+> ¸L€Ð8H?xˆ ÷~]±„¶nÝZ—Éü±áKƒ°>ù ?÷ÝwŸÌž=ÛßdÅ#,Öá〠Ãk¥Ãú —ŠM›6Y1žÜ: ?P?°ê™gžQ«/”kGؘtÌ1Ǩ†ëÊKxÃMn"¶nݾٚçÈÄ_kXÒ0¿àf0¼áº„ ‰ rÂjænjŸþyAÖ ¸/5mÚ44,d1hß¾½õsJh@|B 9kàƒ|+:H±å[¤IÉ©eUB¿þúëœ>ØmXÒÄÝ;Ò.em°Î”+WN7ãGcĈê/ 'Z^²óÇ€qÂRˆH[,~Hì ·ù¤Ž1| ø|'Ão(ÂßâópÙÁ Š›ºòåËëw0k.WX}±âbS;МңGA®á¬î>¶Œ/\vþ÷Ád°‚®\¹24 Dû#"þè£mãp•@ãßæ¹:¸D þJ8ò•3Üá4Hý¶²ö Ñ«þÝ0œíƒÞ0¦Ç\r .X–†ÿ,1h°îâsXÎõ•O¤S±¡å%»1cƨ¡´½òÊ+êJßÐpKiPÇ +'K?¯",¸wÝu—ºQ Õd åþh~Ã$–@mhyÉò‚dE<umAo¹ÉVÐ{”iä“„›n0°d=|øpµÐ}lù™S0(Ü ƒ/oV‹vǘ›ì +(Ö¸Y÷}–qâ¦×¥ä±±o$P(P@ÙyóæyÆwÇ3ËÍžISä͘1Ã3? žñÅòŒ²yðN” #åÒ3·žQb<³ÄçEÛ3Až©Xê¶ÿAÝn~,BÛƒþ$/Ùk…g–>u\³Éáç™…A–öÏøzÆí=ú裞‰¼õŒÔ»îºët,Ʋä™ü¦ž Ö±b,9u2/ÙëšgÒiEÈÎ(j9*pÛò’±šy&ŠÚ3Å.¼SO=U¯K ¸qäÖ¡üÌ)Øwûöíž¹ÙõŒµ7·Cn{^²3ʦwÁ„®Ks#ï™";D± ð?“U¡TXîNÖLó# FØŽxøgáî¹ìàóƒe3Ûo¿ý¦¥ÿu‹à#ä]¶l™ú0Á¹hÑ"iÑ¢…ú»"8ÕŸl±|Bù‘ªÍüþûï*Sd°¥! ÖvXZàÿˆ4Y¸ª²Ä5Šà[[~dw|a©·)ð//Ù­X±B}]m 8µ–ß9ŸEz-¸‰ ˜Ñ––—ìdÖx| YµjU[†Æ~’@¡ д€Q ¶æ® âXþò}‘RKaX††¯–©?ú裈ÏñüF•ÍcCÃø |Þzë­ºl …~Kȵ?®O?²Ã2õ¡‡š-ð*ÛÁ´á@²ÃM”OøîBv‚@zTf=zt‚zÝi #;(ž`Tåó@sŠ«²Ëïœâ_%AU> #;Üüá÷ʧ/e>& * ”4âaQA p%?ð W>Q2ù#áãiCd*¢º‘ø©kÂ#¼á;‡†üuáÊ'ÆË.8 ª*üÑ‚ÚràÀòÙgŸEtÑuÙ!Ð͸„D(Ÿ€Š,áɱ# ì…˲ËmNÁ÷ÎUÙåwN Øe˜­;®Ë.Û€¹X¬ë'Ë1ÍòŠúî˜|ž‰lÔaOŸ>]·ÁËTö¡€Ï¤ îðlñÍ‚oc×®]ÕçÑDA‡Æaj½ëøà?hªz„¶›@¯K—.Vø¹îÝ»×3Á7ÞÉ'ŸìÁwÐo.Ëþ«&Y¹ÊÎ,WûCÖë>½¸†mh®Ë.§9ÅuÙ¹0§à»ã²ìl˜ØGû0}!´x,EÃòÿ3X ‘ŒÉ„ýt"æÇR#lQÒÐéhÂëK/½´gŒß®ðSÅxàÄþeM­¸HÚ +|·°œ‹TDð‹œ2eŠFT£JKЖёL¾sè»_ }wUv°rb|ÈÅ +<"l ÿØci*DRÃ’ôæºìršS°râ²ì\˜Sð½qYvAŸØ?K ا3¯Ç9Ýù"RADK#*Þø‹ZaÌJ7'K(¢QM:ÆwÞyçyÆ4ë®›5ÍeܴٙžñÍÕëyã·ë™ªU—UÖº.»œæ—eçÊœ‚ëÔeÙeýò5 †üöØ¢$€åvS¾PS™„ÖºwN“ÞÀ;Ò¤ØÔ tÂ}ézÐrRB±cÇò M-«ì ÈÜyçÙ–ã1&—e‡´Dá.6ÈJŠñ…ôŒõ]]\—]nsŠË²saNÁwÉ%ÙÙ07°v`"ú(-×H*üàƒjr슨L$óFméwÞyGk2£ÔÚí·ß.¨VbSÃr:–dQ#Û\ÎL„Hi¤SÂ’;‚’°ˆÊ2AF=ïÜd‡„ÐJBõ˜aÆYY×ÝuÙ!ɼÉU*‰t_ýû÷×Úá.ËßEÔy·uNÁ÷ÑeÙå6§¸ð{p ¹”ï‘ÀA!`§Þœ˜^Ã’iÒÖhÀ¬‚H|Ï=÷èræÔ©SµS¹Ýù&¦ÇÑuìØ±ÞW\ᙪ*(#¹5uLÄ»Zœr³„Fw–Ä|:/ÙÈš–˜GwV—eg|uÕÝÃd—ðL–½>QØ¡S§NžÉÉê¹.;›ç—e—ל‚o°Í²‹nâ§I z\‚Ï'3TýùüóÏ5’ÏÛɃ©•ðcˆ†IçŒ3ÎðLÒëðú9¢óo¸áÏÔZŽè§± zíÛ·÷L‘n÷•P›ª‘äWv¾"sÓM7E0ú —e‡J1&Ý™×§OŸ1@5åCu;Ü*\—sŠË²Ë‹ÖFÙE|Ùø‚bD€ h>Áš ^‡¼Î;góéD‰M”SC ‘ß|ÿIÿuáï %ヒµ¡´¦©YÚlÓØÐéhdEÆ&ßH—e ®;\—Æí%týùO à eEÑ(;ŸLâ]—]4s ¤aÛœ™ø+ˆ=HLDŸOG†k®¹FLÔ°˜@MK¾*¬4jÔ("ɼMå6‘(~t™™™b, áCÓçÍš5ÓôDþ6 }ŽFv%J”°"‘/ —e‡”K(ôP±bEMýeòÑúÃÖG”MII }ï(»< }áºì¢™S ÛæÌ„^<Z`a1KÕšÀÛ,Á¨åÅøDÊSO=%fùOëŸÃjCûõ×_µßŸ~ú©Ô®][ïБìuÎQ~É’%ZïýÕW_Õúõýúõ³FÁ†,^xá1~ªš‰%6Q”² þ•™“ìÒÒÒtõò4Á~ªtÎ;WLõ-gÜb‚?°¿{˜uNÁ|áò÷ÎeÙ¹ô{`͈uŠÐ\ÄùÑG©B‰I?¨Žj@°Ä@‘≚ï&^Œš@A+[¶l.G Öf㤩•P½iÕªUZÅË™°Xø?†“&MÒ´DMš4ÑôKX†·¥¡ªjž#5\ víÚ¥U¨|%”² ®$s“¯È -ÑǬn¦‚˜2¢Ö¤;ËmNIMMuú{ç²ì\ø=îlÀž9O ] 2F“ÿÒ{ã7t×ï¾ûN«¡f¶ïL'{¤`2%=óÃRS$lŸqãÆy½{÷Ö`*¤[B5Tk ¯Sÿá‡j`Òý÷ßõ5Ú…ZSGùÕ}^~ùe T1¹KC‡¢ìB(õ$?²Cê3TÞB&_ÆÄ:“ל‚]]þÞ¹,;›ç”\²|‹bJ€Ð,·&½†¥Lk #Á<–ȪV­*­[·–É“'«õÅDå†,¡XžG=q,cc©7È þr&5”,Z´Hk¡£n=ê¹c/¨ì|kš©ÎßGy¶‚Ì)8…o uñ{ç²ì|KhÐç”(/c~œbB€пo=~þùgõãDéIøzÂ"8þ|µ–.]Z?…t0¾%Ï‘Ç÷+DiÀ Z@Í•£åBkÔ¨¡)‰`Ñ„, °Ü¢ÁÒëÛÔÛvÀ'cƒc bûÏþ#óæÍ“¬\*T¨  Ö¯_¯+¾ÕAdH…‚ÏvìØQ`¡ì/Í‚Êη¦Á;¨ЂÎ)ŠËß;—egÜ’øo={@ˆ‰ZkÙAáã‰Ê>ðwôª{;«esóæÍþÇÿˆŠHØú°r¢Áêd‚¦ÔÕXEŒŸ±)»q'ðn»í6ÏDó‡Æa–gµb’—£JNx£ìÂi$ö¹Ë²syNÁUCÙýóݱiNù§×|F‰'ôPäðìÛ·¯FºqÄrâ‰'ªj^®\9µú™2j2sæLõ™ô-¡ð÷±¥!Ñã?®Ö¾Ë.»Lý8q—n‚§dåÊ•ê¿ kK¸%‘ÿ6´åË—‹)›)ˆæ?ýôÓC¹J!Gä†?~¼lذAeê[B)»`HÖeÙ¹>§PvöþãÛÏ^Àÿ$½ eì„NÐêFXv‡šžž®t²*¡È7h‹ræ_àÍ›7×¼¥?üðƒ.³sÌ1úVV%Á:X¢·©U®\Yó–Ξ=[ÓbuêÔI -\ Eõ*¸NØÖ(»ñZyÌ6Ù¹>§¸ü½s]v¶Íì¯Û’V…§©{®–2XËPfŠ þÂýÊ|%–3(64äö4A ÚÕêÕ«ëxà6eÊ©S§NÈWÕWBa±A$<ʽíرCdž1Âj EÉó16DRC޾µïA©†ÜÉÀ†FÙQ1Ù(;—ç׿w.ËΆy}LR‰÷ˆovîÜéõïß?1}ÖYg…¢ÝýèLs úáËj‚‰BãCL4Dg"RÜ,½[—·ÔÛŠ+4ÿ#¢Ùñ‡\¦¾¿ª5l[ÞRlx¤ììÊ9ëËÎõ9Ååïë²ó¯Q>’@ $tøðáº\k¹à‚ uÎQâ‘Þð…„ͦƒá÷M(«ùè£Ê7Þ(FÉÖºÙˆ2†Eãƒe×ÖgÎ6l˜ÀËë7n”J•*‰É)&Z\ËQŽ9RëM£§Míá‡Ö4K(Qˆ4QÎ9ì°ÃäùçŸ$b‡äàÁƒU5y1ÅÜY3<a9Šu•*U5Ã1F“ßTƒÈ°DˆºàÔ²©HHoS£ìì”ësŠËß;×egÓüǾ&) še Û'p£ËÌ‹/Ž8”±zgŸ}v(5¯cÉÖ(¡š`þÔSOõŒ¨îƒ•AlH“ôå—_zÓ¦M‹(Eˆ²„X–Fz4½ï™j@ž Àñ  ï=öØcž©¤ËñþÒuÐÆ˜›ì®»î:ÏXwµ»«‰z÷LîOÏd(б]qÅžQ:õý ÊÎDäkŸgÍšå™:õ!ô.È.·ëƒtYv.Ï)®È.·9ÅÙ…&>! wIïF´óˆ#dÆŒ¡aþùš ŒIQªÑ(p‚t"'NÔäåÂA’Éزšˆd‡ëÀš5kt|ˆÈ‡åìØcD¦ÂÚ‰€"ãÀŠ{÷Ýwk’îîÝ»ËÂ… Õµe6/ºè"ñSJ…@%øI~d‡ )ó“¡C‡ÊqÇ'mÚ´Ñ^#Í,Ù°l›JG*ã'Ûé$eªO‰Q<õ=¸ À2à6Ûew ëƒÅ÷ÎUÙ¹<§Ø.»üÌ)6ÿèDÂÿHÀf*Í9v¥/¿ür RåÓ,?kP‡©ˆñyX‘ˆÁGúðt>úè#Ïø<ù›õh”e 2KÌjùD`ÊK†'Z‡C=šñkòL~ÌPÿaÕ½çž{;¶üÈΛñÙU~qlïÒ¥‹#ùŸ < OÆŒ£a“&Mò`EÒ|uÑ;¿ï¶É.šëÒUÙ%Üb›ìò3§à h«ì"&¾ K 8c…5ÉT¤P_Gø¢ÁÒoF>j=KMMÕÏÁ¹w¿hfI[-„HH¿Ð 5£0«Õ9J‡ ¢AEH…T5~3QîjMÃk¤\BÙI´-[¶ÈsÏ='f‰:cCó#»’%Kâ£b*Ti>SÈÖÞ§Ÿ~Z7n8‹®vÖü÷ý÷ß‹ÉD Æ B}T±Ý/vàÆVÙE{]º*»d˜Sl“]~æü&Ø(;Þà# ØNÀµÍ±Üî+Ÿ ~Ø'Ož,S§N•ßÿ]sAšÔ=ºt‹:îX²}íµ×äÇÔàÔbÃ’;¢×áàç¸D?P•7ä°ƒò„ú·Ür‹Žï™gžT>2þ…º\JAAmÑÈ®U«V2jÔ(¹øâ‹õÂXõ¦#¨cCf‚Ã?<¤|úý4¾º±o,ÙzÂ-âÊ+¯´JvÑ^—.Ë7x.Ï)¶É.š9®<6ÉΟCøH¶pF…¥eý†ôJð„5°Q£Fbrcª¥Ó,µ«ÒirÔªn¸AÓùûícC3îštàf9WËh …ôJ5kÖ”wÞyGS!Η1AW–à  ý‰Vv°n`¬°`\zé¥êCÄqùcƒªq•P?HÜŒ=Zýáû‰êM&€G^zé%-ŠÐ£Gkdíu ÿl—eçòœb£ì\ý=ê\Ç~‘@´ŠÀu Ú‚øyXÅÏÊ,ƒ~J%Ô GnO4! J þli°ä¢¿`AYÂ/¾øB•mܹâ‹€´¹sçjš"XuldKsYv(ïÚ«W/ ÄLÚ VlXp{öì)¾k\+p³4vìX[Ħ–[—¯KÊŽsŠ5_Fv”,$àŒôª«®R+–<áÿxçw j·/þÏqŒ´ð¼®ŒáÐ¥ço¾ùFêׯ/÷ÝwŸú>†ïkëø\–¬ïðÿ„èÊ•+åœsÎQÅ3===\tê¿ëË/â¿pýº¤ì$äWnÛœéòœà)]#¨8cÍϨ‘z ЬLGyd~v±ê3wÝu— ;”p_Q«‘Kg]–,ö&ƒƒtëÖM®½öÚ\Ø»Ùåë’²³÷ºtyN±W*ìy2p¶‚S°tí7øCÂGËÔywBùDå¿aicC0R¿~ý¬W>“IvXvG¾VÀ!hÌöæòu Ù„²³çju}N±Gì) üCàŸõé¶Yÿ n­øQGÐNË–-5‚K×XþtÁÂ+'Æ$Ø(G‰±!­”Éõ™mYÞ6aº.;de@ê(>0Õ¨äóÏ?—Zµj jRûþ ¶ÉÌï¯Ë×%ÆHÙù’¶ëÑõ9Å.i°·$ðb÷šöÏK7žaù¹Ž‰Gz¥U«VI™2e´?Â}Bm-ÆBT72‰Í¥nݺ¡úö¶ŽÉï·ë²C={D½# õëqãÕ'ÔçaÓ£Ë×%ä@ÙÙt5þÓW×ç”FÊg$`¤òµK4ì- ¸IÀYP7ÅÅQ‘ €ý¨€Ú/CŽ€H€H€H€¬"@Ô*q±³$@$@$@$`?* öË#    «PµJ\ì, ØO€ ¨ý2äH€H€H€HÀ*T@­;K$@$@$@ö j¿ 9   °Š€“¥8­’;K °qãF™?¾,Y²D222¤iÓ¦ZƶvíÚè]î]@ùÏ9sæH»ví$è}Í}|‡H€’Ðä“9GLf̘!(S»yófÝŽÒ…¨Ÿ]¬X1yøá‡¥oß¾ŸÒ‹E‹IÏž=eÒ¤IT@ƒ$ö…H€ò À%ø<ñmp™À÷ß/;w–*UªÈ'Ÿ|";wî” 6È+¯¼"mÚ´‘[o½Uüq—pl$@$@ @4ÐyJ ©S§Jff¦<òÈ#ºŒ]ªT)©\¹²ôèÑC&L˜ VP(£l$@$@$p0 P=˜4y,°ŒÀ–-[´ÇÅ‹g÷Æ©[·®Œ3F.¹äÙ¿hdPXŸxâ éÚµ«4lØP}Eñ,‡‡·ȃ>(Ë—/—«¯¾Z7n,Ý»w—éÓ§ëÇ>üðC9ï¼ó¤E‹2tèPùùçŸC»óÍ7ú,´xÖØöíÛËðáÃeýúõ¡ÏåödëÖ­rÇwHÛ¶m¥Q£FªP/\¸0·s; @œ 1¾^^œÏÉÓ‘ „À¼yóÔòyØa‡ÉÀåì³Ï–êÕ«çÚ;L't’,X°@N9åiÞ¼¹|ñź|%õ»ï¾“ èþPþàWºiÓ&U>qÜÉ“'KÑ¢E¥ÿþ2dÈéСƒ”/_^Þ|óM©Y³¦üðÃ’šš*3gΔÓN;Mƒ¡ L^{íµ²mÛ6yê©§TéýôÓO¥dÉ’òöÛo«" Ð .¸@Ï EAI¿üò‹öñ¸ãŽ“÷ß_–.]*Ï?ÿ¼úŒæ:@¾A$@$P@ÙH€’—Àĉ½””܈ê_“&M¼Þ½{{Ó¦MóöíÛæ½÷ÞÓÏëfÄöqãÆév£T†¶Ÿx≺íÞ{ï m3 ¨n+Q¢„·xñâÐö~ýúév£Xê6¥¯«V­ê‹gèsü±n7QºÍ¸èk£€†>sþùçë6|Öo{öìñŒRꥧ§{F!ö7ó‘H€H A¸=Ÿg!ÀÀòùÊ•+uyÉ+VÈÈ‘#¥S§NºìýÛo¿…úŽ¥ðÏ>ûLŒÂÚ†'FÙÔ×þ’~ø›}úô ½„e ËéÍš5 mÇ2<ÚÚµkCÛðÄ(Âb”ÐÐ6ì‡sùËø¡7þ~‚ó¿ñÆÒºuk=‡ÿ¾Q°Õ Ùwß}×ßÌG  Èîø• Žð´$@‰#€%ø»îºKÿvïÞ-sçΕѣGË[o½%­Zµ’Õ«W‹±ZJ… äøãW>•ðïÄß·ß~«7ÓˆAT¬XQ÷ñ7b4,·‡·²eËêËp_Sl8æ˜cÂ?¦Ï:ê( ÚµkW¶÷~üñG݆ü ¾RìÈÿ¼ÿ;I€H€âO€ hü™óŒ$P4§L™¢Ê ,‹~ƒ&ü/ñwË-·hÀR4uìØQý9ñˆ„õ•*UøWÂRzçwj°’ ÿÑW8ý×þ#ü@óÓ|Å4ü³P„¡¨"a~ÖQ´Zµj©jÖ÷aÁ=ú裳næk  8 gà< …–¥¡`V«VMužSCÀ"ÞЃ6xð`U>Ç/—_~¹ i=šažÕ‚©oâ?ÿ¼á‡€5¶~ýúR®\¹ðÍú¼^½zú˜––&£FŠx +þJ—.±/H€H€âO fˆø÷‹g$ˆ1X!»té¢ËçÈšµ™À¢ %VN48$HÙ„ˆs_ùÄv,Õ£e]‚×…øïÅ_ŒØ{Íš52kÖ,õñŒxãï(ÇY§N¢ÿý÷ß#>ƒ2eÊÈìÙ³#¶ó @ü Ðæ<# †À AƒÔz‰œ™H…„ !XW­Z¥Á:H]„€#?5SË–-5 –S¡rR+ÁJŠÒþøÁ ”Ík®¹Fzõê%ëÖ­“Ûn»MjÔ¨¡%Bs:”ê#FH·nÝT¹¾ÿþû5±þ;ï¼£}DÀ­ØH€H€K€ hbùóì$P°Ο?_n¾ùfµ Âj2r¨2‰$óL5$,µû –±añ;v¬ZAá?Š$ôPçÌ™£þ™ùõñô›ÛãÝwß-PMš'µ¼"·è“O>©n¹ísî¹çªò|ÓM7ÉYg¥ƒµÛ¡(³‘ $žÑ'^ì †ÀöíÛÕú +(–«skPR‘4Ñóú\nûçµÝODÿ /Èe—]¦U’àó™[PSnÇÛ¸q£`)ŠvN>£¹íÇí$@$@±%@ hlùòè$`ï4mÚ4Ï>âˆtHñjˆj/HC]{ü±‘ ‹ƒ‚%ö†H€H€H€œ'@Ôys€$`X-Ï<óÌl ëí {L$@$ú€æD…ÛH€H€H€H€bF€И¡åI€H€H€H€r"@4'*ÜF$@$@$@$3T@c†–&   ȉМ¨p @ÌPZ˜H€H€H€H 'ÿè”IçsõÐIEND®B`‚psiplot-2.3.0/man/figures/plot_multievent-1.png000066400000000000000000001405031331220542100215170ustar00rootroot00000000000000‰PNG  IHDR àzŒß4iCCPkCGColorSpaceGenericRGB8U]hU>»sg#$ÎSl4…t¨? % “V4¡´ºÝÝ6n–I6Ú"èdöîΘÉÎ83»ý¡OEP|1ê›Ä¿·€ (õÛ>´/• %ÚÔ (>´øƒP苦ë™;3™iº±Þeî|óïž{î¹gï蹪X–‘š®-2âs‡ˆ=+„‡ ¡WQ+]©L6O wµ[ßCÂ{_ÙÕÝþŸ­·F qb³æ¨ ˆð§UËvzú‘?êZöbè·1@Ä/z¸ác×Ãs>~ifä,âÓˆUSjˆ—ÌÅøF û1°Ö_ Mjëªèå¢b›uÝ ±pïaþŸmÁh…ómçϙŸ>„ïa\û+5%çáQÄKª’ŸFüâkm}¶àÛ–›‘?ÜÞš¯¦ïD\¬Ûª¾Ÿ¤­µŠ!~ç„6ó,â-ˆÏ7çÊSÁØ«ª“ÅœÁvÄ·5Zòò;À‰º[šñÇrûmSžòçåê5šË{yDüú¼yHö}rŸ9íé|èó„–-ü¥—”ƒăˆ¡FAöçâþ±ÜJjåI.’£[/ã]m¦èÏK 7ÔKëúR ÿD³‹r€¯Y«QŒOÚ-¹êëùQÅÎ|Ÿ|…6«¾ ³ (˜0‡½ MXd(@ߨh©ƒ2­Š_¡fçÀ<ò:´™ÍÁ¾Â”þÈÈ_ƒù¸Î´*d‡>‚²üެÓeñ«…\c?~,7?& ÙƒÏ^2Iö‘q2"yŠ@ÿ«g Ÿ|U\ ï@IDATxì ¼ŒÕÇŸwîµÜë^û¾'$‘ˆ? ‘­U¢”J(RJdÍ’¥„,i‘%­D‹RI%­D%…P¢QÙ—‹ëÞ;3ÿó;¼Ó;sïÜuæ¹3¿ó1æ}Ï{Þ³|Ï{g~óœsžc¸U    °‰€Ã¦rX h |H€H€H€H€l%@j+nF$@$@$@$@Êg€H€H€H€HÀV ¶âfa$@$@$@$@ |H€H€H€H€l%kkiaRØéÓ§Åô>U @‰‰‰É´fN§SRSSušØØXÁ ÁårIJJІ!… ÒqþþC:¤·–gæëp8¤`Á‚þnõÄ'''{޳s`Í7§e™õÍN9fûÍ2ÌóìÜköÚúæ¦\³ó^+cóšõ}r­õÌ [kÞÖc³>Ö8[Ÿ!ßkæ¹/3>§ïûöí“-[¶H||¼T¯^]*T¨à7‹`0ð[/ D7ø¶pþùçÃ÷©~1"Ëæßwß}žô=ö˜'ýêÕ«u|ÕªU=qþZ·n­Ó¾ôÒKž$¯¼òŠŽkÑ¢…'.³%Ò<õ0ëŸÙ{»ví<ÙÍž=[ß{ÕUWyâ2;hß¾}¶ËªQ£†ÎjÆ ú%èÝ{÷îÍ,{}í¯¿þr+ÑéF»öï߯ãrS®YPãÆuùmÛ¶u+±oF§{7ë‰çÀ yakæáû~É%—øe¨¡ÏMÿþýÝ7nô½Õ]³fM}ï'Ÿ|’îZVGu÷íÛ×]¾|ùtå7iÒÄç.£ •Ã8  ˆJ ¨õ'Ç’%KdÊ”)Ö(¯cXõ&¹çžë±Äšõùûï¿åĉRºti)^¼¸­ß+V¬èuž›“²eËJÑ¢E3½µJ•*úzÆ /%¨äµ×^“x Óû.\¨­Â;wÖõ·&ÎI¹Öûpü駟ʼyóäî»ïö½ä÷<˜lË•+'‰‰‰ž²ÕÇŽÀÚ¸gÏQ? dþüù¢„¦´jÕÊ“&·_|ñ…ôìÙSvíÚ¥ËlÓ¦Ô¯__N:%ëÖ­“õë×Ëm·Ý&ï½÷ž¼ð Ú2j–Lf|'  M 5¸i-Y²¤¶©/e¿`R Üjˆ]¿‡ÒšQ%;uê¤ëõÔSOetÙ—[ ¨Gž<²s0kÖ,]ŸFe™¼N::íÊ•+=iM hNËE¦ý•àþã?<ùZ2²€Z¯›ÇÙek¦÷}7- ‹/ö½¤Ï•Ht›–qõ­D©']n, ¿þú«ç9íÖ­›ûßÿõäg,[¶Ì“æÆo4£ý¾ç•ߌyH€H ª Dõ"¤.]ºhž™…–<ÌM¼âŠ+tZþ—9[o½U .,JäɶmÛü&þöÛoåçŸÖóÕT¿érs¡Zµj’””$wÞy§g®onò ö=°¿ùæ›úù:pà€¶ç¥Ìê¹­=zô×_]`Eö ×^{­¶|"Ï=Êg   » D½Å‚ –.]*-[¶”Ê•+ÛÝ7ù²Ð»woÿåò Vz?ýôÓúîáÇëþÍeV¶ÜvðàA]Nf+Ô³ªˆZ§“\ýõ¢e•\ÔкN³fÍQ ƲLÏ$@$@$HQ¿馛n’>úHÞxã Qs½ØB$ÁBzà 7hW6^£äDÍ+”µk×fÚÚzõêI±bÅø@Ž?õÃïÿûßÿ$+«ZFC¾½zõ’qãÆiay†p VfËŠ+ô0ñ5×\ã÷QÎm¹Ö áþCñ°†>øàƒ¢| jÑeMcÇ1Üá•Q€‹«±cÇÊý÷ߟÑålÇ™W­þÏö=°º2 @(D½t ÃC€bÞ ~‹‹“ë®»Îo¿˜¢ÊÜ%ÉoBuÁÜeƼ'³´átM94—Ì,•þê k^ÇŽBþÃ?ôÌ9ļд´4í«ÒÜQ*£ìÖSXJ³ rEðuŸÕ}ùù:„+(VÛ‹^0çCôp‘dWÀJx,ÒÁ Qx5°3`šG°²Aàb¾-\[e'`Þ)¶ …‹1å7;·0 Œ@T¯‚7)b~>ÿüóO= ¯œuëc² âE€ÏIì¹í/`Îß?ÿü£/g4\íï¾ü!vø¢Oˆô~øA6oÞ¬wü©U«–mÍC?)ùº¼‘#G 8EZ0ŸUXñÕ§Y6oúôé:Íe—]–éþðYfÄ$@$@$  g¡aá­·ÞÒCñ¥˜3˜Y€5+Àžþy¿I_}õUí ÖTëP¬ß"䆚o¿ýv=ýeˆ# ¯Ûn¾ùfíŸôäÉ“2hÐ »‹zy°ê6kÖLoËŠ-P±ºÝ_À&ØþaÀ€þ’1žH€H€‚F€ô,Zì¯ýSÂ-ü)bX>«…0zôhY°`žßh½sG¥£àó2³yÖû"åØj‡CÌÅÄ´…®]»†¤yЇï×H\õi /¾ø¢ž·Œ©$˜kNû°ÂÆX=a•ÇžðxÎH€H€HÀnœz–x‘"EôœOˆ$sHóìe¿o°6Áº·jÕ*½°¦ÿþÒ´iSí׋¯åúÖ瘀¡xXCóK@] *ä·ºø£ö××ÁúóÏ?Ì9ÅÎHp³Ô AmuÇX>wïÞ­ÓöìÙ3ìw‰òÛh^  È÷(@-]ˆaxÐ2eÊxùµ´$Iw‹&ü D.BвgsI€H€H€H Ô(@CÝ,ŸH€H€H€¢Œh”u8›K$@$@$@¡&@ê`ù$@$@$@$e(@£¬ÃÙ\   5 ÐP÷Ë'   (#UŽèW®\©wäI×Ç™8QO—6iÊ?¨Ãá‡r iÁ¥ü Â÷dlLL¤5M·'-Mõ]Œ}}—"mãèr9Õþñ"1ØwðÏ ¿¼hœñÛþ7ftù.§Kg‰g3ÒúÏfLŒ_UgpÚ‚Ï%žI|'Ø Lÿ¹2mÚ4IHH°« ,‡4ÿªCOüÏ?ÿ”^½zIãÆ½+³÷oïó žíÛ¿_âÕŽH‘øÇž””$'O’²j'©H ÖûÕ®DEýîhè6ï• ÎÒo~GìªTªT)¿iòë…ÔÔT9|ø+V<ÓmMÙ>#no ³Ë4/ì”S¼xñLÓåÇ‹ÉÉÉrìè1)Uº”m?ŽÜ§ì#…ΰÕn¢ú\±+T¬XÑ«¨1cÆHf;Ùy%æ @T PpÃu:+VŸ˜³å§«C;5TY¡MfûBU‡`• +…Ù6»úNÑ VsÒå‹6ÁÚdWÛÒU ˆøñàp(šx>mú[7l*ØÐ¦ ?ׂÈÔ®¬uÛ”e×ξsÛ÷gçi—]Ï¥ù¼XûÏN뫵\“€}v²&    E€” €­(@mÅÍÂH€H€H€H€(@ù ØJ€ÔVÜ,ŒH€H€H€H€”Ï €­(@mÅÍÂH€H€H€H€B*@OŸ>iÀ/aV!;i²Êƒ×I€H€H€H€ì#2º|ùr¹úê«3lé‡~( víÚIß¾}eÆ éÒe'Mº›A$@$@$@$r! «V­’3fèW| lÚ´I¦N*mÚ´‘yóæÉùçŸ/Æ “_ýÕ“4;i<‰y@$@$@$@$Vl Ø+|„ ‚½g+TÈxŸëéÓ§kñÙ¥K©Y³¦ ƒÁ.÷ véòä¾;vìXºö+ˆ³÷3íˆä¾Ãg¿]Á}Ê®’Δc÷÷ @ÖÉßEÖvò8üØ*@³j~LLŒNbZ0Íôæ9,ÙIcÞKê‚ ÌSÁâ'ˆÙ’%KzâôAræî ¼çí ¤øˆ‹‹Ë[Fax7>ÈàZ«X±baX»¼U – ô]||¼î¿¼å–½»OJñì% @*ˆjXBð÷iV´ãÇ ~ÇÆÚó‘gÄ´ #æÖc:S‘"El+Ó®‚`ùij £„ù=ì²Ý6þîâ Øú}àûýW¨ vç1ÿ|EÀžOãl"1ÿ0ðea æ9¾ü³“ƼB¯iÓ¦æ©üðÃZ<¤ûƒ³ù_‚éêà©eþ=0‡7#±mæ0•}WÈF (~<@dGbߙϥ}gØø™q‰}‡gŸå¦ñ!ØŸî33‰‚]ŒÎ?Ð.;ûη,»¸Ú”…ä+¶.BÊŠ æz"ø%á–üÂÏNš¬Êáu    Ð;ZµjUÏŠw VÀ_tÑEú4«4æ}|'   ?a%@1ѵkWÁ.G_}õ•žOøÆoÈo¿ý&÷Üs¦—4ᇙ5"   0 „ÕPTªS§N²{÷n5j”`ñ@µjÕdèСR¥J³ÎÙJãIÌ    °"2zÓM7 ^¾ (wß}·öýY®\9ß$z%kViÒÝÄ    ° VCðV"X©—‘øÌikz“ „ž@Ø ÐУa H€H€H€H€‚A€4T™' €_ ~Ñð @0P€ƒ*ó$   ðK€Ô/^     Ð`Pež$@$@$@$@~ P€úEà $@$@$@$@Á @ ªÌ“H€H€H€HÀ/ P¿hxH€H€H€H (@ƒA•y’ ø%@ê / ƒh0¨2O    ¿(@ý¢á    `  UæI$@$@$@$à—¨_4¼@$@$@$@$  Á Ê—vþÝ1öõú ýÉ}‡¶ÅÄÄü÷ÀñÈm_×é¿9;ŸK`ó}NÌ¿ "eÖ$!¨  zúôi/†_vàx56ˆ'hW¤Š´ Ô0Œ Rü/k ÐÿXäåÈü‚Åß>„šÁn©wø{C@ß™ýìþ³[€ÚýãÁ÷ûÏ®¿‰`÷óÏ¢J€B8ÄÇÇKbb¢wOOò>âÙÉ“'¥`Á‚’ÄRB“uRR’h‘Ø6|H£ï .,qqq¶Nûž|¹ãË>ûâ%99Y÷]¡B…lé;#ξ¾ƒEËápDdß¡ß ˜Š)bŸÔC«~Ѿ ØÚw¾ß(ŸBA€s@CAe’ @ âÎgÓI€H€H€H (@CAe’ @ âÎgÓI€H€H€H (@CAe’ @ âÎgÓI€H€H€H (@CAe’ @ âÎgÓI€H€H€H (@CAe’ @ âÎgÓI€H€H€H (@CAe’ @ âÎgÓI€H€H€H (@CAe’ @ âÎgÓI€H€H€H (@CAe’ @ âÎgÓI€H€H€H bCQ(Ë$  ˆ.ß}÷lÚ´IvìØ!Õ«W— /¼Pš4i"…  kýõ—|ñÅÒ²eK©V­Z@ëêr¹ä³Ï>“7Êßÿ-UªTñp)Z´h@Ë ·Ì(@íGX  ˆ 'Ož”;ï¼S^{í5Ý*Ã0ÄívëㆠÊÛo¿paH|6l=zÈo¼Ðz®\¹Rúôé#»wïÖÕ-\¸°$''ëã *ÈK/½$:tdSÂ*/Á‡Uw°2$@$@$Yúöí«Åç˜1cdïÞ½’šš*ëÖ­“‡~X¶nÝ*M›6•Ó§OGV£³h Äì•W^)III2oÞ<ùí·ßBýÀòæ›o껯¸â HÔ@ h¤ö,ÛE$@$@!&’’"ï½÷ž4nÜXyäOmþ÷¿ÿ ^üñ‡¼øâ‹òé§ŸÊUW]å¹Éûöí“{î¹GŠ/®‡Þ«V­êin©R¥¤k×®Ò¬Y3©Y³¦Lž<9b­ ´€zº$@$@$@$Ëæ©S§$&&&Ãlzè!™8q¢@xYÃO?ý¤‡§/½ôR©U«–ac´fؼy³téÒE[Ÿzê)iÛ¶­ºÃ† ÓÖÄ'NÈðáÃåâ‹/–nݺɲeËs.Í0zôhm…ÅüË›nºI.¸à=Uàƒ>0“dúŽt7ÜpƒÔ©SGÚ´i£¶µ~þn^°`:tH—mŸÖô•*UÔ¯Q£Fë0¦ ½Û·o—^½zék>ú¨ç6XU¯¾új©]»¶®Ï„ þøc-š0!÷ØØ3òãœsÎÑBËšÁû￯­€aíÚµÓi—/_.ÈÂtáÂ…:9,‰˜?zðàAùå—_CÖëׯ—éÓ§ an%†¶¯¹æY½zµ,Y²Džyæéß¿¿¾ÕªU:ÝŒ3´p»ãŽ;äÝwßÕLJ%Ò_7nœeË–•[n¹EŽ=ª…ê³víZ‰‹‹ów«®3.¢m™LY°?äazLa(]º´æ4hÓœ9s‚bû÷ßׂøõ×_—¯¾úJ[[‘ žL‘‰s3@„#o§Ó©£L¶à‡¶¡ßŽ;¦ÛøÖ[oÉš5kò¼xŒÔ¤Ïw   €Àâ£Î;ËË/¿¬_ÅŠÓÖ4X,!ò*W®ìU&,wp¦ÈÂÅY³fé•óÈ D,d2Äç÷ß/X¸ƒÐ A=ç«×!vaq„µ"Ë H»sçN˜?~± éÙgŸõ°UÜG%³gÏÎIž´ÿüólÙ²E ´`a½ì²ËdäÈ‘òøã{Ò忀Cð¹¡Æ{H€H€H€²E dÉ’òùçŸë¹ I˜ûˆy¡{çž{®MÖŒ`áüòË/µ…ÏŒ‡à„u/--M/Ü1ãñágŠOœÃ]æYš–VÔ¡ºrý´gÏ}ÍüZ Ó›SpŽÅA°df^xám)|àÄŸH ,,ºÈ™…Çë¶9Þ YxÀ뢋.ò¼>üðC¯ìºwï®Å'"ãããµeyaŠ‚U˜_wÝuš…i1öÊ$›' ðˆOÜ‚axôÃG}”Íü'ón½ÿt¼B$@$@$@¹"a‡¡ðùóçËŸþ©‡ˆgΜ)€ýúõÓCãfÆçwž©R¾ï¾û¤}ûöZp½úê«: D¨5Ô¨QÃzênƾ5$$$xÍÅ5Ì/…ˆ³ÌéD€ÏÒŒ,°ÔBŒY_¦†u2³¹ åË—×–WXe­b<ð‚PÌýᇂհ8É0O–Z ÉûXƒ!¦}…·o:ç¸ß7€æ¡¢~y ‚Ï =ÞK$@$@$à—†Æ1¿ð¶Ûnø¹4,…°€Þ|óÍÚjˆ¡õ{ï½W_†ðÄBÌG¬W¯ž^lƒÅ7Ÿ|ò‰,]ºÔÌÂó‹jFÁטQˆRßP @•Ñ\I\ÀœH¤Á!ßë%üyZ­£ÖtpÀù©pÌoõó !‹¹ªf€ÐÞ½{›§žwßö?~<ˆ6›Ìý-3ÓùŠz3Þ,æ‚;­Ì溚yø{§õG†ñ$@$@$@y"ðÍ7ßh+&†À!"}¬Xµm:cÇBX=!ä0·ÑjÕð=‚u%»o~9=7˵Þ -BFñ˜6€áyˆj¸K²ˆAˆ6ëP¸õ:Žo½õVÁB+¬<Ç<جġïý¾ç°ˆ‚»o^XŒ„¹¢àŒ++êèÌ6ûÆûãƒ2óºS‡à}ióœH€H€H :uê¤óÁBøüô rXäbúÅL »[Å'Øc…;‚?koÞÙ9G°¢Ûžþy- á§4£€E8¾s=!Ö° êòË/Ïè6OõìÙS/ˆ‚5Wž{¨¬>å•W¬Q~QX\±ÈËà B×´ÊâZ‰%ôfÖáˆ~Ó |ÛˆE[ðÙê+¼­åf÷˜Ðì’b:   ÀÞæS§N•|P[1‚[qBô`èû«c8CîØÃÏðß +$„'æ[¯'†ÀaÕ TÀ"¦'žxB;~‡Û¢çž{N¯r÷ki–‡òpç„tX‘ýí±*B+ö3 ˜€…L`Ž…SpO÷Gð÷ wIâÆ Y¹kª~XSa9>r䈶ªÂò‰ÅT°Æ‚¿ ô±»Ú æp鄹¸þ¦ @lbáØÝwß-X?dȽàkÚ´if–¹~§Í5:ÞH$@$@$8†?ÿüóµ_J¸A2-{–‡xƒx*S¦ŒÎ«Ù!!1?ÖAÌy„+!ÌÄJsˆ3 Û"@üÞ~ûíú…9Ÿ¦x¸ò !Ì à&Mš¤Å1Òb!„%Úgv€BZX\±ÀÊ\dš;vl¶,ð!:bÄm!†ˆ‡•¾Oëׯï©„$a1Ú€9œ¸.ª2rP˜ú€:bø¾E‹§ÿø`(îöÔ,Âà ¿¼š4iâÝÒ½{ŸáÌ­öxU?wdÿþý/EŠˆšÅ,ÆYÿaA(Òö,±Ò{ÙšþÂl¯@ Äús^ò2é:'UÜ+g|ÚåäžÜ¦…EÃZ¾»‘ä6¿pºV 7áK Êv#n¯Åè2Ð6|™ù.L°­A,Ö$<›ŠõÛ¬bÝy[Ø›£jÁú„g«ží ¾~-±Û¬ZƒvH {cŽ$"eÀß+‰™Í©Ì,Ì®ALahÖBˆO¬^Ǫøœ|¾À¯'VÒcø=·Ï)ÚŠ•ꟾ}”“ú ¾‡gsRF÷ão ý+¯¹èÊš ¾0 Ãúè`ƒï¿@~ÎÐj%ÄcçùÊ•ú‚7ÿı׀qgo‰yxlKeÖ$@$@$> $}Ý&ù«~xXçúKˆxüÈ©øD¹o°îæ5ª­hGݺu³¬ÄiNêíoËÐ, Ê$h&pyÉ1ã1,Ýçè±âjÞL \s•µsöK+õa^$@$@$@$*a%@þùgÏ\ŠŒ€`"-&4Ãù)&Åú΀ÃTÌÇà¸áŒû‰´ Å}~qt»!«É:‘ @TÀV›ØGž!=Xd±`É×™ú”¹ +й˜sà–-[¦ç8Á}æk`>\Xw0&(ß:ñœH€H€H ÿÄJîüÛúÌkŽ­@áÂ)˜!¬(¥ÞqÇ^í]·nvS—¦G~L°ÅB욌‰É^à @@ „µ#z µOŸ>]®»î:/·Xq†•[Ÿ¾Ãð¥ÃÌH€H€H€H€N ¬, ¾­ƒ?-¸àÀ|Ok€®&Ož,«V­’"EŠÈ 7Ü }†Ñ"j%Åc  1`¸:¬hŸ›ºÓ‹ØâÃV€Â—ÕòåËõœP_i ðY§´p Št³gÏ–””½½•Ù[ðïg®fÀ® p%ð÷ßÞ~?j*»f±¢žGm,Ó®¶™å`[¯H ÇŽ¼ìÿŠý‘ÜwØ!Ä®`ÄÙÿ7É}‰v;ý€¢MðŒ—]Á×HcgÙvµ‘åäa+@±5Ð^}õÕ^$!<ï¿ÿ~-$±evRÀTØÒ ;'˜Î¦á4^üÍ€ÅKX´„xk0NØ÷Çra½õÕÖúä×cüh€¸ŽÄ¶aªžG<[þ¶, t¿%Š}Ωá”;Ž`4!ÒÚ…/YÌÇNv#ξ¾CÛ *ìÚ Á~fpògÏ%œíÛÜö<"º)øLÁ3™™Ãð@·Ù÷û/#'ä.“ù‘@FlüS˨xÿq+V¬ÐÎj}ªâ®|C›6mä‡~Ý»wëù¡¸ŽEK={öô$ÅNHøN÷%«D©]!EZØÆ2íjv †Õ3]e»´Í v}ÑÇ‹}Ï%ú ";ûmƒHÃóÇi°ŸCívfW€@ƒ8‹Ä¾CÛðÂß\nw˜Éi?¸œÞ‘ûôx.!íì;ßï? ÐÜ÷ïÌ{~Ræ°ŽâüöÛoÓY?‘ >Œ° ”¬Áüö^°¦á1 @è „¥ÅO ›]pÁéýõ×_Ò»woYºt©×5,F¯dìÅÊ@$@$@$@$¾ÂrNæªW¯®ß­ÿ{î¹R§NY²d‰j¯]»¶ÀQ=,¦=zô°mˆÍZ'“ „ŽÀ¶mÛäË/¿LWì;ß®];Ý?ùä=ªaÆұcG¯ô˜jµiÓ&í]§\¹rrå•WйŽWBž„@X Ð;wJ™2eÒÏÕTMÆûĉeÊ”)2tèP –OÌõ¼ýöÛ…™äŒ€{óqÿ¼]jRÁÓ)â*zf·ÍG¦& ÈÕ«WˤI“Ò­1§åÁ[N¿~ý´¨Ä6“ƒìö³hÑ"] Äç-·Ü"©×\s~8p ,^¼8ÃsWKÞe%–«ÜñòðËdæÌ™rüøqí'´bÅŠ¶­ôW§hŽw½ûž¸çΗ‚ ^®³0(@£ù©`ÛI€HÀ^õë×—9sædXè¬Y³dܸqr×]wéë0`a”ÕÜØfìØ±‚)~ßÿ½gÁ, H몞 2l@F†åÐìr†»Ìù´Ë=GvëméÇHÌö-’Ú¿Ÿ¸”»ãÅ@$@$@á@ ZµjòÖ[oÉ?þ¨«+(6ºÁ®ŠØ÷|üøññ‰¸Î;ËÆ)>#!_ Ð ð`–¹ `(÷6†ry¥dª9êŸ:Öç¹È‹· @n`12/[_–?þ¸@„^zé¥R©R%éÕ«—ìØ±C_ƒë-[¶èõ%:Âò_ñâÅ-g< $°‚d™ @äÀn‡ð÷m *œÙ²þOq Cñ_}õ•^ÈܼysY³f`S8èß¿?=éXáù˜Ð fö$@$@$@Á'€ÍgàÇúÂT=øoß¾½œ8qBïd׺ukyæ™gäúë¯×Cï¨Y£Fdݺu^•)ýû÷—*Uªèaylý=cÆ }ÿžç€žiºÝjW'gý‹Em¶-FZšÛwˆ«ûíâž1Ubn¾1]úü6ʱãb8]âN>-FáBù±¬3 @>$1‰—¿ßâ|ðÞes=Ë—/Ÿ.é­·Þ*xa;pÌ…eZ@ƒÇÖ“³kälbæå‰Uzô¡ñÚ»%*_º“’ÄyýûÊbXzÏ­#®+óe[Xi  È%Q™‘ø´¶ ’(>­D‚sL hp¸zåê^ûµ¶~zEâD¹~p!FíZg\TVC¸2*TP ¼Ÿ=–Ô±º¦âuÜÙk†y^àÌ=žkf¼J§óIWpà"Ü©©â<¯¾(g¬b¨$ÌàºSý}q¾8:´3£øN$@$@$@š¨‚?3¾’—ƒ‡Äýã6-FÕ,i%èDmg鯱ùBº¼-`-‚Ö*n!lÕu˜õ½¦Ï!€ÏŠY¸=#–ÝÛ·ëûu½}êèšñD¾ nµjÒýòBq»ÜRX;ÔÔxµ¸TŒ •ðf   È1 Ð#Ëù F›ËÄ­&?Kjš÷ÍÊb³ðE1jžëïs+££J˜j¡aª¬§ªÎݸ†x-`½¯AÐâš—¨Õyœ½Çæù©£gÒ™ù™ñêÝ‚|ÏÖÅbíô©î§jžM¾jјkƓڂjRºKý pÄ¡Í÷Ë „Ѝ äcFŠóÃDþþGm”®é†ʪéxa^–âÕ3`ÁÄKMŠöÔD¶½èH 2×g_ˆ[M#À¤táÀAq>ü¨8zÜ*Æ9ÕÓ]ÎF¹²ûÛ6qWí«s¡¤=:A ßÚ=?Tu$  °%@jC×@@Ƭ[#î·Þç°Å­¶ ‹8^Œ‹ØPzpŠ00­ .NÛ‹ó™¹"›ÕÞï>SŒ«¯÷¢×θŸjÕRŒ^·‰Ñ®­è{ƒS-æJ$@$n*V·±>a@€«àmêCY=7tw|¼¸.mž¯Å§™¡†¤cÞ[*¢R¹ÕB$=[UùXs,zIbæÌ’˜ëÄ1e¢¸×ýÄÙ´…¸žxZÜû"`xÞ ‚Ç$@$@$@Ù&@ h¶Q1¡?°hÆ~ö‘œšô˜Ä¾¸@b¾]#܆܆‚Ç0¼{ý÷âZðŠ¸žœ%2ó)1®ì(ŽžÊ*Ú¼™¿¬O$@$Ï ìÝø(;C>'@ h>ïÀ°ª¾šjàv¨ù­gŧoÝŒ&KÌÓ3%æû¯Å1|°¸7ý κKÚeíÄõâËâVÎH€H€H€"Ÿhä÷qصÐ(YR÷Þ#1_­Ç‚Ĩ^M\Mg£fâ>JÜ[ »:³B$@$@$@#@8–Ì)‡ 5gÔѶļü¼Ä|³ZŒ;{‰{ÅJqv¼ZÒ:u—Z´å†»)   ˆ"@QÝ™cT®,1#‡KÌw_‰ãåwÓ#®û‹óâæâœ8EÜ;wå߯±æ$@$@$@^(@½pð$Ô°u¨£s'‰}g‰Ä|ºBŒk¯·Z¸ä¼ä2qÞÖK\+?Q»ý·åg¨ëËòI€H€H€rN€4çÌx‡MŒ:çIÌ䉳áqLzDÜÊ‘¿«w_q6k%®§gk×N6U…Å „1­[·Ê’%KÒÕpñâÅrèСtñŽX¸p¡œPÛ53dŸhöY1eˆ Ú]S¬²ˆÆ¼ý†©í1ŸgãKÄÙÿ~q¯û6D5c±$@$@á@à“O>‘nݺÉ{ï½çU#FÈž={¼â‚q2dÈ[„n0êª<)@CE>‚ÊuÍš#iÍ[IìË ÅP{Èã¯`ãM$föSgæŠ$îï6ˆ³ËM’vyGq½´PÜIIÁ(–y’ „9ªU«J¿~ýäðáÃ~kz@mŠòÓO?IZZš'M’úÞ8uê”çü˜r xZ-€MMM|¸Ì˜1Czôè¡Ë±Ýgš/¦#@ h:$ŒÈï õëÖèz½8ÔËýãOâzùq¿ð²8gÏãòÖbôì!F›ËÖS  È"píµ×JûöíeÀ€ž†AhÖ¬YS SOäÙlí;'ÔL“ ÁšáóÏ?—[o½U†ªónÙ²eºEOfZ¾gM€ßÀY3bŠ|LÀ¸ ®ÄL$1׉ã‘qg†éo¿Cûu=3GÜjr9 @dxòÉ'å‹/¾¿ÿþ[7¬k×®òý÷ßË9眣çsþòË/2}útø,Uª”^GÂþùÇ3ÄîKä믿–víÚÉàÁƒ¥qãÆòÁèy¡¾éxž= ÙãÄTùœ€‘˜(ŽÞ=%ö‹%æÍWŸ¨¸¦>~Æ•“¦w¯ÿ>Ÿ·Õ' 0 ˜CñN§SG•V W!k×®-Mš4‘Ù³gË„ ôµž={ÊÚµk¥nݺҩS'iÞ¼¹™×;†Ý1´U«V:Íyç'¿ýö›WždŸ‡à³ÏŠ)#„€Ñ¼™Ä¨—{ß~q/~M\‹^çÛ_çÌ¢¥.Å(RÄ«µî?wésã?Å­\s x]ç @è 4(]áXdã‰UðÆ Óî“ PÍ€yž¿þú«`¡R™2eÌhý¾~ýzÏ9V½ÃŠ ·L%K–ÔÖÓÇ{L_ß·oŸ'²G€Ðìqbª$`”-#ŽA”+§/Åñ‚šªVï»#ÎFÍÄ9z¬¸·ïЭv*rcw}ìxþEqV¯M£ø<°I$@‘O 66V¬âÓÚb_ñi½f=Æ=†îòF€мñãÝ@Àˆ‰Q¾K;ˆ¨—ûÏâZxÖ•“rl/Ê‹¨-@Í`¤¤ŠúäQ>Oo˜—ѽ“ †ï$@$@$Q'@aŽ·šä5«,Ü0ä€g¶’fX‡lÝ™?¥ã›?ª}¦–ÕªŠcÌHq,î÷–«÷Ó×ÏË?ÿŠ{óV‘‹¦¿ õ¤(§ìg“¯ûÎO3­m²ûI˜h~¦„£Ù_x7’q&™ØÜuº]vµ Íö-Ë÷<4¼D%UÔår ¶Ü:räˆDãèQ¯ó`žÄ«Ì1)ú¨e³=Ö¼Ñ.|˜ELÛ”sý"j®§qv»µ­.ÕÎSjagÍÖè€<-ö¸ ÁßGÄôÚ…pâÄ ¯íö,I~h¤Ø÷™b.²ˆä¾Ã–‡v yºÿÛ‘1àÏ…o†x6SRRlý»‹÷þ\Aù $ Q%@áH6Q­†N7ÿãT²mìñ§Ž9( Å‹ÛV¦]AÜã˰xµ-­Æ9"?mK‡Ð¡~@$4j(FÛzRì{F ^ B#©ïÌNÃ~·’"jav@±#q'í(F—¶á³-û.99Y‹³¢E‹JŒš*cGpÛóˆè¦`q<“ø^²+ø~ÿÙõ7aWûXNþ!U4ÿt k.ÆŠëì$¯:Ýu§U*{Eñ„H€H =ŠÓÇ1†¸ Þ¦gÀ½s—^à¢L„¢~Òëc÷¡Ã6•ÎbrKÀq‰rÙôùJ‘šçê,ÜpÏT VŒÃÞÓ8r›?ï#  h$@ ¨M½îlÕVÔ§@ñ;.§zwö–˜‡ÇÚT“[FíZb,[Üu.ç¸ÑRP­„w'®Î׊£õe¹Í–÷‘ @TøûðÞ€·³B šUÕæ )@mîXð¼ˆK-ÐQ  0ç¦p\‡pmbèbŒ^=D–-×°‘b(ë¨aÙ+8Ðe1?  ˆD 6õªã²Vº¤Tµ[Bµ ÑAÑbùÀƒÕ¸13gû+Å5áQ‰™69ð…0G  ˆ`œÁ˦€¡VÇ;F ;³•皯‚Ws&  $@Ê&ÙCÀèÓ[¤ÑEâ:BÜ'ís»cOëX hðØ2ç'`(ß‹1OùwŸ¸á­eóH€H€H p(@Ç’9E!£VMq {@Üjßx÷ºo£›L$@¡'ðÃ?ȳÏ>+ýõ—We°ÛÔsÏ='ß|óW|^OÖ®]+[¶lÉk6Q}?hTw?F¿¾"Öç5oã®Z¨;ó  H ðÑGÉÝwß­E¨µ=«W¯–¾}ûÊ’%K¬Ñy>^¼x±|üñÇyÎ'š3 æÞgÛBÀP[Æ<>Uä¯=âzL É3 ØN iÓ¦òÆox•ûÚk¯Iƒ ,›7o–ãÇ{ẫ]»vémaÍsßwl»uëV9vì˜ï%žû!@ê £I 'ŒóëˆcÐq?÷¢¸¿ß˜“[™–H€H êÕ«'±±±ž¡ñ4µùËçŸ.:tðä~þùçËž={ô¹SíLX¶lYµGLšÀ¢yñÅËØ±cipŽAÙ¼ys¹öÚk¥M›62hÐ oýï³Ï>“êÕ«ëkÕªU“^xÁz™Ç~P€úÃhÈ)ãÞ»E”u>0TܧOçôv¦' È#›nºÉcýä“Oä²Ë.“‚ f™+DãÔ©SåwÞ‘wß}W[CqÓ˜1c¤nݺ‚9¦ëÖ­“ŸþYöîÝë•ߤI“dÑ¢E‚òpý±Ç·Û핆'é P€¦gÂÈ£@‰™©†àÿÜ)®i3s•o" È=Ps¾'†ß»wïž­Ìzõê%xuìØQ Í[o½Uß÷í·ßJ§Nôqõ¿bÅ ©Xñ¿m@1„¿fÍY°`¾ĈZ¼zÑS¶‘ÏQ€æ³cuÛ€Qï1ô÷¼ùâþasxW–µ# #P»vm‰S[]¯_¿^ IX@­;ÙaÈÁ:×ó¶ÛnÌó¼å–[déÒ¥Ò²eK¦téÒ’ššªñßÎ;%))ÉsŽXXûôé£Aa!Ô²eˤV­Z^ix’žhz&Œ!<p ¼O¤æ¹â<\Ü))yÊ‹7“ 䌬 ýû÷—+®¸BÊ_³5”,YR~üñGõÁx.]ýõÚUSÏž=µÛ¦?þøC Ï®]»ÊÛo¿-˜/zZM­jݺµìS[j›¡L™2‚ÅO¦Íš5“ªU«JïÞ½="×LÇ÷ô¼{&ýuÆ ä€¡~ ë¡ø¿ˆë‰§sx7““ ä…@·nÝä»ï¾Ëpø}Ô¨QÒ£G½2n”`áD:t¨Œ=Z‹É-ZÈÌ™3Cî]ºt‘ÿýWjÖ¬)7–H5¼ª7aÂ}ï…^¨<=ðÀR¾|y¯4ÜsѺhâĉžkŸ°ž:uJŠ+承ôÒKeãÆrèÐ!)^¼¸ÇrŠ4X\täÈILL”˜˜}Ï3Ï<ã¹÷’K.ÑPÌ…E”!{hÍ'¦"p Qî:ªUUCñÃÄ}vÎQŽ3á $@$@%€9›VñiÍCô¾Ãö¸QjŠOkzë1ŧ•FÖÇ Y3b È£p!‰™¡Ôÿ¸MÜOÏÎU¼‰H€H€"‘h$ö*Û6Œ&‹Ñ÷q=9KÜÛw„M½X  % ÐPÒgÙQAÀ1|ˆHÅ ÊA½ŠW+)H€H€H Ú P€FûÀö€¡|ÒÅÌxLDùuÏ}6èå±  w\î=Äú…”€¶XîþKÜ'Nœ©ÇÁƒâV;IÉb-šíºÍ›‰ÑëvqÍxRŒŽÄP~BH€H T(ñßÎAÑÐ^¶1{hÍ'¦ŠVûö‹óÒÖ"®Öb›¡ÏÝo¼™c"ŽQÊMH™Òâ¢Ô»\9¾Ÿ7 @¤ 4Rz’íeét,|Qù”sÉÑ£G%>>^m»VHŒÚ5s\žQ¤ˆ8¦MW÷âžÿ‚ýúä8Þ@$@ùÀÞ½{^eë~ìÏœÚB€ÔÌ,$¿0 )±yykq)‹eªr2ìVÃî5§3·ÁѪ…¸oí.®©3ÔP|{1ªWËmV¼H€H€ò-L‡à±“¾x³ó²î:oi°â$`ÇC#EJWCñ#¼vë°¡hA$@$@aA SÚ¬Y3íùÞÿ³zak+ ¬ j;7ÇÔÉ"߬÷K ²¾)H€H€H Âd:çwÊW\‘­&_pÁÙJÇD$@"ŽË[‹»[WqMš*F»¶bT©L,$@$@$52 wÝuWÔ€`CIÀnŽq‰ó‹Õâö Ä¼öŠÝų<  LhÈjÅ‚I Å‹‰cÊ£âºã.q½²X·Ý­fI€H °RSSåÅ_Ì0ÓóÏ?_ ( … –‹.º(Ã4Œ l Ð 6èÚ5jÔH¿ÿùçŸòÄOâ/»ì2¹ï¾û¤\¹r!i?†’²Y( ä•€C­„w_¸™¬VÛ·CmÙÉ@®öO@IDAT$@$}NµÅñÆõ »ví’o¾ùFºuë¦Ïd¿ò`R¬X1 Ðì#µ%e¦«ß;wî,ï½÷žŒ3F @O¨a®¹æÙ¹s§´jÕJæÌ™#+V¬Õ«WK\ÜÓ˜­=uê”ôéÓ'Ýêà Ȉ#Ìdòá‡Ê| ?ýô“Ô¨QCî¹ç]?O@>!àxxœ8W¯×ð‘óÊKù¤Ö¬& „X7¡E  þúë/Ï9â [¬†ª?þøCRRRäÜsÏ•ØØÿdo<,«¸·xñâÈFNŸ>­_EÏî‚Øï¿ÿ®|C”*Uªè4ø÷ýüóÏRªT)¡¿R–t™®‚Ÿ1c†|üñÇ2eÊ>\íâ¢â ú Jßÿ}ùî»ïdÇŽòôÓO§Ë<7èLü‚¹ä’K¤]»vž—Õt¾iÓ&™:uª´iÓFæÍ›'0±6L~ýõ×ÜÉ{H ¤ 8»Ÿô°¸?_%®×s¾ÃRH+ÏÂI€H Ì Œ;VÚ¢šðØsã7Êý÷ß/X< cš¿ø¯¾úÊk!öÒ¥K¥W¯^:ýáÇž‚F‚a¬ƒ …ø­W¯ž6˜uìØQn¾ùfžÿ¥'ðŸôOM[6!­–Çwß}Wš6m*­[·ÖwT¯^]wкuë2È!çQ¿ýö›¶¤Þ{ï½^¿X¬9MŸ>]‹Ï.]ºèèÁƒ Dé’%KdäHåc‘òÇ5W‰[½\£u+1Ê•Íg-`uI€H ¼ @4Âp¶oß>½«ÝsÏ='Ø¥ ÍŒâ3kÍo¼! 6”¹sç ¦têÔI¾þúkÙºu«`Ä×ae5j”$%% ¦0xÈÔºeËiÛ¶­çt„^ûöí=q8¨V­š@8"ÀŠY³fM->3rnÇþ·–ײeK=ïÃÇcÈONPþ™âzpt~ª6ëJ$@ù‚@‰%´Á †³Þ½{KÙ²e¥yóæâ/>³FÁཋ(\VB›¼ùæ›Ò¡CAî /” &èr(>3&™©óöìÙã¹óÓO?Õ»"YE).b®C­Zµ<éòr! §÷“'O–U«VIµö 7Ü ÍØ˜ÃaÖ§L™2^Å`®Å‘#GtýêKœò£tiqLœ ®{Šké;"]îÉoM`}I€H ¬ @$nÛ¶MÞ~ûm8p 6ªaˆ>£x ­ÃºiX2­Cì0~™Bâ:úå­·ÞÒ÷Ë/¿ÔVQ3ßÏÈT€bÞ%æ€bâm!µ'öÂ… õ¤ZÌÏ4¬‘X€ôÀ˜QyzGÇ¥¥¥é_ýû÷—åË—ËìÙ³µ)»gÏžzB0 0'›…%ªÝe°hêèÑ£ú× â±ò­_¿~fýk –8à‰ÃãÐ!¯ó`žÀª‹…V0ÍGZÀ*ÚwÈFžv14­ñ˜Žþ ZP{ÅÇ©!ø˜1ãåhý¶â,U:hEY3Æß\¤÷ÝñãÇ=ŸÖ¶ã؈³ï3}‡‰wøLG€qÁºˆDGé?wÿ¼}«ŒÏÌääd½hÅ÷Z°Î±`ÆP~´„ÿýWOß[¿~½‡{&Œêú‹Ç4?xý1‡Ð±øÙ ˜KúÑGÉ Aƒ´›§®]»Êõ×_¯Gb×®]+Ï>û¬AÆ:äayo™ ÐqãÆéùž°n–VÖ¸9€D§a•×믿®(ÁJÙ·o_ïœsq†RL ®ZµªžÄ‹,0¯nž,X ­ °Ž"øZ9ÍsóÃi°º­víÚ8Ô¢÷[W½á‚q6Ï3©‚û?¸¡®f;‚[š½¹CÀà #RÛ†gËŽ¾KðÄ^ÛEÊO%ÿ<ñ¼-ˆ~‹Ô¾3EŒ}gv–Ÿ)¦…&ÿîÀíCßáeGpŸùб£(ml±ó¹D£|¿ÿìâj Ð, »ÈÛn»M.¾øbmÄ‚As5ýÅc‘;CGÀº ‹è?ÿü£K›'X8añ„>BÚîÝ»kãÒ«¯¾ª'Ä= y°”2¤'`(ÑàNý_Ìš5kôJs }c5—¹;¬ˆÇ<‡çŸ^7nüßM>B'Ãï(ÍâÃnšæÏŸ/uêÔñ”ôÎ;ïèúp AœQÀ/LnÒ¤‰÷å½{ŸñÌœü‰sBð+ñäÉ“ÚÒD„!É"uXÞán,«F¸–¼%®ACåèÜErúÚ®Y%ÏóuŒ@`c*K¤üèƒuSŠ0’cG0âöÚQŒ.mƒˆ0]ÅØV° á Ï&¾àíØvZ@ñ=Šg#xv_·@£G–!C†HÉ’%ƒV,ô tðmGNò7G{|?ïüÅÃ]ã›o8vì˜vÃWPÖ€ïBäçOXÓFëq¦P@iÑ¢…~ùBÇÁgÔ >là R¥J^_òñññº Á˜ŒïpÎñGÌÎTo0ŸPpÜØUN½»RG’”KÕ¾ñ%#O†’/Ë&ˆ^V-a¥à/>³w¾ÓÍüLÝbžó==,Ç4>ûì3m‚†ðƒ#úE‹é\ÐQÕ(>‘)Ä'V¦Á×–5`2/¬N•+WÖCôØéÀpnõj½ÆcÈŽO­<'Kâ˜À̯ΠXg  È$©ÅäYÌ]ؾ}»\~ùåÚýæO`õX0v%À°:ÜÀÜ>½üòËòí·ß깪€ðÅd_L†“X,Â,^ÂnH $)\+KҸǤð»oHÁ–GJ³Ø  L‡à1ç²|ùò²yóf=b‚Žà±Ú+ÐârâĉzaÓСCuö°|bõûí·ßî) “vïÞ­W±aN(ü"½u+,Ob@>&|ËRxÙ›’øà}r¨é¥â.^"·†U'  32 ¿üò‹Þ «¿`„õ"1X«ÑfΜ)p™‚Éç˜hì»J«øà¿ëî»ïÖî9p D*cÓfKÉË/–„qCåø“ö¬ŠT–l @xÈT€BúN°ÅÊw¬äƪ`_aÈ&aAQV+!ˆ)>Iy…#W•êrbô£zAÒéëºIÊåtéŽýÄ:‘ dL /+Ö3Α±‘@ Ó9 ™·ßsë5“ ‡À©žý$¥YKIÞ_ŒãÇ‚Ss%  ›d*@mª‹!ÈŠ€ú!x|Æ\q>$ Fd•š×I€H€H ¬ d:šcTlUe8ãFÀªxkhݺµŒ?ÞÅc pV?W’|XÇ“äN7Hj«¶ÌY‘ €}2µ€bïÒsÎ9Gï>„Õæxa·8§7ÏÍws»;ûªÎ’H úœºó^IiÜLŠSCñ'’¢[L$@$2µ€bëJ 0" ¶\<>ãY)Ù¡‰yt´$Mz2Œ*Ǫ @ödjÍ^LE$`'gÍÚrbè8‰{yžøzµE³,   Ѐ`d&$`/“ýJZƒ‹%qÈÝ"§NÚ[8K#  < Í#@ÞN!!#ÇfΗ˜½»%aÊØT…’ @n P€æ–ï#pžWWN<0ZâžF ¬ÿ:ĵañ$@$@$} ÙgÅ”$vNÞ;TÒ.¸P Åß%’œvõc…H€H€H # Qa ä±±rüq5¿ó)2}B~©5ëI$@$å(@£ü`óó?X@O.ñóž”ØMßåÿ±$@$@O€4⻘ Œ'îPœµÏ—¢ôII‰†&³$@$@ù˜h>î€0™ „¤Qˆ«\Å3CñÊÂéŽ+ß¡¶î‘ãWu–”µôñá_û&ã9 ”h@q233ñEäØô9»á[‰{ö©0««C$@$­(@£µçÙî¨!Ú¢$ßÖG¦—˜ßšv³¡$@$@áK€4|û†5#€Hzh²¸J––Ä!ýDÜî€åËŒH€H€H 7(@sC÷@>#àV‹‹ŽO›-¿]+q/ÎÎgµguI€H€"h¤õ(ÛC~¤´î §nº]&=$Ž]øIÅh  > Ðà3f $6’ÆMWÑbRtè=Š›^aEH€H úP€F_Ÿ³ÅQLÀ]¬¸ì)¸ö )üÊsQL‚M' % ÐPÒgÙ$)í¯’ä.Ý%á‘‘âØ³+5`‘$@$@ÑN€;!EûÀöG%ãÏR«?•Äa÷ÊÑÅïE%6šHÀ+W®”}ûöÉm·Ý¦ LMM•×_Ý«p‡Ã!%K–”Ò¥KËE]$±±”'^€"ð„=Ê&‘@VÜ%JÊñÉOI±¾7Ká…ωãÐA1ÔvœÆñcâN,šÕí¼N$@Ù&0qâDùòË/å–[nÍ“'OJ=üÞÎ9çȨQ£¤OŸ>~ÓðBþ'UÔ¥¶"“““¿#-8NåbÒ-‡mäiC´ œè?;Âa)Übš_&1­ÚJâÈâŽ- †ê¿2uÊÊ®—Ê©&̓[¶¹›}wâÄ Ývm$Û÷™’––&†aDäß>³Ž=ªÛhGß¹OÙQÊ™2ð™yúôiAÚ öþ\Aù¡ —\r‰Ìœ9S¾ÆßèÖ­[eܸqÒ·o_míÕ«W¨ªÇrƒL ª(~y-ZT›ù½¸&Û÷ˆa|$$$xU!N’’’ô|‰%"¡9^mÀ‡ãþýû%>>^âââ¼®ëä”—£q`Ÿ$¨ax#5ÅÓŒª½»Èáw>—Ô¡ø±‡EŠ‘B… yÚÌ#Î>ƒ¶á³­xñâÁlRHòÆ=ˆÏbÅŠILLŒ-up{ë³ –yàÀýL&&&µkææ¶»þ&¬ešÇxfÿ÷¿ÿ™§ú½mÛ¶rùå—ËW\!”6mÚHµjÕ¼Òð$2pRdô#[A9&Pø­WÅ ƒ­7îÙ'sœo  @¨_¿¾<ñÄzÄrΜ9È’y„! Ð0ìV‰ì àØÿ¯ ¿ªð[6JÌŽmvTƒe @::uÒVïŸ~ú)Ý5FD¨‚Œ.c+H 0œµÏW‘qœHòÊPÇ_»¤T›†â,[^RÔ<ÑÔ–—KÊ¥­ÅU¡’WÚp>‰ùùGI7T\jž]15 [ €8Ô0nÒðñ’vqÓp®:ëFQOSÊ”)#?þøcÔ³ˆT´€Fjϲ]$äk»*SgAq«,f€øÄÙÁµ?Ê‘–Èé«®—×KÑwJéÆçJÉÖI˜ÁRð£åb;jÞžïJlº•ÀFHøîk5ÏUŸÓ½KxökE> ,(˜'Ë™hÌ~e«H kqñr`ÓN)qE3‰Åp»ZéŸv~=9öì«âªVCRðêx­ÎÇñÏ^)¨,Xó¹úð‰q¶¸Õ—´†M$ÖQõJm¤¬Šê #\‚³V9ªD´{Ë&)¬ÚxlèXUO ð'€Åƒ{ö쑺uë†eYÃ\ Í6ÞDB@ Kþô{)to/)ôÓrlå·ÊúŸEÔl¥«|EIîÖC¿‡ù¡¿üL½>•¸çfI‘'&‹»pœ¤4o))-”UB/­ný ó2óä; ø#ðûï¿ ÜTÕ¨QÃ_Æçs ù¼Y}‡†š‘“øÌ(Ì=…×÷Šú–¾•¤ÊBš0å!1yP\%K+Ëh›3ÒmÄU¥zFY1ŽH€Ò0ýƒvéÒ%Ý5FD ÐÈèG¶‚BG@͵„ÏP¼N-¢vT*øõ—Ú: +i¡w—èy¥iÕÏ=³˜I‰Ñ”K.wÉR¡«3K&[o¼ñ†ÌŸ?_ªV­*Ý»wÛz²by#@š7~¼›HÀ—€š[šryGýÂ%ãàþ³ÃõÊBúùJ‰[8_/|J«wÑóG›\¢œÚãàß·º<' ¬p0`€.Ãí{÷î•;vȶmÛ¤T©R²lÙ2) ¦ 1D& ÐÈìW¶Š†€»T9Ýù&ýB¥bþøõÌp½²ŽÆ-~AŠÌž!nµx)õ—z†ëÓ.l¤|AÑIGØt"+BA °sçN™5k–'çÒ¥KK¥J•däȑҿ©\¹²ç"häõ)[DaMÀyNMÁ+ùö»DÔ§±Êéý™MŸI‘Ç'JÂä‡ÄU¬¸¦×þG[¶gšaÝ&VŽHÀ?Õ«W{]ÄÖªnåuƒ!º P€Fwÿ³õ$ZpåÔàbý:yß0µ÷wõ_yi¡ÑƒÄP_TΊ•µC|íòI9Äw—)Úz³t  < Í>ÞL$P… ë…J°|žPGKÁµ_hAŠUöq¯½¬‹K«sÁÙù£j—¦f-<ç}ëb?&…•ßR„¸Ë$Y‰]wÑb¾ÉxN$@$`3 P›³8 ìp/!§¯¾^¿p—cÏ.åþG?“ÂK_“øùO‹[íl'øÚ>â+çø‚ÝŽN’Rj÷&q¦é‹,zA_š+û•ó}ZP³ßLI$@Á @ ªÌ“ò Âo.’˜Ÿ·êy˜1öK‘‰#Å]¼¤èáð0lƒ«RUIîÞK¿°sS̶­g‡ë?Õ‹™ŒèýíS›µÔ»6§“µ (4Å­8Õ{‰.íäÐgÔ6¤\]†]Ì*‘ D  Ð(éh6“2"Pà»o¤à§+Ä–ª-‰…ß}Sœ•ª„­õjƒršïT»-«ß@µ×{ªrˆ¿îŒ UâÓ¼{<9ÇÞÝz»Q3žï$@$@ö µ—7K#°"p|ÊÓº>G•´´4í{/¬*˜“Ê(‹fjÓúuê¶>Rò²‹ÄH:–>e95NŸNÏ  ÛÐÑžm¨Y €]\eË‹[¹zÉ(8Ž§Ú•‰H€H t(@CÇž%“ ‹€rïtô…7uAóýàûkE”ã{  Р {–L$DiõÈo~–ä6u))õŠÛ#…W¾ÄR™5 @vP€f‡Ó äK®*ÕåØˆ ºîGG?*'Õb¥xµõgÌ/?çËö°Ò$@$)(@#¥'Ù , œ2F\å*Jâð{nœH€H€BC€44ÜY* @(ÄÅËñIOJÁo×JáEχ¢,“H ~þùgùðÃÓå¼páB9xð`ºøìD¼ÿþûòì³Ï¦{ýþûïjŸ‹S2þ|ù÷ß½²úþûïeÅŠž¸ 6È¢E‹äï¿ÿöÄá Ym;üÞ{ï ÊHIIñº¶yófyóÍ7åÄ ì÷_Èìž­[·Ê;ï¼£óýïŽÿŽ^}õUíé俘ÿŽPÖ‘#Gþ‹°éˆÔ&Ð,†H <¤´½B’¯»Q&ãÀ¾ð¨kAQL`Ò¤IR­Z5)^¼¸\rÉ%ò×_å˜Æš5kä©§žJwß!Cd×®]éâ³ñøãËk¯½&7nôzA¬ÅÅÅ Äåí·ß®SÎŒ¦ Þ×^{­ÇÝ€¤_¿~òÅ_H£FdûöíºXË /¼P‹ÌÉ“'ËÕW_íÉ£cÇŽ2räHùî»ï¤Aƒ²råÊ,ï¹óÎ;eðàÁòÕW_Éyç'ÈÖ0kÖ,¹å–[”«äTk´>~ûí·åÆo”þù'ݵ`GÐh° 3 °#4~šòÚ@Ç‘c³†]ýX!ˆÓ¦M“‡zH\.—nò×_-UªT‘õë×KãÆŠ –ÒR¥JIÅŠ½ò†%¯sÎ9G=×zöì)xe P!,!|ï½÷^éÖ­› >\š4i"Û¶mÓÉ;wŠCyå@Ú©S§ÊóÏ?¯¯¸â `nÞ¼¹|ôÑGRL¹ŽÛ³gÀš‰€öϘ1C:tèà÷¤yë­·´€,\¸°Úà­€¶ØN™2E[<3—°ÊN˜0AÊ”)“Qó‚G hг p#?¡Ic&Iáw—HÁU‡[õXˆ °B°™âÓÚèAƒYOó| ëd½zõdĈ+ãÍ7߬óÄ;w–+¯¼R`-…ø]¾|y¶ÊƒtñâÅ2~üx¹ë®»´3ë½eËiÑ¢…ŸÈ¬M›6òÍ7ßè|øá}nb^kÚ´©¬[·ÎŒ–x†áýÝ«q¡B…äã?ÖS à«V­ªó€àF»¾üòK1ÔÎqÖ«íwÜ!Ó§O—"EŠX/ÙvLjjD$N’o¹CR7“Äï5¡+œªÆº@T€¨‚€Ê(@Àå4@„Ázi}AÄ!|ðÁzHY¹reIJJÒ–JX1œŽûG- ,ð=jÔ(¹à‚ ¼^­fhذ¡ôîÝ[ß3gÎ3ZþüóO)]º´ç¼dÉ’žan\ƒÖ æ5XJM1ÁŒ© cÆŒÑÉüÝ«-ž×]wϧÕ.o}ûöÕ÷@ C#oxúé§¥víÚÒ®];ßK¶S€Ú†š‘ ØI æ§-R¼K;)1ìq)>a¸>/°þë3ÕPãSgë}á‹ÌxÄΪ±, E",&&&CÖað dyùå—ëats8ï¦ÐÃ06¬‹˜{‰agˆÆ„„©_¿¾¶Âb¨»G2oÞ<½ÀÈÌþþûïÌ“´¾¬‚nïÞ½‚>È‚Ñ Hcª°F¢< “û»†ë?ýô“´jÕJÆ'ªGðwϦM›´àÄû¾}ût=`ÙÌ,üøãòÒK/ †éC(@CIŸe“ €ÚíÈU¦¬8á ´í•’vNM}î.TÈS¦ó¼ºròÞ¡ÿ쓳í̼+ÏE •æ>Âú˜Q€å.§b6>>Þëe=W¯^]~ûí7™9s¦>|XP6,°Ÿþ¹´oß^QcѦXCùòåµ¥ÖBóe^ÇÔ[o½Ue/[¶L¯v7‡ï+Uªä±x"=ù ˜j]ôƒcÌ=EÀÜWÔCãX\d÷¬ZµJ/b‚°†ÀÅb$ë*|ó~ëû믿®-¿åÊ•“¢E‹ æ©b.©¹àÉš6˜Ç Á¤Ë¼I€BFÀYó<96o±š½@v)KçÁY/ëó´ yÕéÄýj‘ZtxQ“Ѽ®ñ„H x !¸`ñÄp<^°NŽ;6 ¿üòËÒ¿iÛ¶­Ìž=[êÔ©#ÖÆœI CC¸A„aˆ>£ÕâUæá‡ÖÖRXT1wùÂúA ‰¼ùåßsÏ=§çž"Ì9E}Nž<)° Âæâøšk®ÑóJ»téâU¤¿{®ºê*ÍÐtÙñ‰¸Ì‚YïcÇŽ ^ð@€U÷°Û(@í¤Í²H€€Z9z|òSR`÷÷òÜð«kDLó!İ’{îܹڕР/¼ðc…:Ü1Áµ\ÁâˆÅHvÇ4†¼aÅ5XJÍ1 ˪õ…y¡°œ>ùä“Z,šCòÝ»w×"®W¯^R¢D yôÑGµ¨ÅRX]‡ ¦³Å(XaQE™°¼Ö­[Wžxâ =ŒŽ©fyæj}÷ÔªUK v´«ïáòÉœ7j¶!\ß µ*j¶CYLF'y…½{ós4ð«Ïœ ̲ìκñAR¶lY»‹zyjÙ¿¿þÐÀÄn;Â^©`G1ºŒ£Gê9Iæ|)Û ¶¡ X3:¤-+X-ê/$¼S ­X&‡Vý ®òÞ.ZüÝã/ÞˆÛëïRÀãÑ6,^ð·˜#àÚ˜!oãÙÄb|!ÛÜ6®GÃ<“¹™ï˜[¦ 1ïÇ¢¬þ†Œ†€ï(Ès±Ùf8«sÈÞŒÏë;œÌÃi}FS àOZÀ°Ù)Ëß=h¾ƒí|–²SßÌÒ„µ4#× ™5†×H€H ·’ƪ ùjq@˜r›ï#s0ùŠOT?¾->‘oA5=#ñ‰køÑ˜ñ™Ù=¨{~ŸhKúµùˆ aÀ/8jýä“O´O+XÓ:uê¤'úš…4}úôñì`V¦uøøb  œp—*#Ic“¢ô•ä?”ö™Ï£ÊiþLO$@$ð° p…€í¤°mvX»v­¼øâ‹z¯TÓ·¶™Â\Ž›nºIg›ÍÁª3 È-än=¤ð %qÔ@9xée"ñ¡qМÛúó> È/ÂJ€bþÜ`²ím·Ý¦bb.\ÀÅ)@1Aóð°õU0Læù¥óXO À8>e–”lßX'I¦¾æH$@$ a5s>‡ª]Xû¦B… zq‹9'ô×_•š5kjñEk¨¬HxL$$Κµ®™â^˜-±[6©fK$@ÑM ¬(Ü`¾§u•Dç§Ÿ~ª]`¥', X9yòd½Ïi×®]õN£Ñý0³õ$(pNïTŽë‡)ß Ng ²e>$@$@g „Õ|F½ç­póÈ#x.C€b+xþ‡cYì<°pwгgOO:øÝš6mšç{¤ÂgÜXƒ¡Ü|Ø ’Qg~©¡OÐ>¸M‰´`þ¸Á8KðŠÄ¾3?'á,Û4@ä¨#r‘ØN7Lx6ñybgßa¸5Øõyf-“Ç$a-@/^, .Ôs?áÈ"{³V­ZUêÕ«§ã`5½ï¾ûdÁ‚zþ¨éë_ªØSÕ Øv ÷ûîràPqvóCÕÎ2í(Ëü¢ãH ¦Eß™ÇÁncšØÇ}‡vErß™mÌn¿%5l"Gºt—ROO•#í®’´òÙ_ähØø7`>‘Øwæg þîÌãìö_nÓ¹íû³Ósvø~ÿÙÅ5·ýÁû"—@Ø ÐùóçkA‰m­n¿ývOÀSFÛLa+ìëº{÷n=?7À…Ó;ï¼ã¹Žèáw«L™2ž8}jß'N48¢Dgæø†%NƒírDZJy?§A<ƒ&û_¸pÖyæÓì¢L{x†ÈªO¤ê´ñrô¥¥Ù½MŒ¸ÓÙN›×„Ñàˆ»ÊÐ}^Ÿ”3÷û~ÿV;1@(ü¿½ë¢ê¢7T„R ½÷&(‚ô. ˆ Š(R¤)½(MDl `A¥Iï(  ½÷æOGzKIö¿ç…Yv7 $!»Ù™½ïûvwæMyï;3{æ¾[œÊT@#ŸÐt" –eÁœ0jY´iñŠ·DE–Aài0e ¢Ñ“È›ã‚z¯L>}š6åXA@\§#  .TšÏÁƒÓ+¯¼’@—.]R¤tñbë?ƒ¿þúKi¦žyæ™ÇH… ©E ªU;Š®]F ·û©='‚€ `€SMÁ#/.´ŸÅ‹Wé«6lØ`ÑU"L³?ûì³j;ˆ*B1-ZTÅݵkuêÔ)ÅSlV ÈŠ ‰ pÿÓi”õÅŠäÿÉ ÿE"{H• ‚@Jp*ºiÓ&5µ~âÄ =zt‚qÔ¬YSåp;v,M˜0AÅ ÅN°Éƒ÷»¥­h‚ƒ¥BT"W 0…õ®hdÛŽS±j*Ï$‡ ‚€ §" ˜rOlÚÝVTðfŸ2e …„„¨ðˆê¨¶}‘uA@p ÂßéC>¿ÿJ{Ðíµ;øééTOׂŒRH(®Îž=«bƒ[î‚H:p\NƒåªU«èòåË–§SËõë×'$È™;w®Š]N¢•½{÷*‡ÕF©ª}ûöÑñãÇéÅ_TÇhûÁŸ³¼à./½ô’šõÕ¶íØ±Ce€¬W¯eË–M«VŽ¢È‰ºªU­_‚“jþ2Z; 4°jçÖ­[ôÇPíÚµ­â¯›´ó‚ÓÙ€¦d¼ðj…ͧϔ &û ‚@ªðò¢û¿&ãGÈïÛ)©:…$ ˆýò+Š)Všbr䣘FÍÉtíZžP³uëVúòË/ì5`ÀºpáB‚úäT|þùç4oÞ<Ú¿¿Õ±Ä1ó Ò‡™W-|Tš7on&»½{÷¦wß}—6oÞL+V¤“'Oªf“qÌ-Z¤ê4mÚÔ|ŽÆÓ¤I“hçÎT½zuåtƒªqÌ×®]K“'O&S­$ÕŽÁ9ʤ6×b!¯X±‚jÔ¨AGŽQ±Ô]äÞшK{‚€  [b*W§ˆ7Þ%ÿ)ã)²E[ŠË_H·c‘Ž ΀@ì·3ÈÔgÀ£®¬ß@±¹ ÇÁÝäV¶Ì£ú4XBH6hJ¡ µÌ¸ˆS_cÒ‹O¡B…TÈ6­9˜÷Y&¸Ñêñ ‚ b âÛ³gOzõÕWiàÀT¥J¥õDÈóçÏ+%ö8q"Íš5K ©F˜A×­[§â›#1Àš5kT3˜åýí·ßhĈŠW«VÍ| ü_@€A„“j¡'+W®LHèƒÓÆ={öÐsÏ=GÓ¦MS¦ŒmÚ´!d“ĉ}Yt­u$PÒ– @ lðhŠ ÌD¿/€‚ÀS `⬆¦÷lî#Sü cßïÿgNx(´“H^3hÐ jذ¡JZƒ½ÿ¸U«VjêÚÒ|ùò©ìŠ Ï°ä s>úè#zçwTŒñ¾}ûª>¬ˆž6C 'jL­£ f9Öµ¢mƒ†©ÇQà”ý÷ßS‰%ÔzÁ‚•±Îq<âR#ÖùãÚ©mÖ¬™Òš"cäðáÃUŸpÂÂ… +Ò ’ ­*’û8ºˆÔшK{‚€  kLL>CÇN¡Lït ï%ó(ªu{]G:/¤¦½û‰2g"º›HêÚ}RÜ-Ø:Â4ϲ`ºeõêÕT®\9Z°`J:tèP5­ »ÑL™2)m"öCúndUqCÁ~Ð\Z@$ÅA©P¡‚ m¦åTÿ¹sç¬ì7ƒ‚‚èêÕ«êl³´IÅ6Ä7×Ê/¿ü¢2@B{‰)}L¹CŠixhIÑ'˜ >®دb:û!86´¦þþþJZ©R%•mñÓ¡ut ¨£—öA@÷D5mMQõQÆ’ÛÝ;º @H²q¶7$ô`™SÜ%8úhSéÚ¯Fôà€»JØ^~üñÇŠ4"³]™2eÔ´9ì*Êñ»ï¾³Jtƒ„8K–,±úhä¼r劚&ÇyÆoî3ö±L‹é´‡âÅöäImÃöŽ;ªq`š}B5jݹsG9E>}šfÏžMË–-SD8©s¡¾|ùò4þ|5M”æ¿ÿþ»:ßóÏ?¯Æ,xÐâbZ^#ëj| uÈÒ„ O¾$·°P ;Ôxƒ“ @À­j"¿D[rëØ!ÑúÇU"]+²"Z~´ìˆ˜Âþ—§üADv—Ðd"ü#¼Ð±œy`ÃiYråʥ⃠jm;R4ƒ,"e8œ| ¹ÄT7JÞ¼yÍO¬Cû‰> ÀþTÓ†b˰=Åô:4”(Ðä¾÷Þ{æ)yLÍc„ñÐÑ.¦Ø×4ŸpBÒ ´µˆ™ÒŒl>A†[¶l©L°Í‘E¨#Ñ–¶AÀ0ÄåÍO¡?"Ÿßæ×® 3.ˆ à(ÜX#è±ûὃ©óŒ¬!Ì’™Ü^mKƦi7~üñGE¸0• o$¼ÁôõöíÛ a•ú÷ï¯v0Umer œzæUØŽâ¼ £ ” µ87´•8`{Š›Sô'<<\A„{‚(ì1[´h¡ê±¼äa6€‚©xeœá“^êqíÀÁNL ʘ‚‡ÆšN`$òAÈ(8JAclIVÕ; µ3ÀrzA@0.]{RLér”ñCöe»,)‚€ 2ÜØ‘Æãþ rÿy6¹ODV“Çü¹);I2ö†‡:l4AèŠ+¦4Ž „˜â>zô(Õ©SGiE± šR­¼ùæ›ͪåv¡ ƒ_|ñ…š¾Ö¦ä;tè@˜êïÒ¥ eÉ’…ƧH-¦¾¡uýðÃÕiÛ·oOJ£ M,4¯p@§W¯^ÊÖÚJhDá5Ò­[7嘄˜°Ý„÷=(ìG“jçí·ßVŽQpd‚ö6¤hš`8O!ÁO»ví”w=œªYÜ8~ÕCŸ3G6›>m!$„Š VåÊV«ö\¹~ýºšÐlAìÙ–£Ï˜cx£ƒgžÑ Þ áuˆ‡†£nÒ+”Ûa0ÂöBš½”Ãv@CÐܾ}›2gÎl—T½ž÷R–fµ)¬ß0 ï?LÈÍ÷ŠF߯O[ŒÏh1 qm"ð6€#Š)­ķOgooïŽ3öìmø¡aÆ)çW(øí#ŽeAPv` MÙ[n{še8 AK G'Û‚x¢àÕ¶ãÿýLŒ' >C† Žy\;øoÆ3¦ ¶åþýûêͶÞë¢uÊÒ† ˜r•(â­ä?íSòøß#OVÃX&è0[ò‰áàå;­É'Î ²˜ùÄ6¼4Ú’OÔƒ,&F>± ýOì˜Çµƒs%F>q>(UÒ«M/ä¥]A@0 al —-Çíe˜1É@A@°'B@퉮œ[\“…ŒJþÙL>ór‰1Ë A@x„€> zr¬ ˆnØŒ"›´¢€1CÈíÖmÁEAà1} 8²I” :z2ÇH‰¦€áãRr˜ì+‚€Ë! ÔåD.{!—;¯Êï3 yý½Í^ÍÈyA@Ð=B@u/B€ 8o¼K*–£€þÉ"£œ©kÒA@œ! N# éˆ ¡2u`èÛM².‚€Ë" ÔeE/G `Ê‘Â>B>‹W’×9¢IiC§G@¨Ó‹H:˜ž\¹z•<ó=CžùóQîJÉ¿H°ZŸ6{VzvKÚÖ‘Ûуj•(ã#ˆÂ#tÖ{é® i€дÇTÎh 2ÒäQ£hüàÁ<‹j¢Wš5S뵫V3Ð(e(vGÀÍB¦Œ'÷+WÉÿÓ©voNAÀÙêì’þ¥+þ~~ÔçínÔã.ªõk×VëåK—N×~IãúC ¶x ïó.ù~=›<Ž×ߤǂ€ ¤!B@ÓL9• C |@/Š-2öJ÷¸]e› †F@¨¡Å+ƒ§BÀÇ›B?çØ {’ϬŸªkÒA@‰€PG¢-m ‚€Ë#ð NMŠl߆üÇN&÷ÿ®¹<€ ¸&B@]Sî2jA@HGBÇð¼§' ú({!M ‚€ ~x¦_ÓÒ² ®‰€)k…ŽF=?¤ kþ èÆõ]ˆ$Fí~é yŽº.SÜÁÔàçC¾~ñ÷À}__Šåu ¿S{ÊägrÌ%¢º‚k3**JÉ/9}K‹}|KË‚ö¥é€KPØùûûS¦L™¬± ·^·ãÚÍ›7ùOÞ[õÎͤ˩ñ?Â@¶×2\áL6(^^^_(ÙÇo¾ùMëý÷;Ó±cé?ªu#}=xÿÒàÇI2dÈࡹù&Ÿ(Å|Ø›bW®§Ü#>¡Ûyx¤¨ žn|}ñ¾s(/?~n»9è¹bòJüOµó­[·Ô5à8»VÛÿ?GÝO”lH\Š€B‚ ¡øXÛu«i¿‚?‹}Hûf~FŒ ňcÓÆ„!jËö˜¯T{7a>¿kÈÎq÷[Jž)>>:uejÚžügüH=ß6Ë%¹ F}¦0³VàžK¦É.‘ýLŽ»íÔ‹ƒ£egûüÒîýD *AÀ®8ðV³ë8ää‚€ è5ªRdçväÿÉr¿tY·ãŽ ‚€ \„€&)ÙO;"öÑ`2±™@À£ìØŠœZç@@¨sÈAzáälß»Wõpï¡Ãʶ®R´FÀ”9…ŽAÞìùaÙê´>½®Î·bé *S´,õïÕ_õ»á ÕúéSgt5é¬ $€Ф±‘-‚€B i§NÔ¡Ç{jù‡ó)cÑ"tƒ¤i@TÛýbm ü1¹ÝIëÓëæ|…ƒ S§.¨xÉâªÏ 7PëY²dÖͤ£‚€ ðx\Î éñpÈVAÀ7ûõ¥5›6ªðRØÅáŠPª7oFGþÜH¶!MÔFùžIc(¨fCò=‘ByÙK©Ò¥ŸƒÑ®n÷!êøÆë”«j%W„BÆ,Ñ€V´2°´@`Ùºufòiy¾{÷îÑþ#G,«dYHâ æ§°}Ègίä¹{’çô8y†<÷"ïÃÇÈûÐQµìqæI žû’ïÚ?U·ý¾™En·­ã7ëm<Ò_A@°F@4 ÖxØm­üKõ ñ#8è¯'‡A<ÉNmÛÒà^½íÖ¦œ8uœ»x‘vîÛG°û¼{ÿ~¢'¹Å±[wíJ•Ê–¡âÁÁT¢H‘øOpÊ”è1R)$ˆ^o“Ï¢e”±ßPº³y‘gÂGuÆwû‘Ï,'攞÷–ýbQ£ÏEÏ=(Kƒ6äI±<òY¾–²-[K·öm&t)‚€  >Õô?&§AíªÕ(–SΞ7J-JÕ+V¤à‚…œ²¯®Ô)dÆÙ{ømß³—vìÛKÛöì¡«7n(òçÉKY2e¦Ûw×¼4oð]¼|…­ZE—®\!ÓCà²35R bú §”˜{®tu=ÅX™p†LO™µ%ßé3)¢o¼ ²åC¾žDnáäË$5ŽóÈGF¦ÀŒ–»ès94L‘Ot>> (ÿr9¯eêÔîüµÁxõ96éµ ˜j†Â¾ ÓÆS Ì_¾œ½ð2Ô¾ ÊÙEàì… ¬ÙÜC;öBù‡=J1œ½É‡³SU*S–^ùeªQ©²zAÈ“+í=tˆ*7n”à\ã ¦¡ï¿o®‡gü‰3gèøéÓæÏæíÛiÖo¿©ócDZc¥-9eé³ ²‚KnE3˜² ˆ©R"ßzü'~IQ­š&ÐüÅ–,¦ö‹Ë@q™)¦ryC çyâ4Eq No&×–dÔíÌYâ©$âtr–›dYtˆ€üëéPhÒåä!®$ˆ&4œø½þÐ{½à3ÏPõJ•”gùR¥”Y„í™+•-K—øØ7úö¡?·n¥<9sÒè?¤®^³Ú5€SV.WN},7ÀìâôÙ³Š”jõèÉSôûªÕÿëÅä3˜I¨­Ö4Sp&vrò³<,»a#>  «ÖQÆÃéÞï?vôî.‘×?;ÉkûnòÜø7yÙOmà1l„™M3ªÕ˯ è! ú“™ô8 þ=wNÙm*ÂÉö›‡Žc³‡8òåT‡•Ë–£.¯¶cÒYQi8såÈ‘ÄYVçÍ›?‹2/F €|&<âQ l}are1ñ”â…Ë—ÍÚRMsú׎tëŽ6åïFyóæ§"EJX}‚ƒKPPPVËÓÉr"ìÛ·“Þ|³%;‘Å)ûk//O6ð /¿ü‰ž¾A"G8_¦ÔC'Œ¢L]z’7Û„Fµmé|LE2œ6>B;·m¥zÀt“èMŠ·õü‚ hþtâõ‰{öQP¦Õ¦9… íGqLZ¥‚€þª?™9]/ÿ÷ŸrÜ ç)ïÈÈH º¯ÍÀôuZ•SÿþËNBñv›ðN?râ„ÒnúùøR•òåèí×^3k7sdË–VͦËy²gÍJøWÏmÕ~XX(ýûïI3)9ݾý/úí·YËñ¹øúú“%!Õ´§ 'JÂ.ü‰ èJqì ­lçÎM©uëŽ4}ú\«¶õ¸òÌ3hàÀ1tøð>E@Û·“j×®¯Ç¡PègQP Ž :ò ýr‚sÍN<}¤áܱ›Ü9¨¾ÉÃbÊ–¢{­›ÒáÌiMÈ}Ú¼ÿ ü奡öõõ¡Š•+Q·÷ºÑ¼¹óÈtý:z8Ùþø<Ve¢Õ11ÔžbhØÒ•”eÉJºÜ¤>ùMM¦Ü9é X! Ô YI S¿ŸI“¾ý6Á¡&öOM¹¢´› šðLÇïm{„òl¬Õ¬Dït|]β%œO»™š1'çÿ*[¶’úXî;ÓsçÎXÓS§ŽÑš5K("">m¨§§„j„¿1üGÞ¯_ËS©ååËçSÕªÏ1íž`›T¤qÏ䥰!ýÈø8ŠêІÔ¨š>I¬ÕÈ(òÚ{àáܵ—Ü""É”!=¨XŽn´oCûü}hköÿfíå‰Y³ÔËN–,Y¨Jµ*4xø ªV£•)WÆl‡Ýõ·¨\ñò´Û“5 ünµ‰m¬sæÈN[woá—­XÚú×V¼h)/_C=V­g;Ù ôWùRä6´?•¯÷BŠg–Ô ‚€}j_|]âì½ßz‹Ú4nBÓç̦%k×Ò†yóÉ#™aR u;ùNBñ„óèÉ“Çõþ¾¾TµBz÷õNŠtÂišA)ÖÀÎT#––[€íåËÌÄôÌ™jyÇŽ¿éΛ–»Z-C›:oÞjذ%eÏž“#ÞÄOƒZí$+G âÝ.ä½`)ôFwþ^EÄ/=Š[H(yîÚ§g†í»ÈsïArã— {®?¨R‘.vz•vfð¢åWÿ£ví¡‹;¶ªnæ}&U«^ºt}ƒªV¯JE‹M’(fg²yâÜqZݵ±÷½ßï}jÚëu-âz¬[¿®úÄLŸL›ØI+ÃÄ/¨î£ùê[ômF?ºòJKjض5ÜÊI¶‘ØI›‚€ ð! °¥T"ã^ví?€¶ìÚ©RU>ת%mZ¸(ѳÝãÀî°ÙÔ aZ] ö^¤P!E4{¼ÑE…A*S¢yð´”Ô!;SLCãS·n#«“ܾ}“FŽìKK–$´üàÁ]T±bž¶÷"Ø•ÂJûŲåz@€bOZ¡ã¤+|/„N娠õ[“ßÔoiQ‰`ºÍ¶”­¯]§H¾¯Öü0—råÉEõÔOӸݹ«¼Ó5§!O~ïÆvý]­{³måw”eq¶s7Ýþk£jóùŸWÚMh8Ÿa-nJJ`` •(ÅŽFL@kÿš¾(”›sH¯ äEwXû¢Zµk=5u¿zýád §Ç±“Ê3.{6ЬZ‘ŽW)O›cÐr¶ËÞýÏß¾>\ÉSè¯vxUi7«V¯Â‘RŸlù’å4tà0ªE Ó¯·{®ò5´dÕ*R48QäÜó?C  »œŽ4pìdšÆÓó#ÃbhÔ¯‹¨ÍŒÙ”#gjÚ¼ 5oÕ\õQÈh¢0J¥ à0ä_ÁAPßaÆñÓ¦Ñ=6ÆÿméR*]¼8½ÖºƒZ·O3˜â]¾~y³f"ЉšmiÚ©“rB̾¢Ï>«´›½ßêª~1~=üÀ#½^»WÍCû|Æ ÂgêÇSŸ·»™ëõ¸P¿~SžfoE þhî¾Ê@š8qF’S—p4»rå¢9ÕÖ·nݨê#Ù£Y+îî”+W³5Ožx ª%QÍ’%õdEk'©_¼$¡DGssØ‚z3¹Úš5'ݹºŽ®©Dž¾ÞtîжTÝS*§…‡ºçÿÎ)”byÊ<ŒƒÛ¯Y™þˆŠ¤'NÒÁuk”í°/O·W®R™ÞëÕ]i8á<äÇuiUj\¸LçB;¿ÓƲ&G/¸= +ÉÈ\˜B~øŠ"¦Ì£?£o6o¥ ‚iN‘4aé šóý„)þ¦Í›2m¦ú¯‡gQZa+çœ! ´hA¥JR¶ÕC:Îs—.QÇ^½èßsçiD¿~víTÂ9Ý$‚²›?¬Í3/sÀçGËõ¼O‚ã,ÏÁÇEp õGz°„ÃðcÎùß~GÕØŽ3ˆôXrfÏNÇ6ÿÅ^âqtûöm  Ž+š‹ëP¦Ný*UªAŸþ1…„Ü£ž=ñgp’äcÆø .¢>Ia€)þË—/2QמBƒŠÏ¥KçiçÎ-*4âsjÞûIiPQŸ;÷3œü&åÙo¦OŸÀq?Ç«f:wnBï¾ÛŸM&kÍêó—Ón†~ö1eâx˜±?ϧkì”ãþ †¼£¢ÉÄY‘žT¬bpBÃyù?ubpÞ+Wš=_ƒÖ„…Ðj‰tréµ-((‹Ò5TýBÛiO­v®—êR܃XŠŽyÀ‘5¢˜Üú)r‰Éåãž9–c‡¶øÞâŸÈkËvò=‘úþ±•z°ÉÀŽéGs¶rùJúaÖ”5» £Íx¿zÍêèIÌ~,q”eAÀ^pŠ]Vc¹H™Áš« L†ªT©b=â+ñ`ëÊ´[ëÂYt~þýwEb,Ïš‘ÉÌæE‹T:FLñ†ÙÁЊ8ZEí8›í8>š hr ²ñøóCÞêÃYxâ×}­ëàï3yª=ŒÛ²-˜bßµjµmµ.×A@opŽxh}yÜŽ(WÈ: “=ÛìÝ»=z€6nÓVíòëæ›º)éL¦æTö LÉ¢xØÕMnt{ûzŠ-f1EÍ×­U NÎ4ä~ó–"qˆÁyƒƒ¾ïó÷¥åCwýƒtéâ%Õ…¼l¯ »ÍêüÁo‘bERÒµ4ÛÚö{÷î±ì³=µ=xö–÷;‰yÏ_BþŸL¡ šSƒ¶-¨›4Œýt íÚ±‹Éè Zµ|5ýüóÏŠ5iOFkÖ¬iw2šH—¥J04B@ ^ÿÄóyë³m“¦ôâsµ8äFÿY´Ôî8 ÛÉjcøzüxjÜéu ãìDŸÍn‡V­T®õdDvA cÆ@*^¼´ú$²Y½Ô!Ë‘%1Õë‘#ûÕý’Øú—-›üý3òÔ®?þús]ü2~a€íZ¶ŒzÛºøóøó1‰ßë‰õÿiê|gþĉ*éaž GgÍôVoƒ3ª|i:Åš¾m<£¼ˆÓ¾neÂq`zÙ,[¾,µëØžµ›UÕ”zæÌ™ÄÈKîîGõeŠz¹9ùÎù•ü&EÞKWSdçvTóƒÞT}â8=j íÞ½›V¬XA«W¯¦¹sçb–6feAóæÍ d4µ/ìF†VÆ&¤! )E,û·nÔ˜É'†mµ, ´‡ã‡ Qé-ëõ¶¼tÝZ¥ÍÕú Íî ~h÷éD­J~4GÀÉDîÜyÕ‡¨†Õù1u[ºtVÄÿÈÊr‡Þ½‡òª› ÔÆ/O¡„_|®^½¢ê-ëP¯e›²›©ÈI•*µt/º#úÐ?L·2iE€ýï¿_œâñEEE=$©ñdÕ– b™§T}ôU çÜø„…ÆÿªeÔ‡ñºÚ¡Ò×&§3¸ŸqŌʛ”“½úa9ø1yª0Lm2ˆKF6ox®a}E6a¿YºliÝN§¥ ¨'‰/7ö®Gh+ßY?“‰ÝÂ{v§ð®]ÛÖ|´é £+W®TšÑ+W®4Ç–d4¹Ï<¿E)àat­ý¬•λj©¶j·_±µ´râ" €Ù™€j2Y³q#µy»+Õb'¨o>™@E8–¤‘Š-5ÒØŒJ@»uk˦¿[‰*_¾B´cÇÿ¬êôºò2aX¨ºïÃ6Ôµâ<÷¿ØÝœ%%NH¸¶!ÕÈêC‚’ÊuŠÀZY®ßÀ¶ŠÕ/^¡0Öx¾Ï4”/ò§OÊOêÔ–Æ1I¯"³ê·£¨Ö¨;Gð÷ù,XDqìÞ·7E¼ÖŽ8G¨¶‹úÝË)‚AF¡ÕÈhÆ •SíÚµÍiE­|¸2»M[Še-ý;ÑAŸ ´“ÇòÖªIM†A3oß"Ô¾øÊÙ“€LÁ'«§Þ³ñ‹/l9«²w¸ÑÈçSƒ#'HÆŒù’ ÇÚëß1sæ,‰fœI—Î¥A£ß}·€¶lù“Ú·¯OS¦Ì¡-˜L8YV6€Ã'á“ÜR¨p!š0h8mŽ6Q$äÁæÞüû= ‰/¾ÀKRRƒ@\ÞÜ2y…¿÷ùOœLCG’ïwßSØÀþÕ²9[mÄGY€=~åÊ•ÕgÔ¨Q´ÿ~EFAHçÏŸO™2ebMû#2j›Åé­Å‹èÈ‘#Ѩ%ÝÎD-æÌâ„ 9SÓe9FÐ-’äY·¢“Ž OÄ£B…Ѝ–óç·µ.|úvÒã °±†=§f» ­Ö1•®÷òú© §§,Ë„y¬®²ö³©§uê×›ãY6ÓûðÒ½ÿfÆWtgÍ2ŠËŸŸ2õìKY4¥ nJÐ7ÑŠlJ5räHÚÅYÓ@B;tè@Û¶m£Î;S¹rå¨oß¾´aÃN†Ÿ°câĉԶm[vÚŒSÚSгÄI\ Ñ€:HÚíßë®4L!<½¶xÍ:õ¿ÿQÓzõéÍöíÔiFp-öïßImÚÔ1ºGjyΜåÔ k³t^æÌM¿ÍGžCÇ’·‡;›0’^iÿŠÎGå\Ý)[†îÎã`öÿl§€O&RæÎ])š3@… ýTµ‰'ý°ëˆ5ψ#èÀfÍèÂ… ñ>‹-ª¦ïãwÏ H(–›6mJ›7oæX·yžI~c# ÔAò½uçŽ" •Ê”QXG x)‚€ `Š)©œôöÉpà“Hùò‰ûôÂ~g}£~3:sì8O»{‘[Œ‰¦ôD›æ/¦Y«Sî`e¿^ãÌjÕ ;+—P†5ë(àÓÉ”¥u;ŠªÇÁì@±%K$9Èòln…ÏðáÃéСCÊ›~Ö¬Y‰îMê¦M›èõ×_Ot»T FC@¨ƒ$ºaÞ|ÕÒõë×Uø¤t”"öC ((+ÇnlMHG‹4ªðXNM:Oûõðéμ(ü)ËÏøó\`KÐk¡°•b/¢7¤Û _"Ÿ…‹ÉòT z©)EµjA¡l#W ÿc›-[¶,ÇŸ-Kk×®¥ÿñ ˜miÈÝ»wm«e]0,B@ +Z˜ ÷/&pšÊûJ» í4¼²= Ædä‘§óØØi,²][ŠlÅÁìþ•ü¿øŠ²®\Í1EÛ+¯ù¸ÙÛÁçž{ŽÎŸ?¯B×YîM=lA¥®‚€PW‘´ŒS …ÀƒÚñÁ÷CY» Oz/WÉfä,Räx¡o¿I‘^eOùYäÇÞò¾óQ8×…÷x—L™íiÿþýé§Ÿ~ЦR¨Â¹ÞMyÍ#Ë’AÀUн|b©ö\Ex2NA@ôEÀÄšçðþïÓ­í›)¢sGò›1‹²Ö¨C~_}KÄŽlKöìÙ)00,ÿ»°ì2éPm‘u—E@·t {’÷îÝ›êׯOݺu£}ûö¹¬eà‚€ é‹€)(ˆBG £[[7RTãFä?ae­ù<ùüô ±ªUçŽ?N—/_&…ëÍ·ÔòäÉ“­ö‘AÀèè’€"´â¨Õ­[—¾ûî;*Q¢}øá‡tæÌ£ËKÆ'‚€ àÄÄåÍ£‚ÙßÞ´ŽT®DCFPPúä½t9±ÚÓÜs÷ó8|y^¼DnwÄùÈ Œ,¸ º$ “&MRä³M›6D;˜`SƒØiˆ³&EA@HobƒŸ¥û3¿¦Û«—r0û|VÁìý¾þŽ‚4#»÷Èï¯-”½tErg"*Ep%tG@Æ„uê< 0 !÷îŽ;\Iv2VA@'G ¦\Yfÿ3Ý™?—(ƒ· f0îSrçØ´n¬uç0a(Aõ‘ûÕkN>éž vèÎ v3(0ä¶,Y³fU1Ôâââ”G(¶!øô’%KÌ»áØâÅ‹Sg#²,náá–«v_F:¶p·i÷Aqˆ·cz#ŽMs@¬>mÙÞ˜†“ã®ËØØX½cDÙal(¶loÙ¹™';Èͨ÷ž)(ì|\¬µC’yLì¨sõºÝåˆx±–ÅÈÿE–ã”eçC@wÔÃÃC¡hû6¬­#˜¯VàaxòäIm•f̘AДæÎÛ\§Ù…[×ÛaÍÈ™ q†-GŽv@.}O‰—›7n¨ð)¾¾¾éL,åtH;h/n¸wp­àÖÑ™Ü|ãµ®ŽÀcÃóψa|"##Õµ™-[6•ÂØxÚ›€šªW#b㬆ƒéxŸêU)gNûÞ÷¶ÿ~~~VýAÀQ8fN# GÄ¡.Plßöµu¹™Òl9• ‚@š"Æ1CA>M|^+&jS¢8E¿`íÛ m—_AÀˆ莀j¼õ[¬cÞvzÁrYA@Ò8ŽØrãä!Š®]‹bù?+&gŠèÔî¬_™žÝ’¶‡# »)xÐüùó+wË´eð€/_¾¼Ã”A@” `  {¿ýD7oÞ$oÖ~By"Ep5t§EÎÜ—_~™ iÛ¶mÊ!dÁ‚ôï¿ÿÒ{ï½çjò“ñ ‚€ ‚€  ;t§Â-Z´ ‹/ÒСCUX• Ð|@ùòåӤ€ ‚€ ¸º$ žžžÔ§OêÞ½»Šýio¯AW»(d¼‚€ ‚€ ØÝMÁ[‚Û!Ÿ–ˆÈ² ‚€ ΀® ¨óÃ+=A@A@°E@¨-"².‚€ ‚€ `W„€Ú^9¹ ‚€ ‚€-B@m‘uA@A@»" Ô®ðÊÉA@A@lj‹ˆ¬ ‚€ ‚€ Ø]Æ}DÎ;—0_ü›OsÊ‹œõ>>>äçç—¢ãô°sxx8EFFÒÍ{÷ôÐÝõ1..ŽîܹCþœ:Ï'EǦvçt'µ‡¦ø¸ÐÐPЉ‰¡Û·3§øXg?ãºÇ×$ÒfÈÁ!Ýuó¾ávÐȽû÷ÈÝÍÝ飢£(4$”îܾCîÁÔåfT#wïÞ%//¯„ÿIvìÚ´,¶ë–ÛdY°'.E@+V¬H[¶l¡K—.Ycm½nǵ‡SölÙ(oîÜvl%}N}åêUºvý:U([6}:`ÇVccciÿ¡CT0~Ê–5«[ztêhr YB‹çÏŸ£ˆˆ0*^¼Ô£d)""œNœ8FÁÁÅGÒÜ÷L9}ê4yxxPág Db†rtög©T©R”ÁÛA÷CÜ£öí½tôèQÊœ93åÍ›×ÞM™ÏoûlH…ˆyÀ²à´¸™¸8mï Ø±êÕ«SÇŽ©wïÞ†Ý7ß|Cßÿ=íÝ»×pc #¼ÀL˜0Z·nm¸ñ!­-þ —-[f¸±ûØýô¸NHgΜ¡\¹r©éN=Žáq}¾víEEEQ~¶q5Z‰fo8æË—|}}6‘Ô¢`Á‚ô¿ÿý/MÎé,'Y¿~=}öÙg*m1ú„@ô#FŒp–îI?‡! P@íïïO jÆ £íÛ·; EÇ5ìGTš dôØ¿?ÍŸ?ßq°SKÈè„?†víÚ©?÷FÆk$­EáÂ…ÉÍ;ûî;B¦ £KòùÉ'Ÿ···Q†FH^‡—ÙâŋӒ%KTöª/¾øÂpä³OŸ>ôÖ[oqšØócùât¾ãǧwß}WÉ/´ ¤Fû_0„°dvG@¨Ý!&¥¡@3ˆCh$N‹/¦N:Qùò啯³iÓ¦Tºti5½ähíÚHtíÚµ©}ûö*á|@ˆßŠéxä†7B[P???%C£PÄŽ„v1M5ò‰Àyóæ©ûÚ'½\‡V$&K–,*Ž$Æ÷óÏ?ÓŒ3t WÓ|‚|¶mÛ–Š-ªî5Äq5BYºt©š!ÂØ²eËF]ºt¡ ´ØŒ?BdÊœ93;Ö0$ÐÀà­Þ²eº³L™2„©\MÓ‰?xh ¡íÙ³§"g~ø!>}ÚrøºZ†.4…0+èÖ­›™„öîݛƌCÚË“®Å…|2f̨líþþûoÂË^`W{Ézõê)BªÇñáY’3gNQÃ4ºx!Â}¸|ùr¥ý]³f®Ä[]8A;¨˜‡<÷Üs´jÕ*eƤÕëõ·nݺ*£Ú!ChÑ¢Eôþûï+ 6ž)Ý»w'www0`€®5ôz•ôÛñx|ÄÅñͺV‹ÅŠSS¸H•‡^xAý±cÊ SLÐBé±àa‰y 6TöÚvîÜIW¯^¥Ö­[kUJƒéks³/@nÐ j„iñçøüó϶áÏd$ fÍšÎ>œ$û‡éhŒf•*URæ˜â}饗¬È@’'p Ð\ãÞ”4¼ñG_¹reÕSn8‚ aÜÐØë©€”Akçd3˜‰'šSÄ‚È!bÈ諯¾ª§¡QPPP‚þ‚lC[] @ݧù VSï°/¿qã=z”&Mš¤ž¡Ø;óeË–©&hñ¥FF@4 .þðà®ü9EZ½zu5M¦ ¿˜„öI+øƒüøãiÓ¦MZ•.~¡±¶dh™+Ú_˜TܺuKãIª“°Õ«¾ýö[¥õ¹†s„ž“Ê•+§®GË‚— ¼DÜ»wϲZ7ˈÄ[khÒð|ÁË eÁu #È ³xŽ¡à¥vöìÙ*êÌ—Ê–-k¢Ô©SG÷Ïó€dAx ÖO­Çì(›R†@dd¤ú#G˜”ÄŠ- =pà@b»9m¦4ñöŽð=¶Ú™ÀÀ@U?)S¦({IØ8é¡Õ¸0fŽágâ…Î>,Õ?¶ 4±Ú4yòd{ÞšXjzçwÔXX³dâø¦&vÖÑÅXëä“dÇÚ5‡Ó²’µÄNåtuO’kÍLìEmâd¦úõë«ë’”œnIu(9ÏËÙƒLü²kbmoR§rºú'Ɏɦé•W^1_—ü"oâ$N7é `âUVOEaå`K Íä?åh„zxÀÃ> oïˆe›L›é±\¹rE¥þƒ×-œôرcʆ Î}ûöQÅŠ•½+œsýI/šOÈ#9²C¶™ÿþûOÉQôRàm;4-°¼té’º™„*Yâ…óŠ^KrdsÜÐÔëÉñïI²;uꔲu՛îµä>S°/ÂkÁLÎŒz)O’‚ìCûš9räÐËФŸ‚ÀS# 6 ©„©ðàaËoVgÀô—fˆ"˜ Ã44lÍ0M½qãF«ýqvHÓ§OO`±¡`| Ÿýû÷WÓ¶ ¤°[B¬EØqÕªUKerVò‰üÙ¬1K}rd‡iêgžy&ãU‚“¥SÅãd‡—OØîBvH½‰$ÈÌòõ×_§SSÖìÓÈÄ8+ù|Ü3Ũ²Kî3E»Jœ•|>ìðò‡ÿ!Ÿš”å×UšJIà „а$¡ø£€}¤%ùDÊ<Ä„§œ¶mÛfÕE£ËŽnlbE>2²XǶÅÉVŒ,»¤ž)¸ïŒ*»ä>Sœì2LУË.Á€¥BH ì1¯ï*çäée»Ã1øLìÙ¨†½nÝ:U[,Îìa†6“ìÜaÒ‹ml[¶l©lÙ Ú<Îõ®ÆûAÎêa®gGS³fÍtaçmbçÓ /¼`‚í VŒ,;دr°r%;ž®Ö†¬®[ØôâÖC1ºì{¦]vFx¦àÞ1²ìôðl>ê Dÿ,SÑÐüÁþ šB#G0a-œÿY*[¤4d'ðºcÇŽOÑ¢ã…*Æ&ôŸÉšÒâ"h7´P°ÝÂt.BÁ.rÉ’%Ê£YZœ½`Áäa;‡¾kÉÐw£ÊZNŒ±X¡…‡‡-¼á?ÿüs žÔÐd;{1ºì{¦`æÄȲ3Â3÷‘eçìÏéŸNÐgv¾'öæ OMhá- ¯x¶Õ…vÐÝÄ4¡ðFåp>j\_›6mLlj{¨Ó¯'¥M3²ì8µ¨‰msÕu <Ûíš8k•ÓËʶƒF—]bÏ#ËÎ(Ï\§F–í}(ë‚ÀÓ »=))DÓ휾P…"â€ÖêèÄ:Ø€?w„IÑSé„ùÂõ $FBQ±czPOÅVv 2L01YvKdiB¡‚¤°-¤‰µïÊtÀè²Kê™bdÙᙂ{ÉH²ÓóAú¨O$} 5×*üÉ'Ÿ¨ä8^™æÜÒ+V¬P9™‘jíƒ> d+ÑSÁt:¦d‘#›/gåLOi„S”;œ’0ˆÌ2Îêú8¼“’BÃ) ÙcƧ˼îF—‚Ìs¬RsêL„û:t¨ÊndÙá^Džw½>Sp?YvI=SŒðð¸g©lÒ}òæôé54™¶F9l@+ˆ€Á#FŒPә˖-SJêÍ7}zœ²V¿ÿþ{S—.]LœUÅ„Ên GöxW§¤4¡)k%}ö~’ì§MKŸ§¬U#ËŽmu•¹G—0q”u}"±C£FL“ÕdtÙéù™bdÙ=陂;XϲKÙHöRŽ€LÁ'3dýÙ±c‡òdDzeá8˜*óþ QðÐiذ¡‰ƒ^[îæÔËðÎïÑ£‡‰s-[õ“µ‚¦:uê˜ØÉHÕk$TOÙH’+;ÈôêÕË g_1²ì)†Ã™úôéc%QNªêaVatÙéñ™bdÙ%÷™‚‹V²³ºÙdE°B@“ ,gà0Õ­[×Ô¸qã6H±‰tjp4ÒŠf?©­;ó/ì=A21>lÛ‚Ôšœ³Ø\­§±¡Ó)‘ˆŒžl#,;h˜pÝáºd³óõ§-€àÀ iEQDv2éÿktÙ¥ä™ièí™™þWôÀ@ôÉ4dxûí·‰½†‰!TX"ËÃa¥T©RVAæõ”nòaGK¬µšZ._¾¼ O¤mÐÓØÐç”ÈÎËËKáˆ4YYv¹„DY²dQ¡¿8­6lõ‹Ô¡2d0ßw";+xÒuÅè²KÉ3‚ÐÛ33]/iÜešLQã:räHâJêO‘½àÍG‚¸ñ4¨Ó¦g4wô1 /½ô’9;ÐÌ™3•’¶ûÎ;)oÞ¼Úªî~Evú•]ž)M¨m|P«ƒÓya°ØAÌ<6„îAHËm6dš˜&Tdg‰”c—S+;M›ÆÙ¹Ûá¶–šg šÐ4¡F¼ïŒ,;MêìÏ”^Ʋ» `DúðÕãÂ… ÊŽ©'aë àöíÛ•vÐÏÏOí…p0š&Ë£Ù"5 ³j@ùÊQéBsçέBA£ ;:h@¡¹E¦W7çÛ6;vÀ&cƒcuÆòÛo¿Ñ?ÿüC¬œ2gά"\»vM9®hZ[8‘! ö­W¯A#²Ki¦Vvš6 öØÎªMí3R1ò}gdÙéá™’þw½ô@xˆ€]h­ÎN Odö½£VŨU«V*¶­fóöíÛÚnNÿ‹ŒØúÐr¢@ëÄNSÊ~•¬¬Æ€}ôˆÍ L 0±7¿y<=«2V!x9²äX‘%é»ldÙù™‚«Fd÷èÞÑÓ3åQ¯eIH\^ŠžýúõSžîEŠ¡Zµj)j¨´~œFþøãe3©iBa‚pDS§NUÚ¾Î;+;N¼¥³ó9sFÙ¯BÛb© …ç¿ʉ'ˆÓf¼ù4h`ŽU 9"6äœ9sèúõëJ¦š&Tdç’5²ìŒþLÙé÷ÿÀ9î~é… €ËP±5j¨ìF˜v RèØ’PÄÔ 9Ó.ð *¨¸¥'OžTÓìåÊ•S›lI(œu0E¯§’-[6·tÓ¦M*,V£F¢Q,I(²WÁtBoEd7GeÓ›ìŒþL1ò}gtÙéí(ý56.K@aßÉyÏ•¦ Ú2¤Ù‘ÁÇÒ®L#¡Ðœè¡ ¶';1¨®æÊ•KöhK–,¡‚ šmU5 <á‘ÖÐÙKhh¨Æ­-ˆ&‚çclð¤†5m'¶TCnˆd ‡"²sSbÒ£ìŒüL1ú}gdÙéá¹'}tQÒß À±=7 :Ôì1Ý´iS³·»æ©Çƒаeeg"óøÞ™ðç©wÝÅ-ÕÆvêÔ)ÿÞìø –©f¯ªy ë-n©66üŠìôsV“ÑŸ)F¾ïŒ.;í•_AÀp9 è„ Ôt-zå•WyΑâžÞ°…„MO1-ß›VsòäÉÔ³gOb’­òfÃËAŒš]½Æ©»wïž´™'N¤bÅŠÑÂ… U>py¢"@ª§ø‰"»ýdÙù™bôûÎȲ³|¾È² àŒ8g\;!…üæ›7o¦qãÆl!1½~óæMÊš5+q Lboq•ŽrÚ´i*ß4Rpê©|öÙg*ÌR"LœsòåËG³gÏ&b‡}ä¨Q£帘ÄoDºŠ0b={vBÎpŒ‘ã›*'2L"/øðáÃUÚT¤×SÙéSvF¦ù¾3ºìôôü“¾º(Ψ–}Ú>±ÃšfÞ¿¿Õ©XhjÞ¼¹94¯cÊ–I¨ 0_¿~}Û€ªc¢Ò Â$íٳǴvíZ«T„HKˆii„GAaï}g2±ŽiذajÛçŸnâ,Aj:^›ºv¶1&%»wÞyÇÄÚ]Õ]Œ•½ÞMûÓÄ ÔØºtébbÒ©¶;«ìØ#_õùÏ?ÿ4qžz3ôF]R×%idÙù™bÙ%õL1‚ìÌYtˆ€§‘x7¼§L™B6l0«mÛ¶*@9*ŒA‘ª‘ !œÈ/¿ü¢‚—à H;ÒiÓj“¦çÏŸWãƒG>4g•*U"x¦BÛ ‡"8ã@‹;xð`¤ûå—_¦]»v)Ó¤Ùl×®i!¥Ì@¥óBrd§)¾ÇhìØ±TµjUªY³¦ê5ÂLA“ Í6g:R2Nçá$hNRœ}Š˜xªm0€fÎmz—Ýã®K ÷QegägŠÞe—œgŠžÿÔƒD¾=# CÒœh—‘zñ7ÞPN*Ð|òô³rêàŒ8VûCˆ@ìp>‚Ó‡Và ³qãFÛJ{æãã£öƒq=Þ~QxJ[iv¡ÎV˜0+­b”Ž=Z9!tBÕh…½Ü•6 비´“(wïÞ¥3fOQ;åØÐÇäÈÎÛÛ»g¨RñL!Gh{¿ùæ*]º´ÓitUgùëøñãÄ‘ˆÍ ”*êµdÚ>z•]J¯K£ÊΞ)z“]rž)øOУì´ç†ü zGÀ0¹Í1Ý®‘Oì‹/¦eË–Ñÿý§bArè5u‹<?>>}Z9¯ ¸3L¹Ã{æZŒKô“µ€Š¼!†È7ê÷íÛWïÛo¿%d>bûB5]LAÎZR"»*UªÐôéÓ©}ûöê‚5‡ê¥ÃYdžÈ… 2“O­Ÿl««<öY“­®S˜E¼ù曺’]J¯K#Ë/xF~¦èMv)y¦À”GO²Óž!ò+èÃPhúvQ+¯{@hK•*ESi:yª]‘NvÈQv ÐPõèÑC…)ÒŽu¶_Œ …Í TÐux€ót®J£ -Â+åÍ›—V¬X¡B!γI±Ó••&ØÙƆþ¤TvÐn`¬Ð`tìØQÙP:㸴±Á>•M%”$^¾þúkeo ÛOdobúùçŸUR„:èFv)½.aŸmdÙù™¢GÙõÿÀYŸuÒ/A ¥¸Át ¥9ãþЊ!ž'È4ƒZH%ä GlO8Á!¤½hrÑ_8° -áîÝ»ÙÆ›;4ºphAÙ²e‹ S­.œôRŒ,;¤wíÞ½»rÄLÚ Zlhp;uêDšiL+ð²ôý÷ßëElJskäëRd'ÏÝÜŒÒQA@‡FúÖ[o)-¦#ËÚwØÂôÌ™3Ô¢E E<ƒ‚‚,E§ìw5ùYmpâ£_—";2Û•ëí™iägŠ?¤k‚@Š0Œ49£Fè%9h™Š-šœCtµÏ AƒØAv,mEu5ˆ$:kdÙAcϨuëÖÔ­[·$Ðoµ‘¯K‘~¯K#?Sô+é¹+!`ØLHpNÁÔµV` -Îónò‰Ì?ZÁÔ<Æg¤!C†èž|º’ì0íŽx­p€ƒÓ˜Þ‹‘¯KÈÆr|";ý\­F¦èGÒSAàæ§Õé~ f­øS‡ÓNåÊ••9¦®1ýi ´œ‚`#%Ɔ°Rë3Á´¼Þ„itÙ!*BG!ñg£¢;vPþüù 9©5{P½ÉL믑¯KŒQd§IZ_¿F¦èKÒ[Aàqy´jŒ%L?d/p„W:{ö,ùûû«lHpü°´ Õëh1Ø"»6§Â… ›óÛëuLZ¿.;䳇×;ÉP¿/¶6¡zú5òu 9ˆìôt5>ê«ÑŸ)F*K‚€¾p)P}‰Fz+‚€ ‚€10¬ ¨1Å%£A@A@ÿÕ¿ e‚€ ‚€ è ! º—tVA@ý# Tÿ2”‚€ ‚€  +„€êJ\ÒYA@A@ô€PýËPF ‚€ ‚€®ª+qIgA@A@Ð?B@õ/C ‚€ ºBÀ©8u%é¬ àܼy“¶oßN¤PÙ²eUÛ 8Aï’îÒnÞ¼™j×®MÎÞפG![A@p=„€ºžÌeÄ‚€6l ¤©½}û¶ªGêBäÏöðð Ï>ûŒúõëgµ¿3­ìÛ·:uêD ,êL‚‘¾‚€ ðd þ ÉfAÀÈ?~œ7nLÙ³g§¿ÿþ›ÂÃÃéúõëô믿RÍš5©ÿþ4uêT#C cA@H„€¦èÒ¤ à,,[¶ŒbcciÒ¤IjÛ××—²eËF:t ~øAiAAF¥‚€ i‰€дDSÎ%è »wïª{z&´Æ)\¸0Íœ9“^{í5Š‹‹3 „õ‹/¾ –-[R‰%”­(öÁt¸e6l}òÉ'tâÄ êÚµ+•.]š^~ùeZ·nÚmýúõÔ¦MªX±";–.\¸`>üСCj4´Øml:uh„ tíÚ5ó~I-Ü»w>üðCzî¹ç¨T©RŠPïÚµ+©Ý¥^AÀÁ¸±­—ÉÁmJs‚€ à$üóÏ?Jó™/_>>|85oÞœråÊ•dïð¸xþùçiçÎôâ‹/R… h÷îÝjú$õÈ‘#T¬X1u<ÈìJoݺ¥È'λxñbrww§¡C‡ÒèÑ£©nݺ”)S&úý÷ß)oÞ¼tòäIòññ¡?þøƒ^zé%å 2Ù­[7ºÿ>}õÕWŠônݺ•¼½½iùòåŠÃô•W^Qí‚ÈÂ)éâÅ‹ªU«V¥Õ«WÓÑ£GiöìÙÊf4ÉÊA@Ç *E\_~ùÅ”!C¼ˆªO™2eL½{÷6­]»Öc̪U«Ô>¬Ý´ªŸ5k–ªgRi®¯U«–ªûè£ÌuL@U———iÿþýæú!C†¨z&–ªŽ£ÔzŽ9L¬ñ4ï÷×_©zvŒRulB Ö™€š÷iÛ¶­ªÃ¾Z‰ŠŠ21)5™˜kÕò+‚€ Nȼcx¾´"8-˜>?s挚ކFòÔ©S4mÚ4jÔ¨‘šö¾råŠ¹ï˜ ß¶m1a4×aɦZצô-7öéÓǼ Í$ ¦ÓË—/o®Ç4<ÊåË—ÍuX`"LLBÍu8miÓøæ Ðþ¢E‹¨zõêª m;leìÊ•+µjùA@H'~¥SG¤YA@H?0?hÐ õ‰ŒŒ¤-[¶Ð×_MK—.¥*UªÐ¹s爵–”9sfªV­š"€°©„}'>‡Vg©Õ ²dÉ¢ŽÑ*q< ¦Û-K@@€Zµ´5EE¹rå,wSËÅ‹WR ¶>}ZÕ!>¨Fе´ýµ}´zùA@p<B@¹´(8 šK–,QdšE­Àö—øôíÛW9!DS½zõ”='~°>kÖ¬ûJhJ¨œ•´sh¿áÔÖµ_Ø&§hÄÔr_aUÌ·-°EÉŸ?¿²OµÝ nÉ’%m«e]AÀÁu0àÒœ à,`Z3gΜ¯óÄ Žàñ‡”Q£F)ò9gÎzã7AëQ4s[ ¦Úø_Z»–§€6688˜-«Õò³Ï>«~3fÌHÓ§O·ÚŠŸŸŸU½¬‚€ 8ä©!ß/iQ쌴͚5SÓçˆj[Øq‡@4A2¡åDaÇ!BÈ&xœkäõ˜ªG±‚W•OñõÓO?Y}þüyúóÏ?•§Õ†‡+HÇY°`AåEÿßÿYíÚ´i“U½¬‚€ 8Ñ€:siQpFŽ©´—ˆ™‰PHp‚ñìÙ³ÊY¡‹àp¤…fª\¹²rB‚æBÈœ„ÐJÐ’"u§6žVÙ|ûí·©{÷îtõêU0`åÎ[¥M¬ ê)S¦PëÖ­¹3fŒ ¬¿bÅ ÕG8\ÁÑJŠ ‚@ú" 4}ñ—ÖtEÃíÛ·Óû￯4ƒÐ„rDE&dþΆ„©v­€ÐaÏï¿ÿ^iAa?Š ô ‰›7oVö™ÉµñÔΛÔïàÁƒ ä‘Ã<)Í+b‹~ùå—Êl ©cZµj¥Ès¯^½¨iÓ¦j7hkQ¢,EA ý@ôé/é à4„„„(í'´ ˜®Nª€¤"h<¼ç·_RÇ?©^ Dÿã?RçÎU–$Ø|&åÔ”ÔùnÞ¼I˜ŠÑNÌf4©ã¤^AÀ¾ˆÔ¾øÊÙ]!ç²eË>±ÏÐ("’£ ¼ÚSS×)‚€ Î…€8!9—<¤7‚€ ‚€ ! †± PÐÐZ6iÒ$AÀzýDz,‚€ bš*R'‚€ ‚€ `7Dj7håÄ‚€ ‚€ ‰! 41T¤NA@AÀnµ´rbA@A@Äš*R'‚€ ‚€ `7„€Ú Z9± ‚€ ‚@büèC wTPÂIEND®B`‚psiplot-2.3.0/man/format_table.Rd000066400000000000000000000046771331220542100167160ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/format_table.R \name{format_table} \alias{format_table} \title{Format input event data} \usage{ format_table(x, qual = c("VLOW", "N", "LOW", "OK", "SOK"), expr = FALSE, counts = FALSE, trim_colnames = NULL, short_ids = FALSE) } \arguments{ \item{x}{A data frame of event data as outputted by \code{vast-tools combine}. e.g. each row is an event containing exon metadata, PSI and quality scores values. If \code{expr = TRUE}, then each row is a gene containing two columns of metadata, one column of cRPKM per sample, and, optionally, a second column per sample with read counts.} \item{qual}{String indicating the minimun \emph{vast-tools} quality score for the PSI to be accepted. Defaults to \code{'VLOW'}. See the \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools documentation} for details.} \item{expr}{Set to \code{TRUE} if formatting a cRPKM table. Otherwise, \code{FALSE}.} \item{counts}{Set to \code{TRUE} if the cRPKM table has read counts. Otherwise, \code{FALSE}.} \item{trim_colnames}{String that must be searched for and trimmed at the end of every sample column in x. Useful to trim the "-cRPKM" suffix from expression tables. If no string must be trimmed, leave as \code{FALSE}.} \item{short_ids}{Set to \code{TRUE} to make the metadata column shorter in the output, by including only the event ID (for events) or the gene ID (if run with \code{expr==TRUE}).} } \value{ A data frame. If run with \code{expr=FALSE} (default), each row is an event, the first column (\code{ID}) contains a concatenation of the event metadata delimited by |, and there are two more columns per sample, with PSI and quality scores values. If run with (\code{expr=TRUE}), each row is a gene, the \code{ID} column contains the gene metadata, and there is one more column per sample with the cRPKM value. } \description{ Convert low/bad quality PSI values and convert event metadata as a first ID column. Prepares input event/GE data for plotting. Calls \code{\link{convert_psi}}. } \examples{ # For example input, see: psi format_table(psi) # For cRPKM crpkm format_table(crpkm, expr = TRUE) # For cRPKM with read counts and the "-cRPKM" suffix in sample columns: crpkm_counts format_table(crpkm_counts, expr = TRUE, counts = TRUE, trim_colnames = "-cRPKM") # To keep only event IDs/gene IDs as metadata: psi format_table(psi,short_ids = TRUE) } \seealso{ \code{\link{convert_psi}} } psiplot-2.3.0/man/get_beta_ci.Rd000066400000000000000000000010571331220542100164710ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_beta_ci.R \name{get_beta_ci} \alias{get_beta_ci} \title{Calculate confidence intervals for error bars} \usage{ get_beta_ci(q) } \arguments{ \item{q}{a data frame of PSI and corresponding quality values} } \value{ Confidence intevals of PSI values } \description{ Helper function to filter and return confidence intervals based on beta distribution from Q scores. For internal use. Beta sampling functions provided by Tim Sterne-Weiler. } \author{ Tim Sterne-Weiler, Kevin Ha } psiplot-2.3.0/man/get_beta_ci_subg.Rd000066400000000000000000000015071331220542100175110ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_beta_ci.R \name{get_beta_ci_subg} \alias{get_beta_ci_subg} \title{Calculate conficence intervals for error bars of subgrouped samples.} \usage{ get_beta_ci_subg(v, q) } \arguments{ \item{v}{Numeric vector with PSI values of samples in a subgroup.} \item{q}{Character vector with the quality scores string of samples in a subgroup.} } \description{ Helper function to filter and return confidence intervals based on a joint beta distribution obtained from Q scores. For internal use. } \details{ Individual beta distributions are generated from each sample in the subgroup. Those distributions are sampled and the results are used to fit a new joint beta distribution. The joint beta is then sampled again to obtain confidence intervals for the subgroup. } psiplot-2.3.0/man/get_psi_samples.Rd000066400000000000000000000014231331220542100174170ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_psi_samples.R \name{get_psi_samples} \alias{get_psi_samples} \title{Get samples from PSI input table} \usage{ get_psi_samples(df, config = NULL, value = TRUE) } \arguments{ \item{df}{A data frame of PSI input values.} \item{config}{Config data frame} \item{value}{If \code{TRUE}, then returns the sample names. Otherwise, return the indices.} } \value{ If \code{value = TRUE}, A character vector consisting of sample names. Otherwise, a numeric vector of indices. } \description{ Get samples from PSI input table } \details{ When \code{config} is provided, then the samples from the \emph{SampleName} column are used to find the indices in the PSI table. } \examples{ \dontrun{ get_psi_samples(psi) } } psiplot-2.3.0/man/gg_color_hue.Rd000066400000000000000000000006301331220542100166740ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocess_sample_colors.R \name{gg_color_hue} \alias{gg_color_hue} \title{Simulate default ggplot2 color palette} \usage{ gg_color_hue(n) } \arguments{ \item{n}{Number of colors} } \value{ vector of colors of length n } \description{ Simulate default ggplot2 color palette } \details{ \url{https://stackoverflow.com/a/8197703} } psiplot-2.3.0/man/make_title.2.Rd000066400000000000000000000010731331220542100165200ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_event.R \name{make_title.2} \alias{make_title.2} \title{Make plot title (version 2)} \usage{ make_title.2(gene, event) } \arguments{ \item{gene}{A vector or character string} \item{event}{A vector or character string with same size as \code{gene}} } \value{ A character with a human-friendly title with format: \code{GENE (EVENT ID)} } \description{ Create a plot title using the event ID. Returns symbol and event ID. } \examples{ \dontrun{ print(make_title.2(psi$GENE, psi$EVENT)) } } psiplot-2.3.0/man/make_title.Rd000066400000000000000000000010161331220542100163550ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_event.R \name{make_title} \alias{make_title} \title{Make plot title} \usage{ make_title(x) } \arguments{ \item{x}{A character containing the event ID like "\code{S|TSPAN6|chrX:99885756-99885863|108}"} } \value{ A character with a human-friendly title with event type, gene symbol, event coordinates, and length } \description{ Create a plot title using the event ID } \examples{ \dontrun{ f <- format_table(psi) print(make_title(f$ID[1])) } } psiplot-2.3.0/man/plot_event.Rd000066400000000000000000000152541331220542100164270ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_event.R \name{plot_event} \alias{plot_event} \title{Plot PSI values of a given alternative splicing event} \usage{ plot_event(x, config = NULL, subg = FALSE, subg.show = c("mean", "all", "beeswarm"), trim_colnames = NULL, qual = c("VLOW", "N", "LOW", "OK", "SOK"), errorbar = TRUE, groupmean = ifelse(is.null(config), FALSE, TRUE), col = NULL, title = NULL, xlab = "", ylab = "PSI", ylim = c(0, 100), cex.main = 14, cex.yaxis = 12, cex.xaxis = 12, pch = 20, cex.pch = 3, plot = NULL, gridlines = TRUE, show_group_legend = TRUE) } \arguments{ \item{x}{A 1-row data frame containing PSI values to be plotted.} \item{config}{Optional configuration settings for \code{plot_event}. Can be a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} file. Use the latter option if you are calling \code{plot_event} multiple times.} \item{subg}{Logical indicating whether samples should be subgrouped for plotting.} \item{subg.show}{Only applies when \code{subg == TRUE}. Default is \code{mean}, in which the average PSI is computed for each subgroup. If \code{all}, then individual point estimates with error bars are shown. If \code{beeswarm}, this is similar to \code{all}, but shown as a beeswarm plot and without error bars.} \item{trim_colnames}{String that must be searched for and trimmed at the end of every sample column in x. If no string must be trimmed, leave as \code{FALSE}.} \item{qual}{String indicating the minimun \emph{vast-tools} quality score for the PSI to be accepted. Defaults to \code{'VLOW'}. See the \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools documentation} for details.} \item{errorbar}{Logical indicating whether error bars should be drawn.} \item{groupmean}{Logical indicating whether grouped means should be drawn. Requires \code{config}.} \item{col}{Vector of colors with length matching the number of samples. If specified, this will override the color settings specified in \code{config}.} \item{title}{Title of the plot. If \code{NULL} (default), the title generated by \code{\link{make_title}}.} \item{xlab}{The x-axis label.} \item{ylab}{The y-axis label.} \item{ylim}{Range of y-axis.} \item{cex.main}{Plot title size (pts).} \item{cex.yaxis}{Y-axis font size (pts).} \item{cex.xaxis}{X-axis font size (i.e. the sample names) (pts).} \item{pch}{Point symbol.} \item{cex.pch}{Size of datapoints.} \item{plot}{(deprecated) Prints the plot.} \item{gridlines}{Logical indicating whether grid lines should be drawn.} \item{show_group_legend}{Set to FALSE to avoid showing a legend with the sample groups and their colors.} } \value{ ggplot2 object } \description{ Generate a plot of PSI values for a given exon. The PSI values and corresponding quality scores are typically obtained from the \href{https://www.github.com/vastgroup/vast-tools}{vast-tools} pipeline. } \details{ Plots can be customized via the \code{config} option. Either a data frame or the filepath to the config file can be used. Alternatively, plots can be customized using a limited set of graphical parameters as described above. The order of samples (e.g. columns in \code{x}) as it appears on the resulting plot can be customized using a config file. If a config file is not used and re-ordering is desired, then it must be done manually before calling \code{\link{plot_event}} by altering the columns of \code{x}. If subgroups are defined in \code{config} and \code{subg=TRUE}: \itemize{ \item{The mean PSI of the samples within each subgroup are drawn as a single data point.} \item{If \code{subg=TRUE} and \code{errorbar=TRUE}, confidence intervals for the subgroup are derived from a joint beta distribution, fitted to a set of points derived from individual beta distributions corresponding to each sample (see \code{\link{get_beta_ci_subg}}). This is an experimental feature, computationally expensive, and CIs may not be shown for some subgroups,due to failure in fitting the joint distribution, especially for events with low coverage and PSI values near 0 or 1.} \item{Subgroups will be ordered by the minimum \emph{Order} value of their samples, and assigned to the first group to which they are matched.} \item{(Experimental) Instead of computing the average PSI, the individual PSI values can be plotted for each subgroup by setting \code{subg.show}. The default is "mean", which plots the average PSI. The other two options are "all" or "beeswarm". For "all", the individual PSI values and error bars are plotted for each subgroup and sorted in increasing order. For "beeswarm", the optional \href{https://github.com/eclarke/ggbeeswarm}{ggbeeswarm} package is used to create beeswarm scatterplots for each subgroup (error bars are not possible). As this is an optional feature, please manually install the package first before using it: \code{install.packages("ggbeeswarm")}.} } If no subgroups are defined in \code{config}, or \code{subg=FALSE} (default), a subgroup will be defined for each sample, preserving their name and order. If groups and colors are defined in \code{config}, all the samples in a group will be colored with the first color assigned to the group. Else, all samples will be plotted in black. If groups are defined in \code{config} and \code{groupmean=TRUE}, the mean PSI of the samples within each group are drawn as horizontal lines. The colors of the lines are determined by the color set to the first sample of each group by \code{RColorCode} in \code{config}. A corresponding legend key will also be drawn. (See also \code{\link{preprocess_sample_colors}} and \code{vignette('psiplot-usage')} for details on how to use config files). PSI values that have \emph{NA} value are omitted and not plotted. Error bars based on the confidence interval of the PSI estimation can be shown by setting \code{errorbar=TRUE}. } \examples{ \dontrun{ plot_event(psi[1,]) # Plot with custom configuration config plot_event(psi[1,], config = config, groupmean=TRUE) plot_event(psi[1,], config = "/path/to/config") # Plot with subgrouped samples config plot_event(psi[1,], config = config, subg = TRUE, errorbar = FALSE) # Plot with subroups and error bars (slow, experimental feature) \dontrun{ plot_event(psi[1,], config = config, subg = TRUE, errorbar = TRUE) } # Plot using custom configuration, changing point symbol, and y-axis # scale plot_event(psi[1,], config = config, pch = 9, ylim = c(20, 80)) } } \seealso{ \code{\link{format_table}} for performing some initial conversion steps of \code{x}. \code{\link{preprocess_sample_colors}} for pre-processing of \code{x} using\code{config}. \code{\link{plot_multievent}} for plotting more than one event in the same plot. } psiplot-2.3.0/man/plot_expr.Rd000066400000000000000000000104051331220542100162550ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_expr.R \name{plot_expr} \alias{plot_expr} \title{Plot cRPKM values of a given gene} \usage{ plot_expr(x, config = NULL, subg = FALSE, subg.show = c("mean", "all", "beeswarm"), trim_colnames = NULL, counts = FALSE, groupmean = ifelse(is.null(config), FALSE, TRUE), col = NULL, title = NULL, xlab = "", ylab = "Expression (cRPKM)", ylim = NULL, cex.main = 14, cex.yaxis = 12, cex.xaxis = 12, pch = 20, cex.pch = 3, plot = NULL, gridlines = TRUE, show_group_legend = TRUE) } \arguments{ \item{x}{A 1-row data frame containing cRPKM values to be plotted} \item{config}{Optional configuration settings for \code{plot_expr}. Can be a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} file. Use the latter option if you are calling \code{plot_expr} multiple times.} \item{subg}{Logical indicating whether samples should be subgrouped for plotting. If \code{TRUE}, the average of all samples in a subgroup is plotted as a single data point. See \code{\link{plot_event}} and \code{\link{preprocess_sample_colors}} for more details on subgrouping.} \item{subg.show}{Only applies when \code{subg == TRUE}. Default is \code{mean}, in which the average PSI is computed for each subgroup. If \code{all}, then individual point estimates with error bars are shown. If \code{beeswarm}, this is similar to \code{all}, but shown as a beeswarm plot and without error bars.} \item{trim_colnames}{String that must be searched for and trimmed at the end of every sample column in x. Useful to trim the "-cRPKM" suffix from expression tables. If no string must be trimmed, leave as \code{FALSE}.} \item{counts}{Logical indicating whether the data frame contains read counts. Set to \code{TRUE} if the data frame contains two rows per sample (cRPKM and counts), otherwise leave as \code{FALSE} (default).} \item{groupmean}{Logical indicating whether grouped means should be drawn. Requires \code{config}.} \item{col}{Vector of colors with length matching the number of samples. If specified, this will override the color settings specified in \code{config}.} \item{title}{Title of the plot. If \code{NULL} (default), the title will be the content of the \code{ID} column in \code{x}.} \item{xlab}{The x-axis label.} \item{ylab}{The y-axis label.} \item{ylim}{Range of y-axis.} \item{cex.main}{Plot title size (pts).} \item{cex.yaxis}{Y-axis font size (pts).} \item{cex.xaxis}{X-axis font size (i.e. the sample names) (pts).} \item{pch}{Point symbol.} \item{cex.pch}{Size of datapoints.} \item{plot}{(deprecated) prints the plot.} \item{gridlines}{Logical indicating whether grid lines should be drawn.} \item{show_group_legend}{Set to FALSE to avoid showing a legend with the sample groups and their colors.} } \value{ ggplot2 object. } \description{ Generate a plot of cRPKM values for a given gene. The cRPKM values are obtained from the \href{https://www.github.com/vastgroup/vast-tools}{vast-tools} pipeline. } \details{ Like \code{\link{plot_event}} and \code{\link{plot_multievent}}, plots can be customized via the \code{config} option. Either a data frame or the filepath to the config file can be used. Alternatively, plots can be customized using a limited set of graphical parameters as described above. See Details of \code{\link{plot_event}} and \code{\link{preprocess_sample_colors}} for more information on customizing plots. Note that the \code{errorbar} argument is not available for cRPKMs. cRPKM values that have \emph{NA} value are omitted and not plotted. } \examples{ \dontrun{ plot_expr(crpkm[1,]) # Plot with custom configuration config plot_expr(crpkm[1,], config = config, groupmean=TRUE) plot_expr(crpkm[1,], config = "/path/to/config") # Plot using custom configuration, changing point symbol, and y-axis # scale plot_expr(crpkm[1,], config = config, pch = 9, ylim = c(20, 80)) } # Plot with subgrouped samples plot_expr(crpkm[1,], config=config, subg=TRUE) # Plot directly from a table with suffixes and read counts crpkm_counts plot_expr(crpkm_counts[1,], config = config, trim_colnames = "-cRPKM", counts = TRUE) } \seealso{ \code{\link{format_table}} for performing some initial conversion steps of \code{x} \code{\link{preprocess_sample_colors}} for pre-processing of \code{x} using \code{config} } psiplot-2.3.0/man/plot_multi.Rd000066400000000000000000000100571331220542100164340ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_multi.R \name{plot_multi} \alias{plot_multi} \title{Plot multiple events or genes as a heatmap (experimental)} \usage{ plot_multi(df, config = NULL, subg = FALSE, expr = FALSE, trim_colnames = FALSE, qual = c("VLOW", "N", "LOW", "OK", "SOK"), counts = FALSE, xlab = "", ylab = "", title = "", cluster_rows = TRUE, cluster_cols = ifelse(is.null(config), TRUE, FALSE), fill = NULL, usepkg = c("ggplot2", "gplots", "pheatmap"), ...) } \arguments{ \item{df}{A data frame of input values (PSI or cRPKM). If the latter, need to set \code{expr = TRUE}.} \item{config}{Optional configuration settings. Can be a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} file.} \item{subg}{Logical indicating whether samples should be subgrouped for plotting.} \item{expr}{Logical - \code{TRUE} if plotting cRPKMs, \code{FALSE} otherwise} \item{trim_colnames}{String that must be searched for and trimmed at the end of every sample column in x. Useful to trim the "-cRPKM" suffix from expression tables. If no string must be trimmed, leave as \code{FALSE}.} \item{qual}{String indicating the minimun \emph{vast-tools} quality score for the PSI to be accepted. Defaults to \code{'VLOW'}. See the \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools documentation} for details.} \item{counts}{Logical indicating whether the data frame contains read counts. Set to \code{TRUE} if the data frame contains two rows per sample (cRPKM and counts), otherwise leave as \code{FALSE} (default).} \item{xlab}{The x-axis label} \item{ylab}{The y-axis label} \item{title}{Title of the plot} \item{cluster_rows}{Logical to cluster rows using hierarchical clustering} \item{cluster_cols}{Logical to cluster columns using hierarchical clustering} \item{fill}{A vector of colours. e.g. from \code{colorRampPalette}. Default is \code{NULL}, which will choose the palette automatically.} \item{usepkg}{Default is \code{ggplot2}, which creates the heatmap using \code{\link[ggplot2]{geom_tile}}. Otherwise, use \code{gplots}, which calls \code{\link[gplots]{heatmap.2}}.} \item{...}{Additional parameters passed to \code{\link[gplots]{heatmap.2}} or \code{\link[pheatmap]{pheatmap}}.} } \description{ Visualize multiple PSI or cRPKM values in a single plot. } \details{ By default, \code{\link[ggplot2]{geom_tile}} is used to generate a heatmap and a \code{ggplot2} object is returned. Alternatively, other heatmap packages are supported including: \code{\link[pheatmap]{pheatmap}} (use \code{usepkgs = "pheatmap"}) and \code{\link[gplots]{heatmap.2}} (use \code{usepkgs = "gplots"}). Input is similar to \code{\link{plot_event}}, \code{\link{plot_expr}}, or \code{\link{plot_multievent}}. Subgrouping of samples is also supported (see \code{\link{plot_event}} and \code{\link{preprocess_sample_colors}} for details on subgrouping). If subgroups are activated, the PSI for each subgroup is taken as the average of all the samples in the subgroup. If \code{cluster_rows = TRUE}, then a hierarchical clustering using \code{hclust} will be performed on a distance matrix computed by \code{dist}. If \code{config} is not specified, then the samples will also be clustered. To set the colours, use \code{fill} option to specify vector of colours. By default (\code{fill=NULL}), PSI uses a yellow/blue gradient, while cRPKMs uses the "YlOrRd" color brewer palette. } \examples{ # Uses ggplot2 by default plot_multi(psi) plot_multi(psi, config = config) # Use expr = TRUE for cRPKMs plot_multi(crpkm, expr = TRUE) plot_multi(crpkm, config = config, expr = TRUE) plot_multi(crpkm, config = config, expr = TRUE, cluster_rows = TRUE) # To use pheatmap or gplots for plotting, set usepgk option plot_multi(psi, config = config, usepkg = "pheatmap") # To enable sample subgroups, set subg = TRUE plot_multi(psi, config = config, subg = TRUE) # Working with expression tables with read counts and suffixes, enabling subgroups plot_multi(crpkm_counts, config = config, expr = TRUE, trim_colnames = "-cRPKM", counts = TRUE) } psiplot-2.3.0/man/plot_multievent.Rd000066400000000000000000000115221331220542100174740ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_multievent.R \name{plot_multievent} \alias{plot_multievent} \title{Plot PSI values of multiple alternative splicing events} \usage{ plot_multievent(x, config = NULL, subg = FALSE, trim_colnames = NULL, qual = c("VLOW", "N", "LOW", "OK", "SOK"), errorbar = TRUE, col = NULL, event_col = NULL, title = "MULTI EVENT PLOT", xlab = "", ylab = "PSI", ylim = c(0, 100), cex.main = 14, cex.yaxis = 12, cex.xaxis = 12, pch = 20, cex.pch = 3, plot = NULL, gridlines = TRUE, lwd = 0.5, show_event_legend = T, show_group_legend = T) } \arguments{ \item{x}{A data frame containing PSI values to be plotted.} \item{config}{Optional configuration settings for \code{plot_event}. Can be a path to the \code{.config} file, or 4/5-column data frame of the \code{.config} file. Use the latter option if you are calling \code{plot_event} multiple times.} \item{subg}{Logical indicating whether samples should be subgrouped for plotting.} \item{trim_colnames}{String that must be searched for and trimmed at the end of every sample column in x. If no string must be trimmed, leave as \code{FALSE}.} \item{qual}{String indicating the minimun \emph{vast-tools} quality score for the PSI to be accepted. Defaults to \code{'VLOW'}. See the \href{https://github.com/vastgroup/vast-tools/blob/master/README.md}{vast-tools documentation} for details.} \item{errorbar}{Logical indicating whether error bars should be drawn} \item{col}{Vector of colors with length matching the number of samples. If specified, this will override the color settings specified in \code{config}.} \item{event_col}{Vector of colors, with length matching the number of events (rows of \code{x}). If left as \code{NULL}, event colors will be set with \code{\link[ggplot2]{scale_colour_hue}}} \item{title}{Title of the plot.} \item{xlab}{The x-axis label.} \item{ylab}{The y-axis label.} \item{ylim}{Range of y-axis.} \item{cex.main}{Plot title size (pts).} \item{cex.yaxis}{Y-axis font size (pts).} \item{cex.xaxis}{X-axis font size (i.e. the sample names) (pts).} \item{pch}{Point symbol.} \item{cex.pch}{Size of datapoints.} \item{plot}{(deprecated) Prints the plot.} \item{gridlines}{Logical indicating whether grid lines should be drawn.} \item{lwd}{Line width for errorbars and the line connecting PSIs from each event.} \item{show_event_legend}{Set to FALSE to avoid showing a legend with the event IDs and their colors.} \item{show_group_legend}{Set to FALSE to avoid showing a legend with the sample groups and their colors.} } \value{ ggplot2 object } \description{ Generate a plot with PSI values for several exons. The PSI values and corresponding quality scores are typically obtained from the \href{https://www.github.com/vastgroup/vast-tools}{vast-tools} pipeline. } \details{ Like in \code{\link{plot_event}} and \code{\link{plot_expr}}, plots can be customized via the \code{config} option. Either a data frame or the filepath to the config file can be used. Alternatively, plots can be customized using a limited set of graphical parameters as described above. See Details of \code{\link{plot_event}} and \code{\link{preprocess_sample_colors}} for more information on the usage of the \code{config}, \code{subg}, and \code{errorbar} arguments. Unlike in \code{\link{plot_event}} and \code{\link{plot_expr}}, sample colors in \code{config} or \code{col} are now shown only in the background, as the point colors are now used to differentiate PSI values from different events. In addition, a line connects the points from each event, to increase visibility. The color of each event can be set using the \code{event_col} argument. Also, note that using \code{subg=TRUE} and \code{errorbar=TRUE} together is an experimental feature, computationally expensive, and CIs may not be shown for some subgroups, especially for events with low coverage and PSI values near 0 or 1 (see \code{\link{get_beta_ci_subg}} for details on error bar estimation for subgrouped samples). } \examples{ plot_multievent(psi, config = config) # Example with subgrouped samples, custom title and no error bars plot_multievent(psi, config = config, subg = TRUE, errorbar = FALSE, title = "Highlighted events") # Legends can be hidden separately plot_multievent(psi, config = config, show_event_legend = FALSE) plot_multievent(psi, config = config, show_group_legend = FALSE) # Custom event colors plot_multievent(psi[1:3,], config = config, event_col=c("red","black","orange")) # Use of errobar = TRUE and subg = TRUE is experimental and computationally expensive \dontrun{ plot_multievent(psi, config = config, subg = TRUE, errorbar = TRUE) } } \seealso{ \code{\link{format_table}} for performing some initial conversion steps of \code{x}. \code{\link{preprocess_sample_colors}} for pre-processing of \code{x} using\code{config}. \code{\link{plot_event}} for plotting single events. } psiplot-2.3.0/man/preprocess_sample_colors.Rd000066400000000000000000000153231331220542100213540ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocess_sample_colors.R \name{preprocess_sample_colors} \alias{preprocess_sample_colors} \title{Preprocess PSI or cRPKM data frame using configuration file} \usage{ preprocess_sample_colors(data, config, subg = TRUE, expr = FALSE, col = NULL, multi_col = NULL) } \arguments{ \item{data}{A \emph{n} x \emph{2*m+1} data frame of PSI and quality score values where \emph{n} is the number of AS events and \emph{m} is the number of samples. If \code{expr=TRUE}, a \emph{n} x \emph{m+1} data frame of cRPKM. In both cases, the first column corresponds to the row metadata. Metadata column values must be unique, duplicated values will be discarded.} \item{config}{Filename of the configuration file for \code{data}. Also accepts \emph{m} x \emph{4} data frame of the configuration file, or an \emph{m} x \emph{5} data frame if the SubgroupName column is included.} \item{subg}{Set to \code{TRUE} to define a subgroup structure using the \code{SubgroupName} column in \code{config}. If \code{FALSE}, or if the file does not contain this column, samples will not be subgrouped (a separate subgroup will be defined for each sample, preserving the sample names). If \code{FALSE} and the file contains a \code{SubgroupName} column, that column will be ignored.} \item{expr}{Set to \code{TRUE} if formatting a cRPKM table. Otherwise, \code{FALSE}.} \item{col}{Vector of colors with length matching the number of samples. If specified, this will override the color settings specified in \code{config}.} \item{multi_col}{Vector of colors with length matching the number of rows in \code{data}. If specified, this can be used to define the color corresponding to each event in \code{plot_multievent()}} } \value{ A list containing: \describe{ \item{data}{data frame of PSI/cRPKM values with columns re-ordered} \item{qual}{data frame of quality scores with columns re-ordered. \code{NULL} if \code{expr = TRUE}} \item{sample_order}{data frame with the order corresponding to each sample name} \item{subgroup}{data frame with the subgroup corresponding to each sample. If \code{subg=FALSE}, or \emph{SubgroupName} is not present in \code{config}, a subgroup is made for each sample, preserving sample names.} \item{subgroup_order}{data frame with the order corresponding to each subgroup.} \item{group}{data frame with the group corresponding to each subgroup} \item{group_order}{data frame with the order and color corresponding to each group.} \item{multi_col}{if \code{multi_col} was specified, a data frame with the color coresponding to each event/gene ID. Else, \code{NULL}.} \item{config}{if a \code{config} was supplied, config data frame summarising the order-sample-subgroup-group-color relationships described in \code{sample_order}, \code{subgroup}, \code{subgroup_order}, \code{group} and \code{group_order}, after correcting for ambiguous relationships. If \code{col} was supplied, colours in config are overridden with \code{col}. If no \code{config} was supplied, one will be composed with default parameters.} \item{original_config}{data frame with the \code{config} supplied to the function} } } \description{ \code{preprocess_sample_colors} re-orders PSI or cRPKM sample columns to a specified order, and it defines sample pools and colors. Order and colors are taken from a pre-defined tab-delimited file (see \code{details}). } \details{ \code{preprocess_sample_colors} depends on a pre-defined "sample inventory" database file in tab-delimited format. This file is species-specific and consists of five columns: (optional) \emph{Order}, \emph{SampleName}, \emph{SubroupName} (optional), \emph{GroupName}, (optional) \emph{RColorCode}. The header is required in the file. Order of the columns is flexible. For example: \preformatted{Order SampleName SubgroupName GroupName RColorCode 1 Oocyte_a Oocyte EarlyDev firebrick4 2 Oocyte_b Oocyte EarlyDev firebrick4 3 Embr_4C_a Embr_4C EarlyDev firebrick4 4 Embr_4C_b Embr_4C EarlyDev firebrick4 5 ESC_CGR8 ESC ESC firebrick etc..} where: \itemize{ \item{Order: A specific ordering of the samples from left to right of the plot.} \item{SampleName: Name of the sample. MUST match sample name in input table.} \item{SubgroupName: Use to define sample pools that will be plotted in the same data point (see \code{plot_event}, \code{plot_expr} and \code{plot_multievent}).} \item{GroupName: Use for plotting the average PSI of samples belonging to the same group. Averages will be calculated from the individual samples, not from the subgroups (to avoid overrepresentation of subgroups with fewer samples).} \item {RColorCode: Color name as specified by \code{\link{colors}} or hex color code (\code{#RRGGBB}).} } The \emph{SampleName} must match the column names in \code{data}. It is possible for \code{config} to contain more samples than the \code{data}. In this case, the extra samples will be ignored. It is also possible that \code{config} contains only a subset of the samples in \code{data}. In this case, only the samples specified in the \code{config} will be plotted and everything else is ignored. If a \emph{SampleName} or \emph{SubgroupName} is matched to multiple groups, only the first match will be used. Similarly, if a \emph{GroupName} is matched to multiple \emph{RColorCodes}, the first one will be applied to all elements in the group. To use the \emph{SubgroupNames} in \code{config}, \code{subg} must be set to \code{TRUE} AND \code{config} must contain a \emph{SubgroupName} column. If any of these conditions is not met, one subgroup will be created for each sample, preserving their name and order, and overriding any subgroups in \code{config}. The colors in \code{config} can be overridden by specifiying \code{col}. This was mainly added to support the \code{col} option provided by \code{\link{plot_event}} -- particularly when \code{config} is not provided. This function is also used for formatting cRPKM input data by setting \code{expr = TRUE}. } \examples{ #Tables from vast-tools need formatting before using this function a <- format_table(psi) reorderedpsi <- preprocess_sample_colors(a, config = config) b <- format_table(crpkm,expr=TRUE) reorderedcrpkm <- preprocess_sample_colors(b, config = config, expr = TRUE) # Subgroups can be avoided even if the config file has them reorderedpsi <- preprocess_sample_colors(a, config = config, subg = FALSE) # Mapping colours to events (e.g. for plotting with plot_multievent) reorderedpsi <- preprocess_sample_colors(a[1:2,], config = config, multi_col = c("red","blue")) } \seealso{ \code{\link{plot_event}}, \code{\link{plot_expr}}, \code{\link{plot_multievent}} } psiplot-2.3.0/man/psi.Rd000066400000000000000000000005021331220542100150310ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{psi} \alias{psi} \title{Sample events with PSI data} \format{A 5 x 22 data frame} \usage{ psi } \description{ Contains sample PSI and quality score data as produced by \code{vast-tools combine}. } \keyword{datasets} psiplot-2.3.0/man/psiplot.Rd000066400000000000000000000027471331220542100157450ustar00rootroot00000000000000% Generated by roxygen2: do not edit by hand % Please edit documentation in R/psiplot-package.R \docType{package} \name{psiplot} \alias{psiplot} \alias{psiplot-package} \title{Produce PSI and GE plots based on output from vast-tools} \description{ \code{psiplot} is an R package for generating plots of percent spliced-in (PSI) values of alternatively spliced exons. It requires input from \href{https://www.github.com/vastgroup/vast-tools}{VAST-TOOLS}, an RNA-Seq pipeline for alternative splicing analysis. } \details{ This package uses input data generated by vast-tools. A sample dataset (\code{psi}, \code{crpkm} and \code{crpkm_counts}) and sample configuration file (\code{config}) is provided. The main functions to generate plots is \code{\link{plot_event}} and \code{\link{plot_expr}} for PSI and cRPKM values, respectively. Two other functions, \code{\link{plot_multievent}} and \code{\link{plot_multi}}, allow plotting of multiple events in scatterplots or heatmaps. \code{\link{plot_multi}} can be used to plot multiple events in the form of a heatmap. See \code{vignette('psiplot-usage', package="psiplot")} for usage details. Report bugs and issues to \url{https://github.com/kcha/psiplot/issues}. } \examples{ library(psiplot) plot_event(psi[1,]) plot_event(psi[1,], config=config, subg=FALSE) plot_expr(crpkm[1,]) plot_expr(crpkm[1,], config=config) } \seealso{ \url{https://www.github.com/kcha/psiplot} \url{https://www.github.com/vastgroup/vast-tools} \url{https://www.vastdb.crg.eu} } psiplot-2.3.0/psiplot.Rproj000066400000000000000000000005771331220542100157200ustar00rootroot00000000000000Version: 1.0 RestoreWorkspace: Yes SaveWorkspace: Yes AlwaysSaveHistory: Yes EnableCodeIndexing: Yes UseSpacesForTab: Yes NumSpacesForTab: 2 Encoding: UTF-8 RnwWeave: knitr LaTeX: pdfLaTeX AutoAppendNewline: Yes StripTrailingWhitespace: Yes BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source PackageRoxygenize: rd,collate,namespace psiplot-2.3.0/tests/000077500000000000000000000000001331220542100143415ustar00rootroot00000000000000psiplot-2.3.0/tests/run_tests.R000077500000000000000000000001211331220542100165070ustar00rootroot00000000000000#!/usr/bin/env Rscript library(testthat) library(psiplot) test_check("psiplot") psiplot-2.3.0/tests/testthat/000077500000000000000000000000001331220542100162015ustar00rootroot00000000000000psiplot-2.3.0/tests/testthat/test_convert_psi.R000066400000000000000000000020061331220542100217140ustar00rootroot00000000000000context("Test conversion of low/bad quality PSI values") x <- data.frame(SampleA = 0, SampleA.Q = "N,N,N,Bn,S@0,0", SampleB = 100, SampleB.Q = "SOK,SOK,SOK,OK,S@90,0", SampleC = 100, SampleC.Q = "N,N,N,Bn,S@1,0", stringsAsFactors=FALSE ) test_that("PSI values with N quality scores are converted to NA", { target <- convert_psi(x) expected <- data.frame(SampleA = as.numeric(NA), SampleA.Q = "N,N,N,Bn,S@0,0", SampleB = 100, SampleB.Q = "SOK,SOK,SOK,OK,S@90,0", SampleC = as.numeric(NA), SampleC.Q = "N,N,N,Bn,S@1,0", stringsAsFactors=FALSE) expect_equal(target, expected) }) x$SampleA.Q = "OK,OK,OK,OK,S@0,0" x$SampleC.Q = "OK,OK,OK,OK,S@1,0" test_that("PSI values with good quality scores are not converted to NA", { target <- convert_psi(x) expect_equal(target, x) }) psiplot-2.3.0/tests/testthat/test_format_table.R000066400000000000000000000035041331220542100220240ustar00rootroot00000000000000context("Test formatting of PSI input table") x <- data.frame(GENE = "TEST", EVENT = "HsaEX00XXXXXXX", COORD = "chrX:100-101", LENGTH = 1, FullCO = "chrX:90,100-101,110", COMPLEX = "S", SampleA = 0, SampleA.Q = "N,N,N,Bn,S@0,0", SampleB = 100, SampleB.Q = "SOK,SOK,SOK,OK,S@90,0", SampleC = 100, SampleC.Q = "N,N,N,Bn,S@1,0", stringsAsFactors=FALSE ) test_that("PSI values with N quality scores are converted to NA", { target <- format_table(x) expected <- data.frame(ID = "S|TEST|HsaEX00XXXXXXX|chrX:100-101|1", SampleA = as.numeric(NA), SampleA.Q = "N,N,N,Bn,S@0,0", SampleB = 100, SampleB.Q = "SOK,SOK,SOK,OK,S@90,0", SampleC = as.numeric(NA), SampleC.Q = "N,N,N,Bn,S@1,0", stringsAsFactors=FALSE) expect_equal(target, expected) }) test_that("An error is thrown if input is missing the correct first column: GENE", { expect_error(format_table(x[,2:ncol(x)])) expect_error(format_table(x[,1:7])) }) context("Test formatting of cRPKM input table") z <- data.frame(ID = "ENSG000000000001", NAME = "TEST", SampleA = 0, SampleB = 1, SampleC = 100, stringsAsFactors=FALSE ) test_that("Row names for cRPKM", { target <- format_table(z, expr = TRUE) expected <- data.frame( ID = "TEST|ENSG000000000001", SampleA = 0, SampleB = 1, SampleC = 100, stringsAsFactors=FALSE ) expect_equal(target, expected) }) psiplot-2.3.0/tests/testthat/test_get_psi_samples.R000066400000000000000000000026321331220542100225440ustar00rootroot00000000000000context("Test getting sample names from PSI table") test_that("Get sample names", { target <- get_psi_samples(psi) expected <- c("Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6", "Sample7", "Sample8") expect_equal(target, expected) }) test_that("Get sample names as indices", { target <- get_psi_samples(psi, value = FALSE) expected <- c(7,9,11,13,15,17,19,21) expect_equal(target, expected) }) test_that("Get samples if quality columns are out of order", { psi2 <- psi set.seed(123) colnames(psi2)[7:ncol(psi2)] <- sample(colnames(psi2)[7:ncol(psi2)]) target <- get_psi_samples(psi, value = TRUE) expected <- c("Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6", "Sample7", "Sample8") expect_true(all(target %in% expected)) }) context("Test getting sample names with config") test_that("Get sample names with config", { target <- get_psi_samples(psi, config = config[1:3,], value = TRUE) expected <- config$SampleName[1:3] expect_equal(target, expected) }) test_that("Get sample names with config as indices", { target <- get_psi_samples(psi, config = config[1:3,], value = FALSE) expected <- c(21,7,9) expect_equal(target, expected) }) psiplot-2.3.0/tests/testthat/test_make_title.R000066400000000000000000000003641331220542100215040ustar00rootroot00000000000000context("Test plot title creation") xname <- "S|TEST|chrX:100-101|1" test_that("Rowname converts to human-friendly title", { target <- make_title(xname) expected <- "TEST\n(chrX:100-101, 1 bp, type S)" expect_equal(target, expected) }) psiplot-2.3.0/tests/testthat/test_preprocess_sample_colors.R000066400000000000000000000035151331220542100244760ustar00rootroot00000000000000context("Test re-ordering of event data using configuration file") config <- data.frame(Order=c(1,2), SampleName=c("Sample1", "Sample4"), GroupName=c("ESC", "Neural"), RColorCode=c("red", "blue") ) formatted_psi <- format_table(psi) formatted_crpkm <- format_table(crpkm, expr = TRUE) test_that("Only samples in config are retained", { r <- preprocess_sample_colors(formatted_psi, config = config) expect_equal(ncol(r$data), nrow(config)) }) context("Test re-ordering of expression data using configuration file") test_that("Quality scores is NULL", { r <- preprocess_sample_colors(formatted_crpkm, config = config, expr = TRUE) expect_true(is.null(r$qual)) expect_equal(ncol(r$data), nrow(config)) expect_equal(nrow(r$data), nrow(formatted_crpkm)) }) test_that("Quality scores is NULL when config is not used", { r <- preprocess_sample_colors(formatted_crpkm, config = NULL, expr = TRUE) expect_true(is.null(r$qual)) expect_equal(ncol(r$data), 8) expect_equal(nrow(r$data), nrow(formatted_crpkm)) }) context("Test absence of optional columns") test_that("Natural order is used with no Order column is specified", { config2 <- config config2$Order <- NULL r <- preprocess_sample_colors(formatted_psi, config2) expect_true(all(r$sample_order$SampleOrder== 1:nrow(config2)), "Using natural order") expect_true("Order" %in% colnames(r$config)) }) test_that("Default colors are used if RColorCode is missing", { config2 <- config config2$RColorCode <- NULL r <- preprocess_sample_colors(formatted_psi, config2) expect_true("RColorCode" %in% colnames(r$config)) }) context("Test that input PSI table is formattted correctly") test_that("Error is returned if first column is not ID", { expect_error(preprocess_sample_colors(psi, config)) }) psiplot-2.3.0/vignettes/000077500000000000000000000000001331220542100152075ustar00rootroot00000000000000psiplot-2.3.0/vignettes/psiplot-usage.Rmd000066400000000000000000000254171331220542100204600ustar00rootroot00000000000000--- title: "Introduction to psiplot" author: "Kevin Ha and Javier Tapial" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: toc: true toc_depth: 4 vignette: > %\VignetteIndexEntry{Introduction to psiplot} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width=7, fig.height=4.5 ) ``` psiplot is an R package for generating plots of percent spliced-in (PSI) values of alternatively-spliced exons that were computed by [vast-tools](https://github.com/vastgroup/vast-tools), an RNA-Seq pipeline for alternative splicing analysis. The plots are generated using `ggplot2`. ## Installation See [Releases](https://github.com/kcha/psiplot/releases) for the latest stable release or get the most up-to-date development version via devtools: ```{r eval=FALSE} if (!require("devtools")) install.packages("devtools") devtools::install_github("kcha/psiplot") ``` ## Usage ### Input psiplot takes as input the PSI and/or cRPKM results generated by vast-tools (e.g. after running `vast-tools combine` or `vast-tools diff`). For example, ```{r eval=FALSE} psi <- read.table("INCLUSION_LEVELS_FULL-Mmu53.tab", header = TRUE, sep = "\t", stringsAsFactors = FALSE) crpkm <- read.table("cRPKM-Mmu53.tab", header = TRUE, sep = "\t", stringsAsFactors = FALSE) ``` This README uses the provided sample datasets, `psi`, `crpkm` and `crpkm_counts`, as example input data. We also provide an optional sample configuration table, `config`, which is used for [customizing psiplots](#customizing-plots). ### Plotting Events can be plotted individually as a scatterplot (a.k.a "psiplots") or collectively as a heatmap. A function to produce psiplots for multiple events is also provided. #### Individual events The function `plot_event()` generates a plot of a single event: ```{r plot_event, eval=TRUE, warning=FALSE} library(psiplot) # Plot an event using provided sample dataset plot_event(psi[1,], config = config) ``` Alternatively, to plot an event by gene name (for example, MTA1): ```{r plot_event_bygenename, eval=FALSE} plot_event(psi[psi$GENE == "MTA1",], config = config) ```
#### Multi-event PSI plots Several events can be plotted together with the function `plot_multievent()`. This allows users to compare the inclusion patterns of small groups of events: ```{r plot_multievent, eval=TRUE,warning=FALSE} plot_multievent(psi[c(1,2),], config = config, event_col = c("black", "red")) ``` #### Plotting gene expression values In addition, cRPKM expression values generated by vast-tools can also be plotted in a similar manner using the function `plot_expr()`: ```{r plot_expr, eval=TRUE,warning=FALSE} plot_expr(crpkm[1,], config = config) ``` #### Plotting heatmaps The function `plot_multi` generates a heatmap of multiple events using `geom_tile`. Alternatively, if you have the R package `pheatmap` or `gplots` installed, you can set `usepkgs = 'pheatmap'` or `usepkgs = 'gplots'` to generate a heatmap. By default, rows and columns will be ordered by hierarchical clustering. One benefit of using `pheatmap` or `gplots` is the ability to include group annotations from the config file: ```{r plot_multi, fig.width=5, fig.height=3.5} # example using pheatmap plot_multi(psi, config=config, usepkg = 'pheatmap') ``` Other use cases: ```r ## Not run # For cRPKM, use expr = TRUE plot_multi(crpkm, expr = TRUE) # To disable clustering of events plot_multi(psi, cluster_rows = FALSE) # To disable clustering of samples plot_multi(psi, cluster_cols = FALSE) # To generate a pheatmap-based heatmap plot_multi(psi, usepkg = "pheatmap") ``` ### Customizing plots There are two ways to customize the plots: using a configuration file or using R arguments. #### Using a custom `config` file In `vast-tools plot`, an optional config file can be used to customize the plots' visual appearance. The same config file can be supplied here as well. ```{r eval=FALSE} plot_event(psi[1,], config = "/path/to/config") # config can also be pre-loaded into a data frame cfg <- read.table("/path/to/config", header = TRUE, sep = "\t", stringsAsFactor = FALSE) plot_event(psi[1,], config = cfg) plot_multi(psi, config = cfg) plot_expr(crpkm[1,], config = cfg) ``` This file is tab-delimited and must be manually created. For example: ```{r} # sample config data config ``` The header is required, but the order of the columns is flexible. There are two required columns and three optional: Required: 1. **SampleName**: Name of the sample. MUST match sample name in input table. 1. **GroupName**: Group name. Use for plotting the average PSI of samples belonging to the same group (enable by setting `groupmean=TRUE`). Optional: 1. **Order**: A specific ordering of the samples from left to right of the plot. When not specified, then the natural order of the config file will be used. 1. **SubgroupName**: Subgroup name. Use for plotting the average PSI of samples belonging to the same subgroup INSTEAD of the individual samples (enable by setting `subg=TRUE`). See [Subgrouping samples] for more details. 1. **RColorCode**: An R color specification: 1. color name (as specified by `colors()`). 2. hex color code (#rrggbb). Tips: - The samples under **SampleName** MUST MATCH the names in the input table. Only the samples listed in the config file will be represented in the resulting plots. Other samples in the input table but not in the config file will be ignored. This may be useful for plotting only a subset of samples. - The column **Order** does not need to be in sorted order. Thus, you can change the ordering of your samples by simply changing the order number. - Colors specified in **RColorCode** can be overridden using the `col` option. - If **RColorCode** is not specified or if the entire column is set to `NA`, then a default ggplot2 color palette will be used for annotating sample groups. For example: ```{r warning=FALSE} config2 <- config config2$RColorCode <- NA head(config2) plot_event(psi[1,], config2) ``` - When a group is assigned to multiple colors, only the first color will be used. - For `plot_multi`, specifying a config file will disable clustering of samples and instead use the config order. - If the config file does not include subgroups, samples will not be subgrouped, even if `subg` is set to `TRUE`. Similarly, if the config file includes subgroups, but `subg` is set to `FALSE`, they will not be used. - When a sample is mapped to multiple subgroups, it will only be included in the first one. - When a subgroup is mapped to multiple groups, it will only be included in the first one. #### Using R The colors and other graphical parameters can also be configured in R via arguments. The `plot_*` family of methods provide a limited set of graphical arguments and can be used in conjunction with a config file. See the help pages for each method (e.g. `?plot_event`) and for more details on the available options. For example, the following command uses `config` to customize the colors and groupings, sets the point symbol, and restricts the y-axis to (20, 80): ```{r eval=TRUE, warning=FALSE} plot_event(psi[1,], config = config, pch = 9, ylim = c(20, 80)) ``` Note: Samples 6, 7, 8 fall outside of this range and thus are not shown. Because the `plot_*` methods return ggplot2 objects, you can further customize the plots by appending additional aesthetics or themes (if the option is not supported within the method itself). For example, to increase the text size of the legend: ```{r eval=TRUE, warning=FALSE} library(ggplot2) plot_event(psi[1,], config = config) + theme(legend.text = element_text(size = 20)) ``` Certain options may interfere or overwite those already set within the `plot_*` methods, so please use at your discretion. ### Options available for all plotting functions #### Filtering samples by quality score The `qual` argument can be used to indicate the minimum value of the first vast-tools quality score that a PSI value needs to have in order to be accepted. PSI values with lower quality scores will be coerced to NA. The possible values for this score are, from worse to better: `N`, `VLOW`, `LOW`, `OK`, and `SOK`. By default, the minimum quality accepted is `VLOW`. For more information on vast-tools quality scores, please see [the description of vast-tools output](https://github.com/vastgroup/vast-tools/blob/master/README.md#combine-output-format) (column 8). #### Subgrouping samples The `subg` argument allows pooling samples into subgroups if there is a **SubgroupName** column included in the supplied `config` file (see [Customizing plots]). The PSI of a subgroup is the mean of the PSIs of its individual samples, after filtering out the samples with quality score below the threshold indicated by `qual` (see [Filtering samples by quality score]). ```{r plot_event_subg, eval=TRUE, warning=FALSE} plot_event(psi[1,], config = config, subg = TRUE) ``` Alternatively, rather than plotting the average PSI, the individual values can be plotted by setting the option `subj.show` to "all" or "beeswarm" (default is "mean"). The latter uses [ggbeeswarm](https://github.com/eclarke/ggbeeswarm) to make beeswarm scatterplots. One limitation of beeswarm plots is that error bars cannot be plotted, at least to my knowledge. If error bars are needed, choose "all": ```{r plot_event_subg_all, eval=TRUE, warning=FALSE} library(dplyr) config2 <- config %>% mutate( SubgroupName = ifelse(Order <= 5, "Subgroup1", "Subgroup2") ) plot_event(psi[1,], config = config2, subg = TRUE, subg.show = "all") ``` To illustrate a subgrouped plot using beeswarm plots, we'll constrat a larger PSI table with 100 samples: ```{r plot_event_subg_beeswarm, eval=TRUE, warning=FALSE} set.seed(416) large_psi <- tibble( GENE = "TEST", EVENT = "HsaEx0000", COORD = "chr1:100-200", LENGTH = 100, FullCO = "chr1:1,100-200,210", COMPLEX = "S", SampleName = paste0("Sample", sprintf("%0.3d", 1:100)), PSI = c(rbeta(30, 10, 90), rbeta(30, 10, 11), rbeta(40, 9,2))*100, Q = "OK,OK,OK,OK,S@50,50" # dummy quality score - not used ) psi_temp <- tidyr::spread(large_psi, SampleName, PSI) %>% select(-Q) qual_temp <- large_psi %>% mutate(SampleName = paste0(SampleName, "-Q")) %>% select(-PSI) %>% tidyr::spread(SampleName, Q) # Put everything together large_config <- tibble( SampleName = large_psi$SampleName, GroupName = c(rep("ESC", 30), rep("Muscle", 30), rep("Brain", 40)), SubgroupName = c(rep("Subgroup1", 10), rep("Subgroup2", 20), rep("Subgroup3", 30), rep("Subgroup4", 40)) ) large_psi <- inner_join(psi_temp, qual_temp) large_psi <- large_psi[, c(names(large_psi)[1:6], sort(names(large_psi)[7:ncol(large_psi)]))] plot_event(large_psi[1,], large_config, subg = T, subg.show = "beeswarm") ``` psiplot-2.3.0/vignettes/psiplot-usage.html000066400000000000000000021313521331220542100207000ustar00rootroot00000000000000 Introduction to psiplot

Introduction to psiplot

Kevin Ha and Javier Tapial

2018-06-19

psiplot is an R package for generating plots of percent spliced-in (PSI) values of alternatively-spliced exons that were computed by vast-tools, an RNA-Seq pipeline for alternative splicing analysis. The plots are generated using ggplot2.

Installation

See Releases for the latest stable release or get the most up-to-date development version via devtools:

Usage

Input

psiplot takes as input the PSI and/or cRPKM results generated by vast-tools (e.g. after running vast-tools combine or vast-tools diff). For example,

This README uses the provided sample datasets, psi, crpkm and crpkm_counts, as example input data. We also provide an optional sample configuration table, config, which is used for customizing psiplots.

Plotting

Events can be plotted individually as a scatterplot (a.k.a “psiplotsâ€) or collectively as a heatmap. A function to produce psiplots for multiple events is also provided.

Individual events

The function plot_event() generates a plot of a single event:

Alternatively, to plot an event by gene name (for example, MTA1):


Multi-event PSI plots

Several events can be plotted together with the function plot_multievent(). This allows users to compare the inclusion patterns of small groups of events:

Plotting gene expression values

In addition, cRPKM expression values generated by vast-tools can also be plotted in a similar manner using the function plot_expr():

Plotting heatmaps

The function plot_multi generates a heatmap of multiple events using geom_tile. Alternatively, if you have the R package pheatmap or gplots installed, you can set usepkgs = 'pheatmap' or usepkgs = 'gplots' to generate a heatmap. By default, rows and columns will be ordered by hierarchical clustering. One benefit of using pheatmap or gplots is the ability to include group annotations from the config file:

Other use cases:

Customizing plots

There are two ways to customize the plots: using a configuration file or using R arguments.

Using a custom config file

In vast-tools plot, an optional config file can be used to customize the plots’ visual appearance. The same config file can be supplied here as well.

This file is tab-delimited and must be manually created. For example:

The header is required, but the order of the columns is flexible. There are two required columns and three optional:

Required:

  1. SampleName: Name of the sample. MUST match sample name in input table.
  2. GroupName: Group name. Use for plotting the average PSI of samples belonging to the same group (enable by setting groupmean=TRUE).

Optional:

  1. Order: A specific ordering of the samples from left to right of the plot. When not specified, then the natural order of the config file will be used.
  2. SubgroupName: Subgroup name. Use for plotting the average PSI of samples belonging to the same subgroup INSTEAD of the individual samples (enable by setting subg=TRUE). See Subgrouping samples for more details.
  3. RColorCode: An R color specification:
    1. color name (as specified by colors()).
    2. hex color code (#rrggbb).

Tips:

  • The samples under SampleName MUST MATCH the names in the input table. Only the samples listed in the config file will be represented in the resulting plots. Other samples in the input table but not in the config file will be ignored. This may be useful for plotting only a subset of samples.
  • The column Order does not need to be in sorted order. Thus, you can change the ordering of your samples by simply changing the order number.
  • Colors specified in RColorCode can be overridden using the col option.
  • If RColorCode is not specified or if the entire column is set to NA, then a default ggplot2 color palette will be used for annotating sample groups. For example:

  • When a group is assigned to multiple colors, only the first color will be used.
  • For plot_multi, specifying a config file will disable clustering of samples and instead use the config order.
  • If the config file does not include subgroups, samples will not be subgrouped, even if subg is set to TRUE. Similarly, if the config file includes subgroups, but subg is set to FALSE, they will not be used.
  • When a sample is mapped to multiple subgroups, it will only be included in the first one.
  • When a subgroup is mapped to multiple groups, it will only be included in the first one.

Using R

The colors and other graphical parameters can also be configured in R via arguments. The plot_* family of methods provide a limited set of graphical arguments and can be used in conjunction with a config file. See the help pages for each method (e.g. ?plot_event) and for more details on the available options.

For example, the following command uses config to customize the colors and groupings, sets the point symbol, and restricts the y-axis to (20, 80):

Note: Samples 6, 7, 8 fall outside of this range and thus are not shown.

Because the plot_* methods return ggplot2 objects, you can further customize the plots by appending additional aesthetics or themes (if the option is not supported within the method itself). For example, to increase the text size of the legend:

Certain options may interfere or overwite those already set within the plot_* methods, so please use at your discretion.

Options available for all plotting functions

Filtering samples by quality score

The qual argument can be used to indicate the minimum value of the first vast-tools quality score that a PSI value needs to have in order to be accepted. PSI values with lower quality scores will be coerced to NA.

The possible values for this score are, from worse to better: N, VLOW, LOW, OK, and SOK. By default, the minimum quality accepted is VLOW. For more information on vast-tools quality scores, please see the description of vast-tools output (column 8).

Subgrouping samples

The subg argument allows pooling samples into subgroups if there is a SubgroupName column included in the supplied config file (see Customizing plots). The PSI of a subgroup is the mean of the PSIs of its individual samples, after filtering out the samples with quality score below the threshold indicated by qual (see Filtering samples by quality score).

Alternatively, rather than plotting the average PSI, the individual values can be plotted by setting the option subj.show to “all†or “beeswarm†(default is “meanâ€). The latter uses ggbeeswarm to make beeswarm scatterplots. One limitation of beeswarm plots is that error bars cannot be plotted, at least to my knowledge. If error bars are needed, choose “allâ€:

To illustrate a subgrouped plot using beeswarm plots, we’ll constrat a larger PSI table with 100 samples: