aroma.light/0000755000175000017500000000000014147402522012612 5ustar nileshnilesharoma.light/DESCRIPTION0000644000175000017500000000266514136064722014335 0ustar nileshnileshPackage: aroma.light Version: 3.24.0 Depends: R (>= 2.15.2) Imports: stats, R.methodsS3 (>= 1.7.1), R.oo (>= 1.23.0), R.utils (>= 2.9.0), matrixStats (>= 0.55.0) Suggests: princurve (>= 2.1.4) Title: Light-Weight Methods for Normalization and Visualization of Microarray Data using Only Basic R Data Types Authors@R: c( person("Henrik", "Bengtsson", role = c("aut", "cre", "cph"), email = "henrikb@braju.com"), person("Pierre", "Neuvial", role = "ctb"), person("Aaron", "Lun", role = "ctb")) Description: Methods for microarray analysis that take basic data types such as matrices and lists of vectors. These methods can be used standalone, be utilized in other packages, or be wrapped up in higher-level classes. License: GPL (>= 2) biocViews: Infrastructure, Microarray, OneChannel, TwoChannel, MultiChannel, Visualization, Preprocessing URL: https://github.com/HenrikBengtsson/aroma.light, https://www.aroma-project.org BugReports: https://github.com/HenrikBengtsson/aroma.light/issues LazyLoad: TRUE Encoding: latin1 git_url: https://git.bioconductor.org/packages/aroma.light git_branch: RELEASE_3_14 git_last_commit: d0f8f2b git_last_commit_date: 2021-10-26 Date/Publication: 2021-10-26 NeedsCompilation: no Packaged: 2021-10-26 20:49:22 UTC; biocbuild Author: Henrik Bengtsson [aut, cre, cph], Pierre Neuvial [ctb], Aaron Lun [ctb] Maintainer: Henrik Bengtsson aroma.light/man/0000755000175000017500000000000014136047216013370 5ustar nileshnilesharoma.light/man/print.SmoothSplineLikelihood.Rd0000644000175000017500000000172514136047216021447 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % print.SmoothSplineLikelihood.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{print.SmoothSplineLikelihood} \alias{print.SmoothSplineLikelihood} \alias{SmoothSplineLikelihood.print} \alias{print,SmoothSplineLikelihood-method} \title{Prints an SmoothSplineLikelihood object} \description{ Prints an SmoothSplineLikelihood object. A SmoothSplineLikelihood object is returned by \code{\link{likelihood.smooth.spline}()}. } \usage{ \method{print}{SmoothSplineLikelihood}(x, digits=getOption("digits"), ...) } \arguments{ \item{x}{Object to be printed.} \item{digits}{Minimal number of significant digits to print.} \item{...}{Not used.} } \value{ Returns nothing. } \author{Henrik Bengtsson} \keyword{internal} \keyword{methods} aroma.light/man/backtransformPrincipalCurve.Rd0000644000175000017500000001345714136047216021374 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % backtransformPrincipalCurve.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{backtransformPrincipalCurve} \alias{backtransformPrincipalCurve} \alias{backtransformPrincipalCurve.numeric} \alias{backtransformPrincipalCurve.matrix} \title{Reverse transformation of principal-curve fit} \description{ Reverse transformation of principal-curve fit. } \usage{ \method{backtransformPrincipalCurve}{matrix}(X, fit, dimensions=NULL, targetDimension=NULL, ...) \method{backtransformPrincipalCurve}{numeric}(X, ...) } \arguments{ \item{X}{An NxK \code{\link[base]{matrix}} containing data to be backtransformed.} \item{fit}{An MxL principal-curve fit object of class \code{principal_curve} as returned by \code{\link{fitPrincipalCurve}}(). Typically \eqn{L = K}, but not always. } \item{dimensions}{An (optional) subset of of D dimensions all in [1,L] to be returned (and backtransform).} \item{targetDimension}{An (optional) index specifying the dimension in [1,L] to be used as the target dimension of the \code{fit}. More details below.} \item{...}{Passed internally to \code{\link[stats]{smooth.spline}}.} } \value{ The backtransformed NxK (or NxD) \code{\link[base]{matrix}}. } \details{ Each column in X ("dimension") is backtransformed independently of the others. } \section{Target dimension}{ By default, the backtransform is such that afterward the signals are approximately proportional to the (first) principal curve as fitted by \code{\link{fitPrincipalCurve}}(). This scale and origin of this principal curve is not uniquely defined. If \code{targetDimension} is specified, then the backtransformed signals are approximately proportional to the signals of the target dimension, and the signals in the target dimension are unchanged. } \section{Subsetting dimensions}{ Argument \code{dimensions} can be used to backtransform a subset of dimensions (K) based on a subset of the fitted dimensions (L). If \eqn{K = L}, then both \code{X} and \code{fit} is subsetted. If \eqn{K <> L}, then it is assumed that \code{X} is already subsetted/expanded and only \code{fit} is subsetted. } \examples{ # Consider the case where K=4 measurements have been done # for the same underlying signals 'x'. The different measurements # have different systematic variation # # y_k = f(x_k) + eps_k; k = 1,...,K. # # In this example, we assume non-linear measurement functions # # f(x) = a + b*x + x^c + eps(b*x) # # where 'a' is an offset, 'b' a scale factor, and 'c' an exponential. # We also assume heteroscedastic zero-mean noise with standard # deviation proportional to the rescaled underlying signal 'x'. # # Furthermore, we assume that measurements k=2 and k=3 undergo the # same transformation, which may illustrate that the come from # the same batch. However, when *fitting* the model below we # will assume they are independent. # Transforms a <- c(2, 15, 15, 3) b <- c(2, 3, 3, 4) c <- c(1, 2, 2, 1/2) K <- length(a) # The true signal N <- 1000 x <- rexp(N) # The noise bX <- outer(b,x) E <- apply(bX, MARGIN=2, FUN=function(x) rnorm(K, mean=0, sd=0.1*x)) # The transformed signals with noise Xc <- t(sapply(c, FUN=function(c) x^c)) Y <- a + bX + Xc + E Y <- t(Y) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit principal curve # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit principal curve through Y = (y_1, y_2, ..., y_K) fit <- fitPrincipalCurve(Y) # Flip direction of 'lambda'? rho <- cor(fit$lambda, Y[,1], use="complete.obs") flip <- (rho < 0) if (flip) { fit$lambda <- max(fit$lambda, na.rm=TRUE)-fit$lambda } L <- ncol(fit$s) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Backtransform data according to model fit # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Backtransform toward the principal curve (the "common scale") YN1 <- backtransformPrincipalCurve(Y, fit=fit) stopifnot(ncol(YN1) == K) # Backtransform toward the first dimension YN2 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=1) stopifnot(ncol(YN2) == K) # Backtransform toward the last (fitted) dimension YN3 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=L) stopifnot(ncol(YN3) == K) # Backtransform toward the third dimension (dimension by dimension) # Note, this assumes that K == L. YN4 <- Y for (cc in 1:L) { YN4[,cc] <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=1, dimensions=cc) } stopifnot(identical(YN4, YN2)) # Backtransform a subset toward the first dimension # Note, this assumes that K == L. YN5 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=1, dimensions=2:3) stopifnot(identical(YN5, YN2[,2:3])) stopifnot(ncol(YN5) == 2) # Extract signals from measurement #2 and backtransform according # its model fit. Signals are standardized to target dimension 1. y6 <- Y[,2,drop=FALSE] yN6 <- backtransformPrincipalCurve(y6, fit=fit, dimensions=2, targetDimension=1) stopifnot(identical(yN6, YN2[,2,drop=FALSE])) stopifnot(ncol(yN6) == 1) # Extract signals from measurement #2 and backtransform according # the the model fit of measurement #3 (because we believe these # two have undergone very similar transformations. # Signals are standardized to target dimension 1. y7 <- Y[,2,drop=FALSE] yN7 <- backtransformPrincipalCurve(y7, fit=fit, dimensions=3, targetDimension=1) stopifnot(ncol(yN7) == 1) stopifnot(cor(yN7, yN6) > 0.9999) } \seealso{ \code{\link{fitPrincipalCurve}}() } \keyword{methods} aroma.light/man/fitIWPCA.Rd0000644000175000017500000001256314136047216015234 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % fitIWPCA.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{fitIWPCA} \alias{fitIWPCA} \alias{fitIWPCA.matrix} \title{Robust fit of linear subspace through multidimensional data} \description{ Robust fit of linear subspace through multidimensional data. } \usage{ \method{fitIWPCA}{matrix}(X, constraint=c("diagonal", "baseline", "max"), baselineChannel=NULL, ..., aShift=rep(0, times = ncol(X)), Xmin=NULL) } \arguments{ \item{X}{NxK \code{\link[base]{matrix}} where N is the number of observations and K is the number of dimensions (channels). } \item{constraint}{A \code{\link[base]{character}} string or a \code{\link[base]{numeric}} value. If \code{\link[base]{character}} it specifies which additional constraint to be used to specify the offset parameters along the fitted line; If \code{"diagonal"}, the offset vector will be a point on the line that is closest to the diagonal line (1,...,1). With this constraint, all bias parameters are identifiable. If \code{"baseline"} (requires argument \code{baselineChannel}), the estimates are such that of the bias and scale parameters of the baseline channel is 0 and 1, respectively. With this constraint, all bias parameters are identifiable. If \code{"max"}, the offset vector will the point on the line that is as "great" as possible, but still such that each of its components is less than the corresponding minimal signal. This will guarantee that no negative signals are created in the backward transformation. If \code{\link[base]{numeric}} value, the offset vector will the point on the line such that after applying the backward transformation there are \code{constraint*N}. Note that \code{constraint==0} corresponds approximately to \code{constraint=="max"}. With the latter two constraints, the bias parameters are only identifiable modulo the fitted line. } \item{baselineChannel}{Index of channel toward which all other channels are conform. This argument is required if \code{constraint=="baseline"}. This argument is optional if \code{constraint=="diagonal"} and then the scale factor of the baseline channel will be one. The estimate of the bias parameters is not affected in this case. Defaults to one, if missing. } \item{...}{Additional arguments accepted by \code{\link{iwpca}}(). For instance, a N \code{\link[base]{vector}} of weights for each observation may be given, otherwise they get the same weight. } \item{aShift, Xmin}{For internal use only.} } \value{ Returns a \code{\link[base]{list}} that contains estimated parameters and algorithm details; \item{a}{A \code{\link[base]{double}} \code{\link[base]{vector}} \eqn{(a[1],...,a[K])}with offset parameter estimates. It is made identifiable according to argument \code{constraint}. } \item{b}{A \code{\link[base]{double}} \code{\link[base]{vector}} \eqn{(b[1],...,b[K])}with scale parameter estimates. It is made identifiable by constraining \code{b[baselineChannel] == 1}. These estimates are independent of argument \code{constraint}. } \item{adiag}{If identifiability constraint \code{"diagonal"}, a \code{\link[base]{double}} \code{\link[base]{vector}} \eqn{(adiag[1],...,adiag[K])}, where \eqn{adiag[1] = adiag[2] = ... adiag[K]}, specifying the point on the diagonal line that is closest to the fitted line, otherwise the zero vector. } \item{eigen}{A KxK \code{\link[base]{matrix}} with columns of eigenvectors. } \item{converged}{\code{\link[base:logical]{TRUE}} if the algorithm converged, otherwise \code{\link[base:logical]{FALSE}}. } \item{nbrOfIterations}{The number of iterations for the algorithm to converge, or zero if it did not converge. } \item{t0}{Internal parameter estimates, which contains no more information than the above listed elements. } \item{t}{Always \code{\link[base]{NULL}}.} } \details{ This method uses re-weighted principal component analysis (IWPCA) to fit a the model \eqn{y_n = a + bx_n + eps_n} where \eqn{y_n}, \eqn{a}, \eqn{b}, and \eqn{eps_n} are vector of the K and \eqn{x_n} is a scalar. The algorithm is: For iteration i: 1) Fit a line \eqn{L} through the data close using weighted PCA with weights \eqn{\{w_n\}}. Let \eqn{r_n = \{r_{n,1},...,r_{n,K}\}} be the \eqn{K} principal components. 2) Update the weights as \eqn{w_n <- 1 / \sum_{2}^{K} (r_{n,k} + \epsilon_r)} where we have used the residuals of all but the first principal component. 3) Find the point a on \eqn{L} that is closest to the line \eqn{D=(1,1,...,1)}. Similarly, denote the point on D that is closest to \eqn{L} by \eqn{t=a*(1,1,...,1)}. } \author{Henrik Bengtsson} %examples "fitMultiIWPCA.matrix.Rex" \seealso{ This is an internal method used by the \code{\link{calibrateMultiscan}}() and \code{\link{normalizeAffine}}() methods. Internally the function \code{\link{iwpca}}() is used to fit a line through the data cloud and the function \code{\link{distanceBetweenLines}}() to find the closest point to the diagonal (1,1,...,1). } \keyword{methods} \keyword{algebra} aroma.light/man/normalizeQuantileRank.Rd0000644000175000017500000000713514136047216020204 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeQuantileRank.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeQuantileRank} \alias{normalizeQuantileRank} \alias{normalizeQuantileRank.numeric} \alias{normalizeQuantileRank.list} \alias{normalizeQuantile} \alias{normalizeQuantile.default} \title{Normalizes the empirical distribution of one of more samples to a target distribution} \usage{ \method{normalizeQuantileRank}{numeric}(x, xTarget, ties=FALSE, ...) \method{normalizeQuantileRank}{list}(X, xTarget=NULL, ...) \method{normalizeQuantile}{default}(x, ...) } \description{ Normalizes the empirical distribution of one of more samples to a target distribution. The average sample distribution is calculated either robustly or not by utilizing either \code{weightedMedian()} or \code{weighted.mean()}. A weighted method is used if any of the weights are different from one. } \arguments{ \item{x, X}{a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N or a \code{\link[base]{list}} of length N with \code{\link[base]{numeric}} \code{\link[base]{vector}}s. If a \code{\link[base]{list}}, then the \code{\link[base]{vector}}s may be of different lengths.} \item{xTarget}{The target empirical distribution as a \emph{sorted} \code{\link[base]{numeric}} \code{\link[base]{vector}} of length \eqn{M}. If \code{\link[base]{NULL}} and \code{X} is a \code{\link[base]{list}}, then the target distribution is calculated as the average empirical distribution of the samples.} \item{ties}{Should ties in \code{x} be treated with care or not? For more details, see "limma:normalizeQuantiles".} \item{...}{Not used.} } \value{ Returns an object of the same shape as the input argument. } \section{Missing values}{ Missing values are excluded when estimating the "common" (the baseline). Values that are \code{\link[base]{NA}} remain \code{\link[base]{NA}} after normalization. No new \code{\link[base]{NA}}s are introduced. } \section{Weights}{ Currently only channel weights are support due to the way quantile normalization is done. If signal weights are given, channel weights are calculated from these by taking the mean of the signal weights in each channel. } \examples{ # Simulate ten samples of different lengths N <- 10000 X <- list() for (kk in 1:8) { rfcn <- list(rnorm, rgamma)[[sample(2, size=1)]] size <- runif(1, min=0.3, max=1) a <- rgamma(1, shape=20, rate=10) b <- rgamma(1, shape=10, rate=10) values <- rfcn(size*N, a, b) # "Censor" values values[values < 0 | values > 8] <- NA X[[kk]] <- values } # Add 20\% missing values X <- lapply(X, FUN=function(x) { x[sample(length(x), size=0.20*length(x))] <- NA x }) # Normalize quantiles Xn <- normalizeQuantile(X) # Plot the data layout(matrix(1:2, ncol=1)) xlim <- range(X, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The original distributions") plotDensity(Xn, lwd=2, xlim=xlim, main="The normalized distributions") } \author{ Adopted from Gordon Smyth (\url{http://www.statsci.org/}) in 2002 \& 2006. Original code by Ben Bolstad at Statistics Department, University of California. } \seealso{ To calculate a target distribution from a set of samples, see \code{\link{averageQuantile}}(). For an alternative empirical density normalization methods, see \code{\link{normalizeQuantileSpline}}(). } \keyword{methods} \keyword{nonparametric} \keyword{multivariate} \keyword{robust} aroma.light/man/plotMvsAPairs.Rd0000644000175000017500000000273614136047216016433 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % plotMvsAPairs.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{plotMvsAPairs} \alias{plotMvsAPairs} \alias{plotMvsAPairs.matrix} \title{Plot log-ratios/log-intensities for all unique pairs of data vectors} \description{ Plot log-ratios/log-intensities for all unique pairs of data vectors. } \usage{ \method{plotMvsAPairs}{matrix}(X, Alab="A", Mlab="M", Alim=c(0, 16), Mlim=c(-1, 1) * diff(Alim), pch=".", ..., add=FALSE) } \arguments{ \item{X}{NxK \code{\link[base]{matrix}} where N is the number of observations and K is the number of channels.} \item{Alab,Mlab}{Labels on the x and y axes.} \item{Alim,Mlim}{Plot range on the A and M axes.} \item{pch}{Plot symbol used.} \item{...}{Additional arguments accepted by \code{\link[graphics]{points}}.} \item{add}{If \code{\link[base:logical]{TRUE}}, data points are plotted in the current plot, otherwise a new plot is created.} } \details{ Log-ratios and log-intensities are calculated for each neighboring pair of channels (columns) and plotted. Thus, in total there will be K-1 data set plotted. The colors used for the plotted pairs are 1, 2, and so on. To change the colors, use a different color palette. } \value{ Returns nothing. } \author{Henrik Bengtsson} \keyword{methods} aroma.light/man/robustSmoothSpline.Rd0000644000175000017500000001006514136047216017544 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % robustSmoothSpline.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{robustSmoothSpline} \alias{robustSmoothSpline.default} \alias{robustSmoothSpline} \title{Robust fit of a Smoothing Spline} \usage{ \method{robustSmoothSpline}{default}(x, y=NULL, w=NULL, ..., minIter=3, maxIter=max(minIter, 50), method=c("L1", "symmetric"), sdCriteria=2e-04, reps=1e-15, tol=1e-06 * IQR(x), plotCurves=FALSE) } \description{ Fits a smoothing spline robustly using the \eqn{L_1} norm. Currently, the algorithm is an \emph{iterative reweighted smooth spline} algorithm which calls \code{smooth.spline(x,y,w,...)} at each iteration with the weights \code{w} equal to the inverse of the absolute value of the residuals for the last iteration step. } \arguments{ \item{x}{a \code{\link[base]{vector}} giving the values of the predictor variable, or a \code{\link[base]{list}} or a two-column \code{\link[base]{matrix}} specifying \code{x} and \code{y}. If \code{x} is of class \code{smooth.spline} then \code{x$x} is used as the \code{x} values and \code{x$yin} are used as the \code{y} values.} \item{y}{responses. If \code{y} is missing, the responses are assumed to be specified by \code{x}.} \item{w}{a \code{\link[base]{vector}} of weights the same length as \code{x} giving the weights to use for each element of \code{x}. Default value is equal weight to all values.} \item{...}{Other arguments passed to \code{\link[stats]{smooth.spline}}.} \item{minIter}{the minimum number of iterations used to fit the smoothing spline robustly. Default value is 3.} \item{maxIter}{the maximum number of iterations used to fit the smoothing spline robustly. Default value is 25.} \item{method}{the method used to compute robustness weights at each iteration. Default value is \code{"L1"}, which uses the inverse of the absolute value of the residuals. Using \code{"symmetric"} will use Tukey's biweight with cut-off equal to six times the MAD of the residuals, equivalent to \code{\link[stats]{lowess}}.} \item{sdCriteria}{Convergence criteria, which the difference between the standard deviation of the residuals between two consecutive iteration steps. Default value is 2e-4.} \item{reps}{Small positive number added to residuals to avoid division by zero when calculating new weights for next iteration.} \item{tol}{Passed to \code{\link[stats]{smooth.spline}} (R >= 2.14.0).} \item{plotCurves}{If \code{\link[base:logical]{TRUE}}, the fitted splines are added to the current plot, otherwise not.} } \value{ Returns an object of class \code{smooth.spline}. } \examples{ data(cars) attach(cars) plot(speed, dist, main = "data(cars) & robust smoothing splines") # Fit a smoothing spline using L_2 norm cars.spl <- smooth.spline(speed, dist) lines(cars.spl, col = "blue") # Fit a smoothing spline using L_1 norm cars.rspl <- robustSmoothSpline(speed, dist) lines(cars.rspl, col = "red") # Fit a smoothing spline using L_2 norm with 10 degrees of freedom lines(smooth.spline(speed, dist, df=10), lty=2, col = "blue") # Fit a smoothing spline using L_1 norm with 10 degrees of freedom lines(robustSmoothSpline(speed, dist, df=10), lty=2, col = "red") legend(5,120, c( paste("smooth.spline [C.V.] => df =",round(cars.spl$df,1)), paste("robustSmoothSpline [C.V.] => df =",round(cars.rspl$df,1)), "standard with s( * , df = 10)", "robust with s( * , df = 10)" ), col = c("blue","red","blue","red"), lty = c(1,1,2,2), bg='bisque') } \seealso{ This implementation of this function was adopted from \code{\link[stats]{smooth.spline}} of the \pkg{stats} package. Because of this, this function is also licensed under GPL v2. } \author{Henrik Bengtsson} \keyword{smooth} \keyword{robust} aroma.light/man/Non-documented_objects.Rd0000644000175000017500000000221714136047216020251 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % 999.NonDocumentedObjects.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{Non-documented objects} \alias{Non-documented objects} \title{Non-documented objects} % Plot functions \alias{lines.XYCurveFit} % Matrix operations \alias{rowAverages} \alias{rowAverages.matrix} % Simple linear-algebra \alias{projectUontoV} \alias{scalarProduct} \alias{tr} % Miscellaneous statistical functions \alias{likelihood} \alias{predict.lowess} \description{ This page contains aliases for all "non-documented" objects that \code{R CMD check} detects in this package. Almost all of them are \emph{generic} functions that have specific document for the corresponding method coupled to a specific class. Other functions are re-defined by \code{setMethodS3()} to \emph{default} methods. Neither of these two classes are non-documented in reality. The rest are deprecated methods. } \keyword{documentation} \keyword{internal} aroma.light/man/findPeaksAndValleys.Rd0000644000175000017500000000514614136047216017554 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % findPeaksAndValleys.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{findPeaksAndValleys} \alias{findPeaksAndValleys} \alias{findPeaksAndValleys.density} \alias{findPeaksAndValleys.numeric} \title{Finds extreme points in the empirical density estimated from data} \description{ Finds extreme points in the empirical density estimated from data. } \usage{ \method{findPeaksAndValleys}{density}(x, tol=0, ...) \method{findPeaksAndValleys}{numeric}(x, ..., tol=0, na.rm=TRUE) } \arguments{ \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} containing data points or a \code{\link[stats]{density}} object.} \item{...}{Arguments passed to \code{\link[stats]{density}}. Ignored if \code{x} is a \code{\link[stats]{density}} object.} \item{tol}{A non-negative \code{\link[base]{numeric}} threshold specifying the minimum density at the extreme point in order to accept it.} \item{na.rm}{If \code{\link[base:logical]{TRUE}}, missing values are dropped, otherwise not.} } \value{ Returns a \code{\link[base]{data.frame}} (of class 'PeaksAndValleys') containing of "peaks" and "valleys" filtered by \code{tol}. } \examples{ layout(matrix(1:3, ncol=1)) par(mar=c(2,4,4,1)+0.1) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A unimodal distribution # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x1 <- rnorm(n=10000, mean=0, sd=1) x <- x1 fit <- findPeaksAndValleys(x) print(fit) plot(density(x), lwd=2, main="x1") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x2 <- rnorm(n=10000, mean=4, sd=1) x3 <- rnorm(n=10000, mean=8, sd=1) x <- c(x1,x2,x3) fit <- findPeaksAndValleys(x) print(fit) plot(density(x), lwd=2, main="c(x1,x2,x3)") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution with clear separation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x1b <- rnorm(n=10000, mean=0, sd=0.1) x2b <- rnorm(n=10000, mean=4, sd=0.1) x3b <- rnorm(n=10000, mean=8, sd=0.1) x <- c(x1b,x2b,x3b) # Illustrating explicit usage of density() d <- density(x) fit <- findPeaksAndValleys(d, tol=0) print(fit) plot(d, lwd=2, main="c(x1b,x2b,x3b)") abline(v=fit$x) } \author{Henrik Bengtsson} \seealso{ This function is used by \code{\link{callNaiveGenotypes}}(). } \keyword{methods} \keyword{internal} aroma.light/man/plotDensity.Rd0000644000175000017500000000373314136047216016203 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % plotDensity.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{plotDensity} \alias{plotDensity} \alias{plotDensity.list} \alias{plotDensity.data.frame} \alias{plotDensity.matrix} \alias{plotDensity.numeric} \alias{plotDensity.density} \title{Plots density distributions for a set of vectors} \description{ Plots density distributions for a set of vectors. } \usage{ \method{plotDensity}{data.frame}(X, ..., xlab=NULL) \method{plotDensity}{matrix}(X, ..., xlab=NULL) \method{plotDensity}{numeric}(X, ..., xlab=NULL) \method{plotDensity}{list}(X, W=NULL, xlim=NULL, ylim=NULL, xlab=NULL, ylab="density (integrates to one)", col=1:length(X), lty=NULL, lwd=NULL, ..., add=FALSE) } \arguments{ \item{X}{A single of \code{\link[base]{list}} of \code{\link[base]{numeric}} \code{\link[base]{vector}}s or \code{\link[stats]{density}} objects, a \code{\link[base]{numeric}} \code{\link[base]{matrix}}, or a \code{\link[base]{numeric}} \code{\link[base]{data.frame}}.} \item{W}{(optional) weights of similar data types and dimensions as \code{X}.} \item{xlim,ylim}{\code{\link[base]{character}} \code{\link[base]{vector}} of length 2. The x and y limits.} \item{xlab,ylab}{\code{\link[base]{character}} string for labels on x and y axis.} \item{col}{The color(s) of the curves.} \item{lty}{The types of curves.} \item{lwd}{The width of curves.} \item{...}{Additional arguments passed to \code{\link[stats]{density}}, \code{\link[graphics]{plot}}(), and \code{\link[graphics]{lines}}.} \item{add}{If \code{\link[base:logical]{TRUE}}, the curves are plotted in the current plot, otherwise a new is created.} } \seealso{ Internally, \code{\link[stats]{density}} is used to estimate the empirical density. } \author{Henrik Bengtsson} \keyword{methods} aroma.light/man/normalizeFragmentLength.Rd0000644000175000017500000002413214136047216020507 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeFragmentLength.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeFragmentLength} \alias{normalizeFragmentLength.default} \alias{normalizeFragmentLength} \title{Normalizes signals for PCR fragment-length effects} \description{ Normalizes signals for PCR fragment-length effects. Some or all signals are used to estimated the normalization function. All signals are normalized. } \usage{ \method{normalizeFragmentLength}{default}(y, fragmentLengths, targetFcns=NULL, subsetToFit=NULL, onMissing=c("ignore", "median"), .isLogged=TRUE, ..., .returnFit=FALSE) } \arguments{ \item{y}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length K of signals to be normalized across E enzymes.} \item{fragmentLengths}{An \code{\link[base]{integer}} KxE \code{\link[base]{matrix}} of fragment lengths.} \item{targetFcns}{An optional \code{\link[base]{list}} of E \code{\link[base]{function}}s; one per enzyme. If \code{\link[base]{NULL}}, the data is normalized to have constant fragment-length effects (all equal to zero on the log-scale).} \item{subsetToFit}{The subset of data points used to fit the normalization function. If \code{\link[base]{NULL}}, all data points are considered.} \item{onMissing}{Specifies how data points for which there is no fragment length is normalized. If \code{"ignore"}, the values are not modified. If \code{"median"}, the values are updated to have the same robust average as the other data points. } \item{.isLogged}{A \code{\link[base]{logical}}.} \item{...}{Additional arguments passed to \code{\link[stats]{lowess}}.} \item{.returnFit}{A \code{\link[base]{logical}}.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of the normalized signals. } \section{Multi-enzyme normalization}{ It is assumed that the fragment-length effects from multiple enzymes added (with equal weights) on the intensity scale. The fragment-length effects are fitted for each enzyme separately based on units that are exclusively for that enzyme. \emph{If there are no or very such units for an enzyme, the assumptions of the model are not met and the fit will fail with an error.} Then, from the above single-enzyme fits the average effect across enzymes is the calculated for each unit that is on multiple enzymes. } \section{Target functions}{ It is possible to specify custom target function effects for each enzyme via argument \code{targetFcns}. This argument has to be a \code{\link[base]{list}} containing one \code{\link[base]{function}} per enzyme and ordered in the same order as the enzyme are in the columns of argument \code{fragmentLengths}. For instance, if one wish to normalize the signals such that their mean signal as a function of fragment length effect is constantly equal to 2200 (or the intensity scale), the use \code{targetFcns=function(fl, ...) log2(2200)} which completely ignores fragment-length argument 'fl' and always returns a constant. If two enzymes are used, then use \code{targetFcns=rep(list(function(fl, ...) log2(2200)), 2)}. Note, if \code{targetFcns} is \code{\link[base]{NULL}}, this corresponds to \code{targetFcns=rep(list(function(fl, ...) 0), ncol(fragmentLengths))}. Alternatively, if one wants to only apply minimal corrections to the signals, then one can normalize toward target functions that correspond to the fragment-length effect of the average array. } \examples{ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Example 1: Single-enzyme fragment-length normalization of 6 arrays # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Number samples I <- 9 # Number of loci J <- 1000 # Fragment lengths fl <- seq(from=100, to=1000, length.out=J) # Simulate data points with unknown fragment lengths hasUnknownFL <- seq(from=1, to=J, by=50) fl[hasUnknownFL] <- NA # Simulate data y <- matrix(0, nrow=J, ncol=I) maxY <- 12 for (kk in 1:I) { k <- runif(n=1, min=3, max=5) mu <- function(fl) { mu <- rep(maxY, length(fl)) ok <- !is.na(fl) mu[ok] <- mu[ok] - fl[ok]^{1/k} mu } eps <- rnorm(J, mean=0, sd=1) y[,kk] <- mu(fl) + eps } # Normalize data (to a zero baseline) yN <- apply(y, MARGIN=2, FUN=function(y) { normalizeFragmentLength(y, fragmentLengths=fl, onMissing="median") }) # The correction factors rho <- y-yN print(summary(rho)) # The correction for units with unknown fragment lengths # equals the median correction factor of all other units print(summary(rho[hasUnknownFL,])) # Plot raw data layout(matrix(1:9, ncol=3)) xlim <- c(0,max(fl, na.rm=TRUE)) ylim <- c(0,max(y, na.rm=TRUE)) xlab <- "Fragment length" ylab <- expression(log2(theta)) for (kk in 1:I) { plot(fl, y[,kk], xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab) ok <- (is.finite(fl) & is.finite(y[,kk])) lines(lowess(fl[ok], y[ok,kk]), col="red", lwd=2) } # Plot normalized data layout(matrix(1:9, ncol=3)) ylim <- c(-1,1)*max(y, na.rm=TRUE)/2 for (kk in 1:I) { plot(fl, yN[,kk], xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab) ok <- (is.finite(fl) & is.finite(y[,kk])) lines(lowess(fl[ok], yN[ok,kk]), col="blue", lwd=2) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Example 2: Two-enzyme fragment-length normalization of 6 arrays # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(0xbeef) # Number samples I <- 5 # Number of loci J <- 3000 # Fragment lengths (two enzymes) fl <- matrix(0, nrow=J, ncol=2) fl[,1] <- seq(from=100, to=1000, length.out=J) fl[,2] <- seq(from=1000, to=100, length.out=J) # Let 1/2 of the units be on both enzymes fl[seq(from=1, to=J, by=4),1] <- NA fl[seq(from=2, to=J, by=4),2] <- NA # Let some have unknown fragment lengths hasUnknownFL <- seq(from=1, to=J, by=15) fl[hasUnknownFL,] <- NA # Sty/Nsp mixing proportions: rho <- rep(1, I) rho[1] <- 1/3; # Less Sty in 1st sample rho[3] <- 3/2; # More Sty in 3rd sample # Simulate data z <- array(0, dim=c(J,2,I)) maxLog2Theta <- 12 for (ii in 1:I) { # Common effect for both enzymes mu <- function(fl) { k <- runif(n=1, min=3, max=5) mu <- rep(maxLog2Theta, length(fl)) ok <- is.finite(fl) mu[ok] <- mu[ok] - fl[ok]^{1/k} mu } # Calculate the effect for each data point for (ee in 1:2) { z[,ee,ii] <- mu(fl[,ee]) } # Update the Sty/Nsp mixing proportions ee <- 2 z[,ee,ii] <- rho[ii]*z[,ee,ii] # Add random errors for (ee in 1:2) { eps <- rnorm(J, mean=0, sd=1/sqrt(2)) z[,ee,ii] <- z[,ee,ii] + eps } } hasFl <- is.finite(fl) unitSets <- list( nsp = which( hasFl[,1] & !hasFl[,2]), sty = which(!hasFl[,1] & hasFl[,2]), both = which( hasFl[,1] & hasFl[,2]), none = which(!hasFl[,1] & !hasFl[,2]) ) # The observed data is a mix of two enzymes theta <- matrix(NA_real_, nrow=J, ncol=I) # Single-enzyme units for (ee in 1:2) { uu <- unitSets[[ee]] theta[uu,] <- 2^z[uu,ee,] } # Both-enzyme units (sum on intensity scale) uu <- unitSets$both theta[uu,] <- (2^z[uu,1,]+2^z[uu,2,])/2 # Missing units (sample from the others) uu <- unitSets$none theta[uu,] <- apply(theta, MARGIN=2, sample, size=length(uu)) # Calculate target array thetaT <- rowMeans(theta, na.rm=TRUE) targetFcns <- list() for (ee in 1:2) { uu <- unitSets[[ee]] fit <- lowess(fl[uu,ee], log2(thetaT[uu])) class(fit) <- "lowess" targetFcns[[ee]] <- function(fl, ...) { predict(fit, newdata=fl) } } # Fit model only to a subset of the data subsetToFit <- setdiff(1:J, seq(from=1, to=J, by=10)) # Normalize data (to a target baseline) thetaN <- matrix(NA_real_, nrow=J, ncol=I) fits <- vector("list", I) for (ii in 1:I) { lthetaNi <- normalizeFragmentLength(log2(theta[,ii]), targetFcns=targetFcns, fragmentLengths=fl, onMissing="median", subsetToFit=subsetToFit, .returnFit=TRUE) fits[[ii]] <- attr(lthetaNi, "modelFit") thetaN[,ii] <- 2^lthetaNi } # Plot raw data xlim <- c(0, max(fl, na.rm=TRUE)) ylim <- c(0, max(log2(theta), na.rm=TRUE)) Mlim <- c(-1,1)*4 xlab <- "Fragment length" ylab <- expression(log2(theta)) Mlab <- expression(M==log[2](theta/theta[R])) layout(matrix(1:(3*I), ncol=I, byrow=TRUE)) for (ii in 1:I) { plot(NA, xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab, main="raw") # Single-enzyme units for (ee in 1:2) { # The raw data uu <- unitSets[[ee]] points(fl[uu,ee], log2(theta[uu,ii]), col=ee+1) } # Both-enzyme units (use fragment-length for enzyme #1) uu <- unitSets$both points(fl[uu,1], log2(theta[uu,ii]), col=3+1) for (ee in 1:2) { # The true effects uu <- unitSets[[ee]] lines(lowess(fl[uu,ee], log2(theta[uu,ii])), col="black", lwd=4, lty=3) # The estimated effects fit <- fits[[ii]][[ee]]$fit lines(fit, col="orange", lwd=3) muT <- targetFcns[[ee]](fl[uu,ee]) lines(fl[uu,ee], muT, col="cyan", lwd=1) } } # Calculate log-ratios thetaR <- rowMeans(thetaN, na.rm=TRUE) M <- log2(thetaN/thetaR) # Plot normalized data for (ii in 1:I) { plot(NA, xlim=xlim, ylim=Mlim, xlab=xlab, ylab=Mlab, main="normalized") # Single-enzyme units for (ee in 1:2) { # The normalized data uu <- unitSets[[ee]] points(fl[uu,ee], M[uu,ii], col=ee+1) } # Both-enzyme units (use fragment-length for enzyme #1) uu <- unitSets$both points(fl[uu,1], M[uu,ii], col=3+1) } ylim <- c(0,1.5) for (ii in 1:I) { data <- list() for (ee in 1:2) { # The normalized data uu <- unitSets[[ee]] data[[ee]] <- M[uu,ii] } uu <- unitSets$both if (length(uu) > 0) data[[3]] <- M[uu,ii] uu <- unitSets$none if (length(uu) > 0) data[[4]] <- M[uu,ii] cols <- seq_along(data)+1 plotDensity(data, col=cols, xlim=Mlim, xlab=Mlab, main="normalized") abline(v=0, lty=2) } } \author{Henrik Bengtsson} \references{ [1] H. Bengtsson, R. Irizarry, B. Carvalho, and T. Speed, \emph{Estimation and assessment of raw copy numbers at the single locus level}, Bioinformatics, 2008. \cr } \keyword{nonparametric} \keyword{robust} aroma.light/man/normalizeDifferencesToAverage.Rd0000644000175000017500000000423714136047216021621 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeDifferencesToAverage.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeDifferencesToAverage} \alias{normalizeDifferencesToAverage} \alias{normalizeDifferencesToAverage.list} \title{Rescales channel vectors to get the same average} \description{ Rescales channel vectors to get the same average. } \usage{ \method{normalizeDifferencesToAverage}{list}(x, baseline=1, FUN=median, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} \code{\link[base]{list}} of length K.} \item{baseline}{An \code{\link[base]{integer}} in [1,K] specifying which channel should be the baseline. The baseline channel will be almost unchanged. If \code{\link[base]{NULL}}, the channels will be shifted towards median of them all.} \item{FUN}{A \code{\link[base]{function}} for calculating the average of one channel.} \item{...}{Additional arguments passed to the \code{avg} \code{\link[base]{function}}.} } \value{ Returns a normalized \code{\link[base]{list}} of length K. } \examples{ # Simulate three shifted tracks of different lengths with same profiles ns <- c(A=2, B=1, C=0.25)*1000 xx <- lapply(ns, FUN=function(n) { seq(from=1, to=max(ns), length.out=n) }) zz <- mapply(seq_along(ns), ns, FUN=function(z,n) rep(z,n)) yy <- list( A = rnorm(ns["A"], mean=0, sd=0.5), B = rnorm(ns["B"], mean=5, sd=0.4), C = rnorm(ns["C"], mean=-5, sd=1.1) ) yy <- lapply(yy, FUN=function(y) { n <- length(y) y[1:(n/2)] <- y[1:(n/2)] + 2 y[1:(n/4)] <- y[1:(n/4)] - 4 y }) # Shift all tracks toward the first track yyN <- normalizeDifferencesToAverage(yy, baseline=1) # The baseline channel is not changed stopifnot(identical(yy[[1]], yyN[[1]])) # Get the estimated parameters fit <- attr(yyN, "fit") # Plot the tracks layout(matrix(1:2, ncol=1)) x <- unlist(xx) col <- unlist(zz) y <- unlist(yy) yN <- unlist(yyN) plot(x, y, col=col, ylim=c(-10,10)) plot(x, yN, col=col, ylim=c(-10,10)) } \author{Henrik Bengtsson} \keyword{methods} aroma.light/man/aroma.light-package.Rd0000644000175000017500000001300314136047216017452 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % 999.package.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{aroma.light-package} \alias{aroma.light-package} \alias{aroma.light} \docType{package} \title{Package aroma.light} \encoding{latin1} \description{ Methods for microarray analysis that take basic data types such as matrices and lists of vectors. These methods can be used standalone, be utilized in other packages, or be wrapped up in higher-level classes. } \section{Installation}{ To install this package, see \url{https://bioconductor.org/packages/release/bioc/html/aroma.light.html}. } \section{To get started}{ For scanner calibration: \enumerate{ \item see \code{\link{calibrateMultiscan}}() - scan the same array two or more times to calibrate for scanner effects and extended dynamical range. } To normalize multiple single-channel arrays all with the same number of probes/spots: \enumerate{ \item \code{\link{normalizeAffine}}() - normalizes, on the intensity scale, for differences in offset and scale between channels. \item \code{\link{normalizeQuantileRank}}(), \code{\link{normalizeQuantileSpline}}() - normalizes, on the intensity scale, for differences in empirical distribution between channels. } To normalize multiple single-channel arrays with varying number probes/spots: \enumerate{ \item \code{\link{normalizeQuantileRank}}(), \code{\link{normalizeQuantileSpline}}() - normalizes, on the intensity scale, for differences in empirical distribution between channels. } To normalize two-channel arrays: \enumerate{ \item \code{\link{normalizeAffine}}() - normalizes, on the intensity scale, for differences in offset and scale between channels. This will also correct for intensity-dependent affects on the log scale. \item \code{\link{normalizeCurveFit}}() - Classical intensity-dependent normalization, on the log scale, e.g. lowess normalization. } To normalize three or more channels: \enumerate{ \item \code{\link{normalizeAffine}}() - normalizes, on the intensity scale, for differences in offset and scale between channels. This will minimize the curvature on the log scale between any two channels. } } \section{Further readings}{ Several of the normalization methods proposed in [1]-[7] are available in this package. } \section{How to cite this package}{ Whenever using this package, please cite one or more of [1]-[7]. } \section{Wishlist}{ Here is a list of features that would be useful, but which I have too little time to add myself. Contributions are appreciated. \itemize{ \item At the moment, nothing. } If you consider to contribute, make sure it is not already implemented by downloading the latest "devel" version! } \author{Henrik Bengtsson, Pierre Neuvial, Aaron Lun} \section{License}{ The releases of this package is licensed under GPL version 2 or newer. NB: Except for the \code{robustSmoothSpline()} method, it is alright to distribute the rest of the package under LGPL version 2.1 or newer. The development code of the packages is under a private licence (where applicable) and patches sent to the author fall under the latter license, but will be, if incorporated, released under the "release" license above. } \references{ Some of the reference below can be found at \url{https://www.aroma-project.org/publications/}.\cr [1] H. Bengtsson, \emph{Identification and normalization of plate effects in cDNA microarray data}, Preprints in Mathematical Sciences, 2002:28, Mathematical Statistics, Centre for Mathematical Sciences, Lund University, 2002.\cr [2] H. Bengtsson, \emph{The R.oo package - Object-Oriented Programming with References Using Standard R Code}, In Kurt Hornik, Friedrich Leisch and Achim Zeileis, editors, Proceedings of the 3rd International Workshop on Distributed Statistical Computing (DSC 2003), March 20-22, Vienna, Austria. \url{http://www.ci.tuwien.ac.at/Conferences/DSC-2003/Proceedings/} \cr [3] H. Bengtsson, \emph{aroma - An R Object-oriented Microarray Analysis environment}, Preprints in Mathematical Sciences (manuscript in preparation), Mathematical Statistics, Centre for Mathematical Sciences, Lund University, 2004.\cr [4] H. Bengtsson, J. Vallon-Christersson and G. \enc{Jnsson}{Jonsson}, \emph{Calibration and assessment of channel-specific biases in microarray data with extended dynamical range}, BMC Bioinformatics, 5:177, 2004. \cr [5] Henrik Bengtsson and Ola \enc{Hssjer}{Hossjer}, \emph{Methodological Study of Affine Transformations of Gene Expression Data}, Methodological study of affine transformations of gene expression data with proposed robust non-parametric multi-dimensional normalization method, BMC Bioinformatics, 2006, 7:100. \cr [6] H. Bengtsson, R. Irizarry, B. Carvalho, and T. Speed, \emph{Estimation and assessment of raw copy numbers at the single locus level}, Bioinformatics, 2008. \cr [7] H. Bengtsson, A. Ray, P. Spellman and T.P. Speed, \emph{A single-sample method for normalizing and combining full-resolutioncopy numbers from multiple platforms, labs and analysis methods}, Bioinformatics, 2009. \cr [8] H. Bengtsson, P. Neuvial and T.P. Speed, \emph{TumorBoost: Normalization of allele-specific tumor copy numbers from a single pair of tumor-normal genotyping microarrays}, BMC Bioinformatics, 2010, 11:245. [PMID 20462408] \cr } \keyword{package} aroma.light/man/normalizeCurveFit.Rd0000644000175000017500000002166514136047216017341 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeCurveFit.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeCurveFit} \alias{normalizeCurveFit} \alias{normalizeLoess} \alias{normalizeLowess} \alias{normalizeSpline} \alias{normalizeRobustSpline} \alias{normalizeCurveFit.matrix} \alias{normalizeLoess.matrix} \alias{normalizeLowess.matrix} \alias{normalizeSpline.matrix} \alias{normalizeRobustSpline.matrix} \encoding{latin1} \title{Weighted curve-fit normalization between a pair of channels} \description{ Weighted curve-fit normalization between a pair of channels. This method will estimate a smooth function of the dependency between the log-ratios and the log-intensity of the two channels and then correct the log-ratios (only) in order to remove the dependency. This is method is also known as \emph{intensity-dependent} or \emph{lowess normalization}. The curve-fit methods are by nature limited to paired-channel data. There exist at least one method trying to overcome this limitation, namely the cyclic-lowess [1], which applies the paired curve-fit method iteratively over all pairs of channels/arrays. Cyclic-lowess is not implemented here. We recommend that affine normalization [2] is used instead of curve-fit normalization. } \usage{ \method{normalizeCurveFit}{matrix}(X, weights=NULL, typeOfWeights=c("datapoint"), method=c("loess", "lowess", "spline", "robustSpline"), bandwidth=NULL, satSignal=2^16 - 1, ...) \method{normalizeLoess}{matrix}(X, ...) \method{normalizeLowess}{matrix}(X, ...) \method{normalizeSpline}{matrix}(X, ...) \method{normalizeRobustSpline}{matrix}(X, ...) } \arguments{ \item{X}{An Nx2 \code{\link[base]{matrix}} where the columns represent the two channels to be normalized.} \item{weights}{If \code{\link[base]{NULL}}, non-weighted normalization is done. If data-point weights are used, this should be a \code{\link[base]{vector}} of length N of data point weights used when estimating the normalization function. } \item{typeOfWeights}{A \code{\link[base]{character}} string specifying the type of weights given in argument \code{weights}. } \item{method}{\code{\link[base]{character}} string specifying which method to use when fitting the intensity-dependent function. Supported methods: \code{"loess"} (better than lowess), \code{"lowess"} (classic; supports only zero-one weights), \code{"spline"} (more robust than lowess at lower and upper intensities; supports only zero-one weights), \code{"robustSpline"} (better than spline). } \item{bandwidth}{A \code{\link[base]{double}} value specifying the bandwidth of the estimator used. } \item{satSignal}{Signals equal to or above this threshold will not be used in the fitting. } \item{...}{Not used.} } \value{ A Nx2 \code{\link[base]{matrix}} of the normalized two channels. The fitted model is returned as attribute \code{modelFit}. } \details{ A smooth function \eqn{c(A)} is fitted through data in \eqn{(A,M)}, where \eqn{M=log_2(y_2/y_1)} and \eqn{A=1/2*log_2(y_2*y_1)}. Data is normalized by \eqn{M <- M - c(A)}. Loess is by far the slowest method of the four, then lowess, and then robust spline, which iteratively calls the spline method. } \section{Negative, non-positive, and saturated values}{ Non-positive values are set to not-a-number (\code{\link[base:is.finite]{NaN}}). Data points that are saturated in one or more channels are not used to estimate the normalization function, but they are normalized. } \section{Missing values}{ The estimation of the normalization function will only be made based on complete non-saturated observations, i.e. observations that contains no \code{\link[base]{NA}} values nor saturated values as defined by \code{satSignal}. } \section{Weighted normalization}{ Each data point, that is, each row in \code{X}, which is a vector of length 2, can be assigned a weight in [0,1] specifying how much it should \emph{affect the fitting of the normalization function}. Weights are given by argument \code{weights}, which should be a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N. Regardless of weights, all data points are \emph{normalized} based on the fitted normalization function. Note that the lowess and the spline method only support zero-one \{0,1\} weights. For such methods, all weights that are less than a half are set to zero. } \section{Details on loess}{ For \code{\link[stats]{loess}}, the arguments \code{family="symmetric"}, \code{degree=1}, \code{span=3/4}, \code{control=loess.control(trace.hat="approximate"}, \code{iterations=5}, \code{surface="direct")} are used. } \author{Henrik Bengtsson} \references{ [1] M. \enc{strand}{Astrand}, Contrast Normalization of Oligonucleotide Arrays, Journal Computational Biology, 2003, 10, 95-102. \cr [2] Henrik Bengtsson and Ola \enc{Hssjer}{Hossjer}, \emph{Methodological Study of Affine Transformations of Gene Expression Data}, Methodological study of affine transformations of gene expression data with proposed robust non-parametric multi-dimensional normalization method, BMC Bioinformatics, 2006, 7:100. \cr } \examples{ pathname <- system.file("data-ex", "PMT-RGData.dat", package="aroma.light") rg <- read.table(pathname, header=TRUE, sep="\t") nbrOfScans <- max(rg$slide) rg <- as.list(rg) for (field in c("R", "G")) rg[[field]] <- matrix(as.double(rg[[field]]), ncol=nbrOfScans) rg$slide <- rg$spot <- NULL rg <- as.matrix(as.data.frame(rg)) colnames(rg) <- rep(c("R", "G"), each=nbrOfScans) layout(matrix(c(1,2,0,3,4,0,5,6,7), ncol=3, byrow=TRUE)) rgC <- rg for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) channelColor <- switch(channel, R="red", G="green") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The raw data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plotMvsAPairs(rg[,sidx]) title(main=paste("Observed", channel)) box(col=channelColor) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The calibrated data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgC[,sidx] <- calibrateMultiscan(rg[,sidx], average=NULL) plotMvsAPairs(rgC[,sidx]) title(main=paste("Calibrated", channel)) box(col=channelColor) } # for (channel ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The average calibrated data # # Note how the red signals are weaker than the green. The reason # for this can be that the scale factor in the green channel is # greater than in the red channel, but it can also be that there # is a remaining relative difference in bias between the green # and the red channel, a bias that precedes the scanning. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgCA <- rg for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) rgCA[,sidx] <- calibrateMultiscan(rg[,sidx]) } rgCAavg <- matrix(NA_real_, nrow=nrow(rgCA), ncol=2) colnames(rgCAavg) <- c("R", "G") for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) rgCAavg[,channel] <- apply(rgCA[,sidx], MARGIN=1, FUN=median, na.rm=TRUE) } # Add some "fake" outliers outliers <- 1:600 rgCAavg[outliers,"G"] <- 50000 plotMvsA(rgCAavg) title(main="Average calibrated (AC)") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Normalize data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Weight-down outliers when normalizing weights <- rep(1, nrow(rgCAavg)) weights[outliers] <- 0.001 # Affine normalization of channels rgCANa <- normalizeAffine(rgCAavg, weights=weights) # It is always ok to rescale the affine normalized data if its # done on (R,G); not on (A,M)! However, this is only needed for # esthetic purposes. rgCANa <- rgCANa *2^1.4 plotMvsA(rgCANa) title(main="Normalized AC") # Curve-fit (lowess) normalization rgCANlw <- normalizeLowess(rgCAavg, weights=weights) plotMvsA(rgCANlw, col="orange", add=TRUE) # Curve-fit (loess) normalization rgCANl <- normalizeLoess(rgCAavg, weights=weights) plotMvsA(rgCANl, col="red", add=TRUE) # Curve-fit (robust spline) normalization rgCANrs <- normalizeRobustSpline(rgCAavg, weights=weights) plotMvsA(rgCANrs, col="blue", add=TRUE) legend(x=0,y=16, legend=c("affine", "lowess", "loess", "r. spline"), pch=19, col=c("black", "orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n") plotMvsMPairs(cbind(rgCANa, rgCANlw), col="orange", xlab=expression(M[affine])) title(main="Normalized AC") plotMvsMPairs(cbind(rgCANa, rgCANl), col="red", add=TRUE) plotMvsMPairs(cbind(rgCANa, rgCANrs), col="blue", add=TRUE) abline(a=0, b=1, lty=2) legend(x=-6,y=6, legend=c("lowess", "loess", "r. spline"), pch=19, col=c("orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n") } \seealso{ \code{\link{normalizeAffine}}(). } \keyword{methods} aroma.light/man/fitPrincipalCurve.Rd0000644000175000017500000000740714136047216017320 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % fitPrincipalCurve.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{fitPrincipalCurve} \alias{fitPrincipalCurve} \alias{fitPrincipalCurve.matrix} \title{Fit a principal curve in K dimensions} \description{ Fit a principal curve in K dimensions. } \usage{ \method{fitPrincipalCurve}{matrix}(X, ..., verbose=FALSE) } \arguments{ \item{X}{An NxK \code{\link[base]{matrix}} (K>=2) where the columns represent the dimension.} \item{...}{Other arguments passed to \code{\link[princurve]{principal_curve}}.} \item{verbose}{A \code{\link[base]{logical}} or a \code{\link[R.utils]{Verbose}} object.} } \value{ Returns a principal_curve object (which is a \code{\link[base]{list}}). See \code{\link[princurve]{principal_curve}} for more details. } \section{Missing values}{ The estimation of the normalization function will only be made based on complete observations, i.e. observations that contains no \code{\link[base]{NA}} values in any of the channels. } \author{Henrik Bengtsson} \references{ [1] Hastie, T. and Stuetzle, W, \emph{Principal Curves}, JASA, 1989.\cr [2] H. Bengtsson, A. Ray, P. Spellman and T.P. Speed, \emph{A single-sample method for normalizing and combining full-resolutioncopy numbers from multiple platforms, labs and analysis methods}, Bioinformatics, 2009. \cr } \examples{ # Simulate data from the model y <- a + bx + x^c + eps(bx) J <- 1000 x <- rexp(J) a <- c(2,15,3) b <- c(2,3,4) c <- c(1,2,1/2) bx <- outer(b,x) xc <- t(sapply(c, FUN=function(c) x^c)) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(b), mean=0, sd=0.1*x)) y <- a + bx + xc + eps y <- t(y) # Fit principal curve through (y_1, y_2, y_3) fit <- fitPrincipalCurve(y, verbose=TRUE) # Flip direction of 'lambda'? rho <- cor(fit$lambda, y[,1], use="complete.obs") flip <- (rho < 0) if (flip) { fit$lambda <- max(fit$lambda, na.rm=TRUE)-fit$lambda } # Backtransform (y_1, y_2, y_3) to be proportional to each other yN <- backtransformPrincipalCurve(y, fit=fit) # Same backtransformation dimension by dimension yN2 <- y for (cc in 1:ncol(y)) { yN2[,cc] <- backtransformPrincipalCurve(y, fit=fit, dimensions=cc) } stopifnot(identical(yN2, yN)) xlim <- c(0, 1.04*max(x)) ylim <- range(c(y,yN), na.rm=TRUE) # Pairwise signals vs x before and after transform layout(matrix(1:4, nrow=2, byrow=TRUE)) par(mar=c(4,4,3,2)+0.1) for (cc in 1:3) { ylab <- substitute(y[c], env=list(c=cc)) plot(NA, xlim=xlim, ylim=ylim, xlab="x", ylab=ylab) abline(h=a[cc], lty=3) mtext(side=4, at=a[cc], sprintf("a=\%g", a[cc]), cex=0.8, las=2, line=0, adj=1.1, padj=-0.2) points(x, y[,cc]) points(x, yN[,cc], col="tomato") legend("topleft", col=c("black", "tomato"), pch=19, c("orignal", "transformed"), bty="n") } title(main="Pairwise signals vs x before and after transform", outer=TRUE, line=-2) # Pairwise signals before and after transform layout(matrix(1:4, nrow=2, byrow=TRUE)) par(mar=c(4,4,3,2)+0.1) for (rr in 3:2) { ylab <- substitute(y[c], env=list(c=rr)) for (cc in 1:2) { if (cc == rr) { plot.new() next } xlab <- substitute(y[c], env=list(c=cc)) plot(NA, xlim=ylim, ylim=ylim, xlab=xlab, ylab=ylab) abline(a=0, b=1, lty=2) points(y[,c(cc,rr)]) points(yN[,c(cc,rr)], col="tomato") legend("topleft", col=c("black", "tomato"), pch=19, c("orignal", "transformed"), bty="n") } } title(main="Pairwise signals before and after transform", outer=TRUE, line=-2) } \seealso{ \code{\link{backtransformPrincipalCurve}}(). \code{\link[princurve]{principal_curve}}. } \keyword{methods} aroma.light/man/distanceBetweenLines.Rd0000644000175000017500000001074214136047216017762 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % distanceBetweenLines.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{distanceBetweenLines} \alias{distanceBetweenLines.default} \alias{distanceBetweenLines} \title{Finds the shortest distance between two lines} \description{ Finds the shortest distance between two lines. Consider the two lines \eqn{x(s) = a_x + b_x*s} and \eqn{y(t) = a_y + b_y*t} in an K-space where the offset and direction \code{\link[base]{vector}}s are \eqn{a_x} and \eqn{b_x} (in \eqn{R^K}) that define the line \eqn{x(s)} (\eqn{s} is a scalar). Similar for the line \eqn{y(t)}. This function finds the point \eqn{(s,t)} for which \eqn{|x(s)-x(t)|} is minimal. } \usage{ \method{distanceBetweenLines}{default}(ax, bx, ay, by, ...) } \arguments{ \item{ax,bx}{Offset and direction \code{\link[base]{vector}} of length K for line \eqn{z_x}.} \item{ay,by}{Offset and direction \code{\link[base]{vector}} of length K for line \eqn{z_y}.} \item{...}{Not used.} } \value{ Returns the a \code{\link[base]{list}} containing \item{ax,bx}{The given line \eqn{x(s)}.} \item{ay,by}{The given line \eqn{y(t)}.} \item{s,t}{The values of \eqn{s} and \eqn{t} such that \eqn{|x(s)-y(t)|} is minimal.} \item{xs,yt}{The values of \eqn{x(s)} and \eqn{y(t)} at the optimal point \eqn{(s,t)}.} \item{distance}{The distance between the lines, i.e. \eqn{|x(s)-y(t)|} at the optimal point \eqn{(s,t)}.} } \author{Henrik Bengtsson} \examples{ for (zzz in 0) { # This example requires plot3d() in R.basic [http://www.braju.com/R/] if (!require(pkgName <- "R.basic", character.only=TRUE)) break layout(matrix(1:4, nrow=2, ncol=2, byrow=TRUE)) ############################################################ # Lines in two-dimensions ############################################################ x <- list(a=c(1,0), b=c(1,2)) y <- list(a=c(0,2), b=c(1,1)) fit <- distanceBetweenLines(ax=x$a, bx=x$b, ay=y$a, by=y$b) xlim <- ylim <- c(-1,8) plot(NA, xlab="", ylab="", xlim=ylim, ylim=ylim) # Highlight the offset coordinates for both lines points(t(x$a), pch="+", col="red") text(t(x$a), label=expression(a[x]), adj=c(-1,0.5)) points(t(y$a), pch="+", col="blue") text(t(y$a), label=expression(a[y]), adj=c(-1,0.5)) v <- c(-1,1)*10; xv <- list(x=x$a[1]+x$b[1]*v, y=x$a[2]+x$b[2]*v) yv <- list(x=y$a[1]+y$b[1]*v, y=y$a[2]+y$b[2]*v) lines(xv, col="red") lines(yv, col="blue") points(t(fit$xs), cex=2.0, col="red") text(t(fit$xs), label=expression(x(s)), adj=c(+2,0.5)) points(t(fit$yt), cex=1.5, col="blue") text(t(fit$yt), label=expression(y(t)), adj=c(-1,0.5)) print(fit) ############################################################ # Lines in three-dimensions ############################################################ x <- list(a=c(0,0,0), b=c(1,1,1)) # The 'diagonal' y <- list(a=c(2,1,2), b=c(2,1,3)) # A 'fitted' line fit <- distanceBetweenLines(ax=x$a, bx=x$b, ay=y$a, by=y$b) xlim <- ylim <- zlim <- c(-1,3) dummy <- t(c(1,1,1))*100; # Coordinates for the lines in 3d v <- seq(-10,10, by=1); xv <- list(x=x$a[1]+x$b[1]*v, y=x$a[2]+x$b[2]*v, z=x$a[3]+x$b[3]*v) yv <- list(x=y$a[1]+y$b[1]*v, y=y$a[2]+y$b[2]*v, z=y$a[3]+y$b[3]*v) for (theta in seq(30,140,length.out=3)) { plot3d(dummy, theta=theta, phi=30, xlab="", ylab="", zlab="", xlim=ylim, ylim=ylim, zlim=zlim) # Highlight the offset coordinates for both lines points3d(t(x$a), pch="+", col="red") text3d(t(x$a), label=expression(a[x]), adj=c(-1,0.5)) points3d(t(y$a), pch="+", col="blue") text3d(t(y$a), label=expression(a[y]), adj=c(-1,0.5)) # Draw the lines lines3d(xv, col="red") lines3d(yv, col="blue") # Draw the two points that are closest to each other points3d(t(fit$xs), cex=2.0, col="red") text3d(t(fit$xs), label=expression(x(s)), adj=c(+2,0.5)) points3d(t(fit$yt), cex=1.5, col="blue") text3d(t(fit$yt), label=expression(y(t)), adj=c(-1,0.5)) # Draw the distance between the two points lines3d(rbind(fit$xs,fit$yt), col="purple", lwd=2) } print(fit) } # for (zzz in 0) rm(zzz) } \references{ [1] M. Bard and D. Himel, \emph{The Minimum Distance Between Two Lines in n-Space}, September 2001, Advisor Dennis Merino.\cr [2] Dan Sunday, \emph{Distance between 3D Lines and Segments}, Jan 2016, \url{https://www.geomalgorithms.com/algorithms.html}.\cr } \keyword{algebra} aroma.light/man/fitNaiveGenotypes.Rd0000644000175000017500000000441714136047216017330 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % fitNaiveGenotypes.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{fitNaiveGenotypes} \alias{fitNaiveGenotypes} \alias{fitNaiveGenotypes.numeric} \title{Fit naive genotype model from a normal sample} \description{ Fit naive genotype model from a normal sample. } \usage{ \method{fitNaiveGenotypes}{numeric}(y, cn=rep(2L, times = length(y)), subsetToFit=NULL, flavor=c("density", "fixed"), adjust=1.5, ..., censorAt=c(-0.1, 1.1), verbose=FALSE) } \arguments{ \item{y}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length J containing allele B fractions for a normal sample.} \item{cn}{An optional \code{\link[base]{numeric}} \code{\link[base]{vector}} of length J specifying the true total copy number in \eqn{\{0,1,2,NA\}} at each locus. This can be used to specify which loci are diploid and which are not, e.g. autosomal and sex chromosome copy numbers.} \item{subsetToFit}{An optional \code{\link[base]{integer}} or \code{\link[base]{logical}} \code{\link[base]{vector}} specifying which loci should be used for estimating the model. If \code{\link[base]{NULL}}, all loci are used.} \item{flavor}{A \code{\link[base]{character}} string specifying the type of algorithm used.} \item{adjust}{A positive \code{\link[base]{double}} specifying the amount smoothing for the empirical density estimator.} \item{...}{Additional arguments passed to \code{\link{findPeaksAndValleys}}().} \item{censorAt}{A \code{\link[base]{double}} \code{\link[base]{vector}} of length two specifying the range for which values are considered finite. Values below (above) this range are treated as -\code{\link[base:is.finite]{Inf}} (+\code{\link[base:is.finite]{Inf}}).} \item{verbose}{A \code{\link[base]{logical}} or a \code{\link[R.utils]{Verbose}} object.} } \value{ Returns a \code{\link[base]{list}} of \code{\link[base]{list}}s. } \author{Henrik Bengtsson} \seealso{ To call genotypes see \code{\link{callNaiveGenotypes}}(). Internally \code{\link{findPeaksAndValleys}}() is used to identify the thresholds. } \keyword{methods} aroma.light/man/plotMvsA.Rd0000644000175000017500000000246114136047216015427 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % plotMvsA.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{plotMvsA} \alias{plotMvsA} \alias{plotMvsA.matrix} \title{Plot log-ratios vs log-intensities} \description{ Plot log-ratios vs log-intensities. } \usage{ \method{plotMvsA}{matrix}(X, Alab="A", Mlab="M", Alim=c(0, 16), Mlim=c(-1, 1) * diff(Alim) * aspectRatio, aspectRatio=1, pch=".", ..., add=FALSE) } \arguments{ \item{X}{Nx2 \code{\link[base]{matrix}} with two channels and N observations.} \item{Alab,Mlab}{Labels on the x and y axes.} \item{Alim,Mlim}{Plot range on the A and M axes.} \item{aspectRatio}{Aspect ratio between \code{Mlim} and \code{Alim}.} \item{pch}{Plot symbol used.} \item{...}{Additional arguments accepted by \code{\link[graphics]{points}}.} \item{add}{If \code{\link[base:logical]{TRUE}}, data points are plotted in the current plot, otherwise a new plot is created.} } \details{ Red channel is assumed to be in column one and green in column two. Log-ratio are calculated taking channel one over channel two. } \value{ Returns nothing. } \author{Henrik Bengtsson} \keyword{methods} aroma.light/man/normalizeQuantileSpline.Rd0000644000175000017500000001047714136047216020546 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeQuantileSpline.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeQuantileSpline} \alias{normalizeQuantileSpline} \alias{normalizeQuantileSpline.numeric} \alias{normalizeQuantileSpline.matrix} \alias{normalizeQuantileSpline.list} \title{Normalizes the empirical distribution of one or more samples to a target distribution} \usage{ \method{normalizeQuantileSpline}{numeric}(x, w=NULL, xTarget, sortTarget=TRUE, robust=TRUE, ...) \method{normalizeQuantileSpline}{matrix}(X, w=NULL, xTarget=NULL, sortTarget=TRUE, robust=TRUE, ...) \method{normalizeQuantileSpline}{list}(X, w=NULL, xTarget=NULL, sortTarget=TRUE, robust=TRUE, ...) } \description{ Normalizes the empirical distribution of one or more samples to a target distribution. After normalization, all samples have the same average empirical density distribution. } \arguments{ \item{x, X}{A single (\eqn{K=1}) \code{\link[base]{numeric}} \code{\link[base]{vector}} of length \eqn{N}, a \code{\link[base]{numeric}} \eqn{NxK} \code{\link[base]{matrix}}, or a \code{\link[base]{list}} of length \eqn{K} with \code{\link[base]{numeric}} \code{\link[base]{vector}}s, where \eqn{K} represents the number of samples and \eqn{N} the number of data points.} \item{w}{An optional \code{\link[base]{numeric}} \code{\link[base]{vector}} of length \eqn{N} of weights specific to each data point.} \item{xTarget}{The target empirical distribution as a \emph{sorted} \code{\link[base]{numeric}} \code{\link[base]{vector}} of length \eqn{M}. If \code{\link[base]{NULL}} and \code{X} is a \code{\link[base]{list}}, then the target distribution is calculated as the average empirical distribution of the samples.} \item{sortTarget}{If \code{\link[base:logical]{TRUE}}, argument \code{xTarget} will be sorted, otherwise it is assumed to be already sorted.} \item{robust}{If \code{\link[base:logical]{TRUE}}, the normalization function is estimated robustly.} \item{...}{Arguments passed to (\code{\link[stats]{smooth.spline}} or \code{\link[aroma.light]{robustSmoothSpline}}).} } \value{ Returns an object of the same type and dimensions as the input. } \section{Missing values}{ Both argument \code{X} and \code{xTarget} may contain non-finite values. These values do not affect the estimation of the normalization function. Missing values and other non-finite values in \code{X}, remain in the output as is. No new missing values are introduced. } \examples{ # Simulate three samples with on average 20\% missing values N <- 10000 X <- cbind(rnorm(N, mean=3, sd=1), rnorm(N, mean=4, sd=2), rgamma(N, shape=2, rate=1)) X[sample(3*N, size=0.20*3*N)] <- NA # Plot the data layout(matrix(c(1,0,2:5), ncol=2, byrow=TRUE)) xlim <- range(X, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions") Xn <- normalizeQuantile(X) plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions") plotXYCurve(X, Xn, xlim=xlim, main="The three normalized distributions") Xn2 <- normalizeQuantileSpline(X, xTarget=Xn[,1], spar=0.99) plotDensity(Xn2, lwd=2, xlim=xlim, main="The three normalized distributions") plotXYCurve(X, Xn2, xlim=xlim, main="The three normalized distributions") } \author{Henrik Bengtsson} \seealso{ The target distribution can be calculated as the average using \code{\link{averageQuantile}}(). Internally either \code{\link[aroma.light]{robustSmoothSpline}} (\code{robust=TRUE}) or \code{\link[stats]{smooth.spline}} (\code{robust=FALSE}) is used. An alternative normalization method that is also normalizing the empirical densities of samples is \code{\link{normalizeQuantileRank}}(). Contrary to this method, that method requires that all samples are based on the exact same set of data points and it is also more likely to over-correct in the tails of the distributions. } \references{ [1] H. Bengtsson, R. Irizarry, B. Carvalho, and T. Speed, \emph{Estimation and assessment of raw copy numbers at the single locus level}, Bioinformatics, 2008. \cr } \keyword{methods} \keyword{nonparametric} \keyword{multivariate} \keyword{robust} aroma.light/man/plotXYCurve.Rd0000644000175000017500000000446014136047216016127 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % plotXYCurve.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{plotXYCurve} \alias{plotXYCurve} \alias{plotXYCurve.numeric} \alias{plotXYCurve.matrix} \title{Plot the relationship between two variables as a smooth curve} \usage{ \method{plotXYCurve}{numeric}(x, y, col=1L, lwd=2, dlwd=1, dcol=NA, xlim=NULL, ylim=xlim, xlab=NULL, ylab=NULL, curveFit=smooth.spline, ..., add=FALSE) \method{plotXYCurve}{matrix}(X, Y, col=seq_len(nrow(X)), lwd=2, dlwd=1, dcol=NA, xlim=NULL, ylim=xlim, xlab=NULL, ylab=NULL, curveFit=smooth.spline, ..., add=FALSE) } \description{ Plot the relationship between two variables as a smooth curve. } \arguments{ \item{x, y, X, Y}{Two \code{\link[base]{numeric}} \code{\link[base]{vector}}s of length N for one curve (K=1), or two \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}:es for K curves.} \item{col}{The color of each curve. Either a scalar specifying the same value of all curves, or a \code{\link[base]{vector}} of K curve-specific values.} \item{lwd}{The line width of each curve. Either a scalar specifying the same value of all curves, or a \code{\link[base]{vector}} of K curve-specific values.} \item{dlwd}{The width of each density curve.} \item{dcol}{The fill color of the interior of each density curve.} \item{xlim, ylim}{The x and y plotting limits.} \item{xlab, ylab}{The x and y labels.} \item{curveFit}{The \code{\link[base]{function}} used to fit each curve. The two first arguments of the function must take \code{x} and \code{y}, and the function must return a \code{\link[base]{list}} with fitted elements \code{x} and \code{y}.} \item{...}{Additional arguments passed to \code{\link[graphics]{lines}} used to draw each curve.} \item{add}{If \code{\link[base:logical]{TRUE}}, the graph is added to the current plot, otherwise a new plot is created.} } \value{ Returns nothing. } \section{Missing values}{ Data points (x,y) with non-finite values are excluded. } \author{Henrik Bengtsson} \keyword{methods} \keyword{nonparametric} \keyword{multivariate} \keyword{robust} aroma.light/man/averageQuantile.Rd0000644000175000017500000000301114136047216016767 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % averageQuantile.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{averageQuantile} \alias{averageQuantile} \alias{averageQuantile.list} \alias{averageQuantile.matrix} \title{Gets the average empirical distribution} \usage{ \method{averageQuantile}{list}(X, ...) \method{averageQuantile}{matrix}(X, ...) } \description{ Gets the average empirical distribution for a set of samples. } \arguments{ \item{X}{A \code{\link[base]{list}} with K \code{\link[base]{numeric}} \code{\link[base]{vector}}s, or a \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}}. If a \code{\link[base]{list}}, the \code{\link[base]{vector}}s may be of different lengths.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length equal to the longest \code{\link[base]{vector}} in argument \code{X}. } \section{Missing values}{ Missing values are excluded. } \seealso{ \code{\link{normalizeQuantileRank}}(). \code{\link{normalizeQuantileSpline}}(). \code{\link[stats]{quantile}}. } \author{ Parts adopted from Gordon Smyth (\url{http://www.statsci.org/}) in 2002 \& 2006. Original code by Ben Bolstad at Statistics Department, University of California. } \keyword{methods} \keyword{nonparametric} \keyword{multivariate} \keyword{robust} aroma.light/man/wpca.Rd0000644000175000017500000001620314136047216014613 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % wpca.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{wpca} \alias{wpca} \alias{wpca.matrix} \title{Light-weight Weighted Principal Component Analysis} \usage{ \method{wpca}{matrix}(x, w=NULL, center=TRUE, scale=FALSE, method=c("dgesdd", "dgesvd"), swapDirections=FALSE, ...) } \description{ Calculates the (weighted) principal components of a matrix, that is, finds a new coordinate system (not unique) for representing the given multivariate data such that i) all dimensions are orthogonal to each other, and ii) all dimensions have maximal variances. } \arguments{ \item{x}{An NxK \code{\link[base]{matrix}}.} \item{w}{An N \code{\link[base]{vector}} of weights for each row (observation) in the data matrix. If \code{\link[base]{NULL}}, all observations get the same weight, that is, standard PCA is used.} \item{center}{If \code{\link[base:logical]{TRUE}}, the (weighted) sample mean column \code{\link[base]{vector}} is subtracted from each column in \code{mat}, first. If data is not centered, the effect will be that a linear subspace that goes through the origin is fitted.} \item{scale}{If \code{\link[base:logical]{TRUE}}, each column in \code{mat} is divided by its (weighted) root-mean-square of the centered column, first.} \item{method}{If \code{"dgesdd"} LAPACK's divide-and-conquer based SVD routine is used (faster [1]). If \code{"dgesvd"}, LAPACK's QR-decomposition-based routine is used. } \item{swapDirections}{If \code{\link[base:logical]{TRUE}}, the signs of eigenvectors that have more negative than positive components are inverted. The signs of corresponding principal components are also inverted. This is only of interest when for instance visualizing or comparing with other PCA estimates from other methods, because the PCA (SVD) decomposition of a matrix is not unique. } \item{...}{Not used.} } \value{ Returns a \code{\link[base]{list}} with elements: \item{pc}{An NxK \code{\link[base]{matrix}} where the column \code{\link[base]{vector}}s are the principal components (a.k.a. loading vectors, spectral loadings or factors etc).} \item{d}{An K \code{\link[base]{vector}} containing the eigenvalues of the principal components.} \item{vt}{An KxK \code{\link[base]{matrix}} containing the eigenvector of the principal components.} \item{xMean}{The center coordinate.} It holds that \code{x == t(t(fit$pc \%*\% fit$vt) + fit$xMean)}. } \section{Method}{ A singular value decomposition (SVD) is carried out. Let X=\code{mat}, then the SVD of the matrix is \eqn{X = U D V'}, where \eqn{U} and \eqn{V} are orthogonal, and \eqn{D} is a diagonal matrix with singular values. The principal returned by this method are \eqn{U D}. Internally \code{La.svd()} (or \code{svd()}) of the \pkg{base} package is used. For a popular and well written introduction to SVD see for instance [2]. } \examples{ for (zzz in 0) { # This example requires plot3d() in R.basic [http://www.braju.com/R/] if (!require(pkgName <- "R.basic", character.only=TRUE)) break # ------------------------------------------------------------- # A first example # ------------------------------------------------------------- # Simulate data from the model y <- a + bx + eps(bx) x <- rexp(1000) a <- c(2,15,3) b <- c(2,3,15) bx <- outer(b,x) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x)) y <- a + bx + eps y <- t(y) # Add some outliers by permuting the dimensions for 1/3 of the observations idx <- sample(1:nrow(y), size=1/3*nrow(y)) y[idx,] <- y[idx,c(2,3,1)] # Down-weight the outliers W times to demonstrate how weights are used W <- 10 # Plot the data with fitted lines at four different view points N <- 4 theta <- seq(0,180,length.out=N) phi <- rep(30, length.out=N) # Use a different color for each set of weights col <- topo.colors(W) opar <- par(mar=c(1,1,1,1)+0.1) layout(matrix(1:N, nrow=2, byrow=TRUE)) for (kk in seq_along(theta)) { # Plot the data plot3d(y, theta=theta[kk], phi=phi[kk]) # First, same weights for all observations w <- rep(1, length=nrow(y)) for (ww in 1:W) { # Fit a line using IWPCA through data fit <- wpca(y, w=w, swapDirections=TRUE) # Get the first principal component ymid <- fit$xMean d0 <- apply(y, MARGIN=2, FUN=min) - ymid d1 <- apply(y, MARGIN=2, FUN=max) - ymid b <- fit$vt[1,] y0 <- -b * max(abs(d0)) y1 <- b * max(abs(d1)) yline <- matrix(c(y0,y1), nrow=length(b), ncol=2) yline <- yline + ymid points3d(t(ymid), col=col) lines3d(t(yline), col=col) # Down-weight outliers only, because here we know which they are. w[idx] <- w[idx]/2 } # Highlight the last one lines3d(t(yline), col="red", lwd=3) } par(opar) } # for (zzz in 0) rm(zzz) if (dev.cur() > 1) dev.off() # ------------------------------------------------------------- # A second example # ------------------------------------------------------------- # Data x <- c(1,2,3,4,5) y <- c(2,4,3,3,6) opar <- par(bty="L") opalette <- palette(c("blue", "red", "black")) xlim <- ylim <- c(0,6) # Plot the data and the center mass plot(x,y, pch=16, cex=1.5, xlim=xlim, ylim=ylim) points(mean(x), mean(y), cex=2, lwd=2, col="blue") # Linear regression y ~ x fit <- lm(y ~ x) abline(fit, lty=1, col=1) # Linear regression y ~ x through without intercept fit <- lm(y ~ x - 1) abline(fit, lty=2, col=1) # Linear regression x ~ y fit <- lm(x ~ y) c <- coefficients(fit) b <- 1/c[2] a <- -b*c[1] abline(a=a, b=b, lty=1, col=2) # Linear regression x ~ y through without intercept fit <- lm(x ~ y - 1) b <- 1/coefficients(fit) abline(a=0, b=b, lty=2, col=2) # Orthogonal linear "regression" fit <- wpca(cbind(x,y)) b <- fit$vt[1,2]/fit$vt[1,1] a <- fit$xMean[2]-b*fit$xMean[1] abline(a=a, b=b, lwd=2, col=3) # Orthogonal linear "regression" without intercept fit <- wpca(cbind(x,y), center=FALSE) b <- fit$vt[1,2]/fit$vt[1,1] a <- fit$xMean[2]-b*fit$xMean[1] abline(a=a, b=b, lty=2, lwd=2, col=3) legend(xlim[1],ylim[2], legend=c("lm(y~x)", "lm(y~x-1)", "lm(x~y)", "lm(x~y-1)", "pca", "pca w/o intercept"), lty=rep(1:2,3), lwd=rep(c(1,1,2),each=2), col=rep(1:3,each=2)) palette(opalette) par(opar) } \author{Henrik Bengtsson} \references{ [1] J. Demmel and J. Dongarra, \emph{DOE2000 Progress Report}, 2004. \url{https://people.eecs.berkeley.edu/~demmel/DOE2000/Report0100.html} \cr [2] Todd Will, \emph{Introduction to the Singular Value Decomposition}, UW-La Crosse, 2004. \url{http://websites.uwlax.edu/twill/svd/} \cr } \seealso{ For a iterative re-weighted PCA method, see \code{\link{iwpca}}(). For Singular Value Decomposition, see \code{\link[base]{svd}}(). For other implementations of Principal Component Analysis functions see (if they are installed): \code{\link[stats]{prcomp}} in package \pkg{stats} and \code{pca()} in package \pkg{pcurve}. } \keyword{methods} \keyword{algebra} aroma.light/man/plotMvsMPairs.Rd0000644000175000017500000000241214136047216016436 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % plotMvsMPairs.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{plotMvsMPairs} \alias{plotMvsMPairs} \alias{plotMvsMPairs.matrix} \title{Plot log-ratios vs log-ratios for all pairs of columns} \description{ Plot log-ratios vs log-ratios for all pairs of columns. } \usage{ \method{plotMvsMPairs}{matrix}(X, xlab="M", ylab="M", xlim=c(-1, 1) * 6, ylim=xlim, pch=".", ..., add=FALSE) } \arguments{ \item{X}{Nx2K \code{\link[base]{matrix}} where N is the number of observations and 2K is an even number of channels.} \item{xlab,ylab}{Labels on the x and y axes.} \item{xlim,ylim}{Plot range on the x and y axes.} \item{pch}{Plot symbol used.} \item{...}{Additional arguments accepted by \code{\link[graphics]{points}}.} \item{add}{If \code{\link[base:logical]{TRUE}}, data points are plotted in the current plot, otherwise a new plot is created.} } \details{ Log-ratio are calculated by over paired columns, e.g. column 1 and 2, column 3 and 4, and so on. } \value{ Returns nothing. } \author{Henrik Bengtsson} \keyword{methods} aroma.light/man/normalizeTumorBoost.Rd0000644000175000017500000001326714136047216017726 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeTumorBoost.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeTumorBoost} \alias{normalizeTumorBoost} \alias{normalizeTumorBoost.numeric} \title{Normalizes allele B fractions for a tumor given a match normal} \description{ TumorBoost [1] is a normalization method that normalizes the allele B fractions of a tumor sample given the allele B fractions and genotypes of a matched normal. The method is a single-sample (single-pair) method. It does not require total copy-number estimates. The normalization is done such that the total copy number is unchanged afterwards. } \usage{ \method{normalizeTumorBoost}{numeric}(betaT, betaN, muN=callNaiveGenotypes(betaN), preserveScale=FALSE, flavor=c("v4", "v3", "v2", "v1"), ...) } \arguments{ \item{betaT, betaN}{Two \code{\link[base]{numeric}} \code{\link[base]{vector}}s each of length J with tumor and normal allele B fractions, respectively.} \item{muN}{An optional \code{\link[base]{vector}} of length J containing normal genotypes calls in (0,1/2,1,\code{\link[base]{NA}}) for (AA,AB,BB).} \item{preserveScale}{If \code{\link[base:logical]{TRUE}}, SNPs that are heterozygous in the matched normal are corrected for signal compression using an estimate of signal compression based on the amount of correction performed by TumorBoost on SNPs that are homozygous in the matched normal.} \item{flavor}{A \code{\link[base]{character}} string specifying the type of correction applied.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length J containing the normalized allele B fractions for the tumor. Attribute \code{modelFit} is a \code{\link[base]{list}} containing model fit parameters. } \details{ Allele B fractions are defined as the ratio between the allele B signal and the sum of both (all) allele signals at the same locus. Allele B fractions are typically within [0,1], but may have a slightly wider support due to for instance negative noise. This is typically also the case for the returned normalized allele B fractions. } \section{Flavors}{ This method provides a few different "flavors" for normalizing the data. The following values of argument \code{flavor} are accepted: \itemize{ \item{v4: (default) The TumorBoost method, i.e. Eqns. (8)-(9) in [1].} \item{v3: Eqn (9) in [1] is applied to both heterozygous and homozygous SNPs, which effectively is v4 where the normalized allele B fractions for homozygous SNPs becomes 0 and 1.} \item{v2: ...} \item{v1: TumorBoost where correction factor is forced to one, i.e. \eqn{\eta_j=1}. As explained in [1], this is a suboptimal normalization method. See also the discussion in the paragraph following Eqn (12) in [1].} } } \section{Preserving scale}{ \emph{As of \pkg{aroma.light} v1.33.3 (March 30, 2014), argument \code{preserveScale} no longer has a default value and has to be specified explicitly. This is done in order to change the default to \code{\link[base:logical]{FALSE}} in a future version, while minimizing the risk for surprises.} Allele B fractions are more or less compressed toward a half, e.g. the signals for homozygous SNPs are slightly away from zero and one. The TumorBoost method decreases the correlation in allele B fractions between the tumor and the normal \emph{conditioned on the genotype}. What it does not control for is the mean level of the allele B fraction \emph{conditioned on the genotype}. By design, most flavors of the method will correct the homozygous SNPs such that their mean levels get close to the expected zero and one levels. However, the heterozygous SNPs will typically keep the same mean levels as before. One possibility is to adjust the signals such as the mean levels of the heterozygous SNPs relative to that of the homozygous SNPs is the same after as before the normalization. If argument \code{preserveScale=TRUE}, then SNPs that are heterozygous (in the matched normal) are corrected for signal compression using an estimate of signal compression based on the amount of correction performed by TumorBoost on SNPs that are homozygous (in the matched normal). The option of preserving the scale is \emph{not} discussed in the TumorBoost paper [1], which presents the \code{preserveScale=FALSE} version. } \examples{ library(R.utils) # Load data pathname <- system.file("data-ex/TumorBoost,fracB,exampleData.Rbin", package="aroma.light") data <- loadObject(pathname) attachLocally(data) pos <- position/1e6 muN <- genotypeN layout(matrix(1:4, ncol=1)) par(mar=c(2.5,4,0.5,1)+0.1) ylim <- c(-0.05, 1.05) col <- rep("#999999", length(muN)) col[muN == 1/2] <- "#000000" # Allele B fractions for the normal sample plot(pos, betaN, col=col, ylim=ylim) # Allele B fractions for the tumor sample plot(pos, betaT, col=col, ylim=ylim) # TumorBoost w/ naive genotype calls betaTN <- normalizeTumorBoost(betaT=betaT, betaN=betaN, preserveScale=FALSE) plot(pos, betaTN, col=col, ylim=ylim) # TumorBoost w/ external multi-sample genotype calls betaTNx <- normalizeTumorBoost(betaT=betaT, betaN=betaN, muN=muN, preserveScale=FALSE) plot(pos, betaTNx, col=col, ylim=ylim) } \author{Henrik Bengtsson, Pierre Neuvial} \references{ [1] H. Bengtsson, P. Neuvial and T.P. Speed, \emph{TumorBoost: Normalization of allele-specific tumor copy numbers from a single pair of tumor-normal genotyping microarrays}, BMC Bioinformatics, 2010, 11:245. [PMID 20462408] \cr } \keyword{methods} aroma.light/man/1._Calibration_and_Normalization.Rd0000644000175000017500000002203414136047216022135 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % 901.CalibrationAndNormalization.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{1. Calibration and Normalization} \alias{1. Calibration and Normalization} \title{1. Calibration and Normalization} \encoding{latin1} \description{ In this section we give \emph{our} recommendation on how spotted two-color (or multi-color) microarray data is best calibrated and normalized. } \section{Classical background subtraction}{ We do \emph{not} recommend background subtraction in classical means where background is estimated by various image analysis methods. This means that we will only consider foreground signals in the analysis. We estimate "background" by other means. In what is explain below, only a global background, that is, a global bias, is estimated and removed. } \section{Multiscan calibration}{ In Bengtsson et al (2004) we give evidence that microarray scanners can introduce a significant bias in data. This bias, which is about 15-25 out of 65535, \emph{will} introduce intensity dependency in the log-ratios, as explained in Bengtsson & \enc{Hssjer}{Hossjer} (2006). In Bengtsson et al (2004) we find that this bias is stable across arrays (and a couple of months), but further research is needed in order to tell if this is true over a longer time period. To calibrate signals for scanner biases, scan the same array at multiple PMT-settings at three or more (K >= 3) different PMT settings (preferably in decreasing order). While doing this, \emph{do not adjust the laser power settings}. Also, do the multiscan \emph{without} washing, cleaning or by other means changing the array between subsequent scans. Although not necessary, it is preferred that the array remains in the scanner between subsequent scans. This will simplify the image analysis since spot identification can be made once if images aligns perfectly. After image analysis, read all K scans for the same array into the two matrices, one for the red and one for the green channel, where the K columns corresponds to scans and the N rows to the spots. It is enough to use foreground signals. In order to multiscan calibrate the data, for each channel separately call \code{Xc <- calibrateMultiscan(X)} where \code{X} is the NxK matrix of signals for one channel across all scans. The calibrated signals are returned in the Nx1 matrix \code{Xc}. Multiscan calibration may sometimes be skipped, especially if affine normalization is applied immediately after, but we do recommend that every lab check at least once if their scanner introduce bias. If the offsets in a scanner is already estimated from earlier multiscan analyses, or known by other means, they can readily be subtracted from the signals of each channel. If arrays are still multiscanned, it is possible to force the calibration method to fit the model with zero intercept (assuming the scanner offsets have been subtracted) by adding argument \code{center=FALSE}. } \section{Affine normalization}{ In Bengtsson & \enc{Hssjer}{Hossjer} (2006), we carry out a detailed study on how biases in each channel introduce so called intensity-dependent log-ratios among other systematic artifacts. Data with (additive) bias in each channel is said to be \emph{affinely} transformed. Data without such bias, is said to be \emph{linearly} (proportionally) transform. Ideally, observed signals (data) is a linear (proportional) function of true gene expression levels. We do \emph{not} assume proportional observations. The scanner bias is real evidence that assuming linearity is not correct. Affine normalization corrects for affine transformation in data. Without control spots it is not possible to estimate the bias in each of the channels but only the relative bias such that after normalization the effective bias are the same in all channels. This is why we call it normalization and not calibration. In its simplest form, affine normalization is done by \code{Xn <- normalizeAffine(X)} where \code{X} is a Nx2 matrix with the first column holds the foreground signals from the red channel and the second holds the signals from the green channel. If three- or four-channel data is used these are added the same way. The normalized data is returned as a Nx2 matrix \code{Xn}. To normalize all arrays and all channels at once, one may put all data into one big NxK matrix where the K columns hold the all channels from the first array, then all channels from the second array and so on. Then \code{Xn <- normalizeAffine(X)} will return the across-array and across-channel normalized data in the NxK matrix \code{Xn} where the columns are stored in the same order as in matrix \code{X}. Equal effective bias in all channels is much better. First of all, any intensity-dependent bias in the log-ratios is removed \emph{for all non-differentially expressed genes}. There is still an intensity-dependent bias in the log-ratios for differentially expressed genes, but this is now symmetric around log-ratio zero. Affine normalization will (by default and recommended) normalize \emph{all} arrays together and at once. This will guarantee that all arrays are "on the same scale". Thus, it \emph{not} recommended to apply a classical between-array scale normalization afterward. Moreover, the average log-ratio will be zero after an affine normalization. Note that an affine normalization will only remove curvature in the log-ratios at lower intensities. If a strong intensity-dependent bias at high intensities remains, this is most likely due to saturation effects, such as too high PMT settings or quenching. Note that for a perfect affine normalization you \emph{should} expect much higher noise levels in the \emph{log-ratios} at lower intensities than at higher. It should also be approximately symmetric around zero log-ratio. In other words, \emph{a strong fanning effect is a good sign}. Due to different noise levels in red and green channels, different PMT settings in different channels, plus the fact that the minimum signal is zero, "odd shapes" may be seen in the log-ratio vs log-intensity graphs at lower intensities. Typically, these show themselves as non-symmetric in positive and negative log-ratios. Note that you should not see this at higher intensities. If there is a strong intensity-dependent effect left after the affine normalization, we recommend, for now, that a subsequent curve-fit or quantile normalization is done. Which one, we do not know. Why negative signals? By default, 5\% of the normalized signals will have a non-positive signal in one or both channels. \emph{This is on purpose}, although the exact number 5\% is chosen by experience. The reason for introducing negative signals is that they are indeed expected. For instance, when measure a zero gene expression level, there is a chance that the observed value is (should be) negative due to measurement noise. (For this reason it is possible that the scanner manufacturers have introduced scanner bias on purpose to avoid negative signals, which then all would be truncated to zero.) To adjust the ratio (or number) of negative signals allowed, use for example \code{normalizeAffine(X, constraint=0.01)} for 1\% negative signals. If set to zero (or \code{"max"}) only as much bias is removed such that no negative signals exist afterward. Note that this is also true if there were negative signals on beforehand. Why not lowess normalization? Curve-fit normalization methods such as lowess normalization are basically designed based on linearity assumptions and will for this reason not correct for channel biases. Curve-fit normalization methods can by definition only be applied to one pair of channels at the time and do therefore require a subsequent between-array scale normalization, which is by the way very ad hoc. Why not quantile normalization? Affine normalization can be though of a special case of quantile normalization that is more robust than the latter. See Bengtsson & \enc{Hssjer}{Hossjer} (2006) for details. Quantile normalization is probably better to apply than curve-fit normalization methods, but less robust than affine normalization, especially at extreme (low and high) intensities. For this reason, we do recommend to use affine normalization first, and if this is not satisfactory, quantile normalization may be applied. } \section{Linear (proportional) normalization}{ If the channel offsets are zero, already corrected for, or estimated by other means, it is possible to normalize the data robustly by fitting the above affine model without intercept, that is, fitting a truly linear model. This is done adding argument \code{center=FALSE} when calling \code{normalizeAffine()}. } \author{Henrik Bengtsson} \keyword{documentation} aroma.light/man/medianPolish.Rd0000644000175000017500000000461114136047216016275 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % medianPolish.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{medianPolish} \alias{medianPolish} \alias{medianPolish.matrix} \title{Median polish} \description{ Median polish. } \usage{ \method{medianPolish}{matrix}(X, tol=0.01, maxIter=10L, na.rm=NA, ..., .addExtra=TRUE) } \arguments{ \item{X}{N-times-K \code{\link[base]{matrix}}} \item{tol}{A \code{\link[base]{numeric}} value greater than zero used as a threshold to identify when the algorithm has converged.} \item{maxIter}{Maximum number of iterations.} \item{na.rm}{If \code{\link[base:logical]{TRUE}} (\code{\link[base:logical]{FALSE}}), \code{\link[base]{NA}}s are exclude (not exclude). If \code{\link[base]{NA}}, it is assumed that \code{X} contains no \code{\link[base]{NA}} values.} \item{.addExtra}{If \code{\link[base:logical]{TRUE}}, the name of argument \code{X} is returned and the returned structure is assigned a class. This will make the result compatible what \code{\link[stats]{medpolish}} returns.} \item{...}{Not used.} } \value{ Returns a named \code{\link[base]{list}} structure with elements: \item{overall}{The fitted constant term.} \item{row}{The fitted row effect.} \item{col}{The fitted column effect.} \item{residuals}{The residuals.} \item{converged}{If \code{\link[base:logical]{TRUE}}, the algorithm converged, otherwise not.} } \details{ The implementation of this method give identical estimates as \code{\link[stats]{medpolish}}, but is about 3-5 times more efficient when there are no \code{\link[base]{NA}} values. } \author{Henrik Bengtsson} \examples{ # Deaths from sport parachuting; from ABC of EDA, p.224: deaths <- matrix(c(14,15,14, 7,4,7, 8,2,10, 15,9,10, 0,2,0), ncol=3, byrow=TRUE) rownames(deaths) <- c("1-24", "25-74", "75-199", "200++", "NA") colnames(deaths) <- 1973:1975 print(deaths) mp <- medianPolish(deaths) mp1 <- medpolish(deaths, trace=FALSE) print(mp) ff <- c("overall", "row", "col", "residuals") stopifnot(all.equal(mp[ff], mp1[ff])) # Validate decomposition: stopifnot(all.equal(deaths, mp$overall+outer(mp$row,mp$col,"+")+mp$resid)) } \seealso{ \code{\link[stats]{medpolish}}. } \keyword{methods} \keyword{algebra} aroma.light/man/normalizeQuantileRank.matrix.Rd0000644000175000017500000000700214136047216021500 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeQuantileRank.matrix.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeQuantileRank.matrix} \alias{normalizeQuantileRank.matrix} \title{Normalizes the empirical distribution of a set of samples to a common target distribution} \usage{ \method{normalizeQuantileRank}{matrix}(X, ties=FALSE, robust=FALSE, weights=NULL, typeOfWeights=c("channel", "signal"), ...) } \description{ Normalizes the empirical distribution of a set of samples to a common target distribution. The average sample distribution is calculated either robustly or not by utilizing either \code{weightedMedian()} or \code{weighted.mean()}. A weighted method is used if any of the weights are different from one. } \arguments{ \item{X}{a numerical NxK \code{\link[base]{matrix}} with the K columns representing the channels and the N rows representing the data points.} \item{robust}{If \code{\link[base:logical]{TRUE}}, the (weighted) median function is used for calculating the average sample distribution, otherwise the (weighted) mean function is used.} \item{ties}{Should ties in \code{x} be treated with care or not? For more details, see "limma:normalizeQuantiles".} \item{weights}{If \code{\link[base]{NULL}}, non-weighted normalization is done. If channel weights, this should be a \code{\link[base]{vector}} of length K specifying the weights for each channel. If signal weights, it should be an NxK \code{\link[base]{matrix}} specifying the weights for each signal. } \item{typeOfWeights}{A \code{\link[base]{character}} string specifying the type of weights given in argument \code{weights}.} \item{...}{Not used.} } \value{ Returns an object of the same shape as the input argument. } \section{Missing values}{ Missing values are excluded when estimating the "common" (the baseline). Values that are \code{\link[base]{NA}} remain \code{\link[base]{NA}} after normalization. No new \code{\link[base]{NA}}s are introduced. } \section{Weights}{ Currently only channel weights are support due to the way quantile normalization is done. If signal weights are given, channel weights are calculated from these by taking the mean of the signal weights in each channel. } \examples{ # Simulate three samples with on average 20\% missing values N <- 10000 X <- cbind(rnorm(N, mean=3, sd=1), rnorm(N, mean=4, sd=2), rgamma(N, shape=2, rate=1)) X[sample(3*N, size=0.20*3*N)] <- NA # Normalize quantiles Xn <- normalizeQuantile(X) # Plot the data layout(matrix(1:2, ncol=1)) xlim <- range(X, Xn, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions") plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions") } \author{ Adopted from Gordon Smyth (\url{http://www.statsci.org/}) in 2002 \& 2006. Original code by Ben Bolstad at Statistics Department, University of California. Support for calculating the average sample distribution using (weighted) mean or median was added by Henrik Bengtsson. } \seealso{ \code{\link[stats]{median}}, \code{\link[matrixStats]{weightedMedian}}, \code{\link[base]{mean}}() and \code{\link[stats]{weighted.mean}}. \code{\link{normalizeQuantileSpline}}(). } \keyword{methods} \keyword{nonparametric} \keyword{multivariate} \keyword{robust} aroma.light/man/normalizeAverage.Rd0000644000175000017500000000270614136047216017157 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeAverage.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeAverage} \alias{normalizeAverage} \alias{normalizeAverage.list} \alias{normalizeAverage.matrix} \title{Rescales channel vectors to get the same average} \description{ Rescales channel vectors to get the same average. } \usage{ \method{normalizeAverage}{matrix}(x, baseline=1, avg=stats::median, targetAvg=2200, ...) \method{normalizeAverage}{list}(x, baseline=1, avg=stats::median, targetAvg=2200, ...) } \arguments{ \item{x}{A \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}} (or \code{\link[base]{list}} of length K).} \item{baseline}{An \code{\link[base]{integer}} in [1,K] specifying which channel should be the baseline.} \item{avg}{A \code{\link[base]{function}} for calculating the average of one channel.} \item{targetAvg}{The average that each channel should have afterwards. If \code{\link[base]{NULL}}, the baseline column sets the target average.} \item{...}{Additional arguments passed to the \code{avg} \code{\link[base]{function}}.} } \value{ Returns a normalized \code{\link[base]{numeric}} NxK \code{\link[base]{matrix}} (or \code{\link[base]{list}} of length K). } \author{Henrik Bengtsson} \keyword{methods} aroma.light/man/sampleCorrelations.Rd0000644000175000017500000000340314136047216017525 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % sampleCorrelations.matrix.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{sampleCorrelations} \alias{sampleCorrelations} \alias{sampleCorrelations.matrix} \title{Calculates the correlation for random pairs of observations} \description{ Calculates the correlation for random pairs of observations. } \usage{ \method{sampleCorrelations}{matrix}(X, MARGIN=1, pairs=NULL, npairs=max(5000, nrow(X)), ...) } \arguments{ \item{X}{An NxK \code{\link[base]{matrix}} where N >= 2 and K >= 2.} \item{MARGIN}{The dimension (1 or 2) in which the observations are. If \code{MARGIN==1} (\code{==2}), each row (column) is an observation.} \item{pairs}{If a Lx2 \code{\link[base]{matrix}}, the L index pairs for which the correlations are calculated. If \code{\link[base]{NULL}}, pairs of observations are sampled.} \item{npairs}{The number of correlations to calculate.} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{double}} \code{\link[base]{vector}} of length \code{npairs}. } \author{Henrik Bengtsson} \examples{ # Simulate 20000 genes with 10 observations each X <- matrix(rnorm(n=20000), ncol=10) # Calculate the correlation for 5000 random gene pairs cor <- sampleCorrelations(X, npairs=5000) print(summary(cor)) } \seealso{ \code{\link[base]{sample}}(). } \references{ [1] A. Ploner, L. Miller, P. Hall, J. Bergh & Y. Pawitan. \emph{Correlation test to assess low-level processing of high-density oligonucleotide microarray data}. BMC Bioinformatics, 2005, vol 6. } \keyword{methods} \keyword{utilities} aroma.light/man/pairedAlleleSpecificCopyNumbers.Rd0000644000175000017500000000305514136047216022102 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % pairedAlleleSpecificCopyNumbers.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{pairedAlleleSpecificCopyNumbers} \alias{pairedAlleleSpecificCopyNumbers} \alias{pairedAlleleSpecificCopyNumbers.numeric} \title{Calculating tumor-normal paired allele-specific copy number stratified on genotypes} \description{ Calculating tumor-normal paired allele-specific copy number stratified on genotypes. The method is a single-sample (single-pair) method. It requires paired tumor-normal parent-specific copy number signals. } \usage{ \method{pairedAlleleSpecificCopyNumbers}{numeric}(thetaT, betaT, thetaN, betaN, muN=callNaiveGenotypes(betaN), ...) } \arguments{ \item{thetaT, betaT}{Theta and allele-B fraction signals for the tumor.} \item{thetaN, betaN}{Total and allele-B fraction signals for the matched normal.} \item{muN}{An optional \code{\link[base]{vector}} of length J containing normal genotypes calls in (0,1/2,1,\code{\link[base]{NA}}) for (AA,AB,BB).} \item{...}{Not used.} } \value{ Returns a \code{\link[base]{data.frame}} with elements \code{CT}, \code{betaT} and \code{muN}. } \seealso{ This definition of calculating tumor-normal paired ASCN is related to how the \code{\link{normalizeTumorBoost}}() method calculates normalized tumor BAFs. } \author{Pierre Neuvial, Henrik Bengtsson} \keyword{methods} aroma.light/man/calibrateMultiscan.Rd0000644000175000017500000001412414136047216017467 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % calibrateMultiscan.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{calibrateMultiscan} \alias{calibrateMultiscan} \alias{calibrateMultiscan.matrix} \encoding{latin1} \title{Weighted affine calibration of a multiple re-scanned channel} \description{ Weighted affine calibration of a multiple re-scanned channel. } \usage{ \method{calibrateMultiscan}{matrix}(X, weights=NULL, typeOfWeights=c("datapoint"), method="L1", constraint="diagonal", satSignal=2^16 - 1, ..., average=median, deviance=NULL, project=FALSE, .fitOnly=FALSE) } \arguments{ \item{X}{An NxK \code{\link[base]{matrix}} (K>=2) where the columns represent the multiple scans of one channel (a two-color array contains two channels) to be calibrated.} \item{weights}{If \code{\link[base]{NULL}}, non-weighted normalization is done. If data-point weights are used, this should be a \code{\link[base]{vector}} of length N of data point weights used when estimating the normalization function. } \item{typeOfWeights}{A \code{\link[base]{character}} string specifying the type of weights given in argument \code{weights}. } \item{method}{A \code{\link[base]{character}} string specifying how the estimates are robustified. See \code{\link{iwpca}}() for all accepted values.} \item{constraint}{Constraint making the bias parameters identifiable. See \code{\link{fitIWPCA}}() for more details.} \item{satSignal}{Signals equal to or above this threshold is considered saturated signals.} \item{...}{Other arguments passed to \code{\link{fitIWPCA}}() and in turn \code{\link{iwpca}}(), e.g. \code{center} (see below).} \item{average}{A \code{\link[base]{function}} to calculate the average signals between calibrated scans.} \item{deviance}{A \code{\link[base]{function}} to calculate the deviance of the signals between calibrated scans.} \item{project}{If \code{\link[base:logical]{TRUE}}, the calibrated data points projected onto the diagonal line, otherwise not. Moreover, if \code{\link[base:logical]{TRUE}}, argument \code{average} is ignored.} \item{.fitOnly}{If \code{\link[base:logical]{TRUE}}, the data will not be back-transform.} } \value{ If \code{average} is specified or \code{project} is \code{\link[base:logical]{TRUE}}, an Nx1 \code{\link[base]{matrix}} is returned, otherwise an NxK \code{\link[base]{matrix}} is returned. If \code{deviance} is specified, a deviance Nx1 \code{\link[base]{matrix}} is returned as attribute \code{deviance}. In addition, the fitted model is returned as attribute \code{modelFit}. } \section{Negative, non-positive, and saturated values}{ Affine multiscan calibration applies also to negative values, which are therefor also calibrated, if they exist. Saturated signals in any scan are set to \code{\link[base]{NA}}. Thus, they will not be used to estimate the calibration function, nor will they affect an optional projection. } \section{Missing values}{ Only observations (rows) in \code{X} that contain all finite values are used in the estimation of the calibration functions. Thus, observations can be excluded by setting them to \code{\link[base]{NA}}. } \section{Weighted normalization}{ Each data point/observation, that is, each row in \code{X}, which is a vector of length K, can be assigned a weight in [0,1] specifying how much it should \emph{affect the fitting of the calibration function}. Weights are given by argument \code{weights}, which should be a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N. Regardless of weights, all data points are \emph{calibrated} based on the fitted calibration function. } \section{Robustness}{ By default, the model fit of multiscan calibration is done in \eqn{L_1} (\code{method="L1"}). This way, outliers affect the parameter estimates less than ordinary least-square methods. When calculating the average calibrated signal from multiple scans, by default the median is used, which further robustify against outliers. For further robustness, downweight outliers such as saturated signals, if possible. Tukey's biweight function is supported, but not used by default because then a "bandwidth" parameter has to selected. This can indeed be done automatically by estimating the standard deviation, for instance using MAD. However, since scanner signals have heteroscedastic noise (standard deviation is approximately proportional to the non-logged signal), Tukey's bandwidth parameter has to be a function of the signal too, cf. \code{\link[stats]{loess}}. We have experimented with this too, but found that it does not significantly improve the robustness compared to \eqn{L_1}. Moreover, using Tukey's biweight as is, that is, assuming homoscedastic noise, seems to introduce a (scale dependent) bias in the estimates of the offset terms. } \section{Using a known/previously estimated offset}{ If the scanner offsets can be assumed to be known, for instance, from prior multiscan analyses on the scanner, then it is possible to fit the scanner model with no (zero) offset by specifying argument \code{center=FALSE}. Note that you cannot specify the offset. Instead, subtract it from all signals before calibrating, e.g. \code{Xc <- calibrateMultiscan(X-e, center=FALSE)} where \code{e} is the scanner offset (a scalar). You can assert that the model is fitted without offset by \code{stopifnot(all(attr(Xc, "modelFit")$adiag == 0))}. } \details{ Fitting is done by iterated re-weighted principal component analysis (IWPCA). } \author{Henrik Bengtsson} \references{ [1] H. Bengtsson, J. Vallon-Christersson and G. \enc{Jnsson}{Jonsson}, \emph{Calibration and assessment of channel-specific biases in microarray data with extended dynamical range}, BMC Bioinformatics, 5:177, 2004. \cr } \examples{\dontrun{# For an example, see help(normalizeAffine).}} \seealso{ \code{\link{1. Calibration and Normalization}}. \code{\link{normalizeAffine}}(). } \keyword{methods} aroma.light/man/iwpca.Rd0000644000175000017500000001171514136047216014767 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % iwpca.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{iwpca} \alias{iwpca} \alias{iwpca.matrix} \title{Fits an R-dimensional hyperplane using iterative re-weighted PCA} \description{ Fits an R-dimensional hyperplane using iterative re-weighted PCA. } \usage{ \method{iwpca}{matrix}(X, w=NULL, R=1, method=c("symmetric", "bisquare", "tricube", "L1"), maxIter=30, acc=1e-04, reps=0.02, fit0=NULL, ...) } \arguments{ \item{X}{N-times-K \code{\link[base]{matrix}} where N is the number of observations and K is the number of dimensions.} \item{w}{An N \code{\link[base]{vector}} of weights for each row (observation) in the data matrix. If \code{\link[base]{NULL}}, all observations get the same weight.} \item{R}{Number of principal components to fit. By default a line is fitted.} \item{method}{ If \code{"symmetric"} (or \code{"bisquare"}), Tukey's biweight is used. If \code{"tricube"}, the tricube weight is used. If \code{"L1"}, the model is fitted in \eqn{L_1}. If a \code{\link[base]{function}}, it is used to calculate weights for next iteration based on the current iteration's residuals.} \item{maxIter}{Maximum number of iterations.} \item{acc}{The (Euclidean) distance between two subsequent parameters fit for which the algorithm is considered to have converged.} \item{reps}{Small value to be added to the residuals before the the weights are calculated based on their inverse. This is to avoid infinite weights.} \item{fit0}{A \code{\link[base]{list}} containing elements \code{vt} and \code{pc} specifying an initial fit. If \code{\link[base]{NULL}}, the initial guess will be equal to the (weighted) PCA fit.} \item{...}{Additional arguments accepted by \code{\link{wpca}}().} } \value{ Returns the fit (a \code{\link[base]{list}}) from the last call to \code{\link{wpca}}() with the additional elements \code{nbrOfIterations} and \code{converged}. } \details{ This method uses weighted principal component analysis (WPCA) to fit a R-dimensional hyperplane through the data with initial internal weights all equal. At each iteration the internal weights are recalculated based on the "residuals". If \code{method=="L1"}, the internal weights are 1 / sum(abs(r) + reps). This is the same as \code{method=function(r) 1/sum(abs(r)+reps)}. The "residuals" are orthogonal Euclidean distance of the principal components R,R+1,...,K. In each iteration before doing WPCA, the internal weighted are multiplied by the weights given by argument \code{w}, if specified. } \author{Henrik Bengtsson} \examples{ for (zzz in 0) { # This example requires plot3d() in R.basic [http://www.braju.com/R/] if (!require(pkgName <- "R.basic", character.only=TRUE)) break # Simulate data from the model y <- a + bx + eps(bx) x <- rexp(1000) a <- c(2,15,3) b <- c(2,3,4) bx <- outer(b,x) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x)) y <- a + bx + eps y <- t(y) # Add some outliers by permuting the dimensions for 1/10 of the observations idx <- sample(1:nrow(y), size=1/10*nrow(y)) y[idx,] <- y[idx,c(2,3,1)] # Plot the data with fitted lines at four different view points opar <- par(mar=c(1,1,1,1)+0.1) N <- 4 layout(matrix(1:N, nrow=2, byrow=TRUE)) theta <- seq(0,270,length.out=N) phi <- rep(20, length.out=N) xlim <- ylim <- zlim <- c(0,45); persp <- list(); for (kk in seq_along(theta)) { # Plot the data persp[[kk]] <- plot3d(y, theta=theta[kk], phi=phi[kk], xlim=xlim, ylim=ylim, zlim=zlim) } # Weights on the observations # Example a: Equal weights w <- NULL # Example b: More weight on the outliers (uncomment to test) w <- rep(1, length(x)); w[idx] <- 0.8 # ...and show all iterations too with different colors. maxIter <- c(seq(1,20,length.out=10),Inf) col <- topo.colors(length(maxIter)) # Show the fitted value for every iteration for (ii in seq_along(maxIter)) { # Fit a line using IWPCA through data fit <- iwpca(y, w=w, maxIter=maxIter[ii], swapDirections=TRUE) ymid <- fit$xMean d0 <- apply(y, MARGIN=2, FUN=min) - ymid d1 <- apply(y, MARGIN=2, FUN=max) - ymid b <- fit$vt[1,] y0 <- -b * max(abs(d0)) y1 <- b * max(abs(d1)) yline <- matrix(c(y0,y1), nrow=length(b), ncol=2) yline <- yline + ymid for (kk in seq_along(theta)) { # Set pane to draw in par(mfg=c((kk-1) \%/\% 2, (kk-1) \%\% 2) + 1); # Set the viewpoint of the pane options(persp.matrix=persp[[kk]]); # Get the first principal component points3d(t(ymid), col=col[ii]) lines3d(t(yline), col=col[ii]) # Highlight the last one if (ii == length(maxIter)) lines3d(t(yline), col="red", lwd=3) } } par(opar) } # for (zzz in 0) rm(zzz) } \seealso{ Internally \code{\link{wpca}}() is used for calculating the weighted PCA. } \keyword{methods} \keyword{algebra} aroma.light/man/likelihood.smooth.spline.Rd0000644000175000017500000001057214136047216020610 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % likelihood.smooth.spline.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{likelihood.smooth.spline} \alias{likelihood.smooth.spline} \title{Calculate the log likelihood of a smoothing spline given the data} \usage{ \method{likelihood}{smooth.spline}(object, x=NULL, y=NULL, w=NULL, base=exp(1), rel.tol=.Machine$double.eps^(1/8), ...) } \arguments{ \item{object}{The smooth.spline object.} \item{x, y}{The x and y values for which the (weighted) likelihood will be calculated. If \code{x} is of type \code{xy.coords} any value of argument \code{y} will be omitted. If \code{x==NULL}, the x and y values of the smoothing spline will be used.} \item{w}{The weights for which the (weighted) likelihood will be calculated. If \code{\link[base]{NULL}}, weights equal to one are assumed.} \item{base}{The base of the logarithm of the likelihood. If \code{\link[base]{NULL}}, the non-logged likelihood is returned.} \item{rel.tol}{The relative tolerance used in the call to \code{integrate}.} \item{...}{Not used.} } \description{ Calculate the (log) likelihood of a spline given the data used to fit the spline, \eqn{g}. The likelihood consists of two main parts: 1) (weighted) residuals sum of squares, and 2) a penalty term. The penalty term consists of a \emph{smoothing parameter} \eqn{lambda} and a \emph{roughness measure} of the spline \eqn{J(g) = \int g''(t) dt}. Hence, the overall log likelihood is \deqn{\log L(g|x) = (y-g(x))'W(y-g(x)) + \lambda J(g)} In addition to the overall likelihood, all its separate components are also returned. Note: when fitting a smooth spline with \eqn{(x,y)} values where the \eqn{x}'s are \emph{not} unique, \code{smooth.spline} will replace such \eqn{(x,y)}'s with a new pair \eqn{(x,y')} where \eqn{y'} is a reweighted average on the original \eqn{y}'s. It is important to be aware of this. In such cases, the resulting \code{smooth.spline} object does \emph{not} contain all \eqn{(x,y)}'s and therefore this function will not calculate the weighted residuals sum of square on the original data set, but on the data set with unique \eqn{x}'s. See examples below how to calculate the likelihood for the spline with the original data. } \value{ Returns the overall (log) likelihood of class \code{SmoothSplineLikelihood}, a class with the following attributes: \item{wrss}{the (weighted) residual sum of square} \item{penalty}{the penalty which is equal to \code{-lambda*roughness}.} \item{lambda}{the smoothing parameter} \item{roughness}{the value of the roughness functional given the specific smoothing spline and the range of data} } \details{ The roughness penalty for the smoothing spline, \eqn{g}, fitted from data in the interval \eqn{[a,b]} is defined as \deqn{J(g) = \int_a^b g''(t) dt} which is the same as \deqn{J(g) = g'(b) - g'(a)} The latter is calculated internally by using \code{\link[stats]{predict.smooth.spline}}. } \examples{ # Define f(x) f <- expression(0.1*x^4 + 1*x^3 + 2*x^2 + x + 10*sin(2*x)) # Simulate data from this function in the range [a,b] a <- -2; b <- 5 x <- seq(a, b, length.out=3000) y <- eval(f) # Add some noise to the data y <- y + rnorm(length(y), 0, 10) # Plot the function and its second derivative plot(x,y, type="l", lwd=4) # Fit a cubic smoothing spline and plot it g <- smooth.spline(x,y, df=16) lines(g, col="yellow", lwd=2, lty=2) # Calculating the (log) likelihood of the fitted spline l <- likelihood(g) cat("Log likelihood with unique x values:\n") print(l) # Note that this is not the same as the log likelihood of the # data on the fitted spline iff the x values are non-unique x[1:5] <- x[1] # Non-unique x values g <- smooth.spline(x,y, df=16) l <- likelihood(g) cat("\nLog likelihood of the *spline* data set:\n") print(l) # In cases with non unique x values one has to proceed as # below if one want to get the log likelihood for the original # data. l <- likelihood(g, x=x, y=y) cat("\nLog likelihood of the *original* data set:\n") print(l) } \seealso{ \code{\link[stats]{smooth.spline}} and \code{\link{robustSmoothSpline}}(). } \author{Henrik Bengtsson} \keyword{methods} \keyword{smooth} \keyword{internal} aroma.light/man/backtransformAffine.Rd0000644000175000017500000000716214136047216017632 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % backtransformAffine.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{backtransformAffine} \alias{backtransformAffine} \alias{backtransformAffine.matrix} \title{Reverse affine transformation} \description{ Reverse affine transformation. } \usage{ \method{backtransformAffine}{matrix}(X, a=NULL, b=NULL, project=FALSE, ...) } \arguments{ \item{X}{An NxK \code{\link[base]{matrix}} containing data to be backtransformed.} \item{a}{A scalar, \code{\link[base]{vector}}, a \code{\link[base]{matrix}}, or a \code{\link[base]{list}}. First, if a \code{\link[base]{list}}, it is assumed to contained the elements \code{a} and \code{b}, which are the used as if they were passed as separate arguments. If a \code{\link[base]{vector}}, a matrix of size NxK is created which is then filled \emph{row by row} with the values in the vector. Commonly, the vector is of length K, which means that the matrix will consist of copies of this vector stacked on top of each other. If a \code{\link[base]{matrix}}, a matrix of size NxK is created which is then filled \emph{column by column} with the values in the matrix (collected column by column. Commonly, the matrix is of size NxK, or NxL with L < K and then the resulting matrix consists of copies sitting next to each other. The resulting NxK matrix is subtracted from the NxK matrix \code{X}. } \item{b}{A scalar, \code{\link[base]{vector}}, a \code{\link[base]{matrix}}. A NxK matrix is created from this argument. For details see argument \code{a}. The NxK matrix \code{X-a} is divided by the resulting NxK matrix. } \item{project}{ returned (K values per data point are returned). If \code{\link[base:logical]{TRUE}}, the backtransformed values "\code{(X-a)/b}" are projected onto the line L(a,b) so that all columns will be identical. } \item{...}{Not used.} } \value{ The "\code{(X-a)/b}" backtransformed NxK \code{\link[base]{matrix}} is returned. If \code{project} is \code{\link[base:logical]{TRUE}}, an Nx1 \code{\link[base]{matrix}} is returned, because all columns are identical anyway. } \section{Missing values}{ Missing values remain missing values. If projected, data points that contain missing values are projected without these. } \examples{ X <- matrix(1:8, nrow=4, ncol=2) X[2,2] <- NA print(X) # Returns a 4x2 matrix print(backtransformAffine(X, a=c(1,5))) # Returns a 4x2 matrix print(backtransformAffine(X, b=c(1,1/2))) # Returns a 4x2 matrix print(backtransformAffine(X, a=matrix(1:4,ncol=1))) # Returns a 4x2 matrix print(backtransformAffine(X, a=matrix(1:3,ncol=1))) # Returns a 4x2 matrix print(backtransformAffine(X, a=matrix(1:2,ncol=1), b=c(1,2))) # Returns a 4x1 matrix print(backtransformAffine(X, b=c(1,1/2), project=TRUE)) # If the columns of X are identical, and a identity # backtransformation is applied and projected, the # same matrix is returned. X <- matrix(1:4, nrow=4, ncol=3) Y <- backtransformAffine(X, b=c(1,1,1), project=TRUE) print(X) print(Y) stopifnot(sum(X[,1]-Y) <= .Machine$double.eps) # If the columns of X are identical, and a identity # backtransformation is applied and projected, the # same matrix is returned. X <- matrix(1:4, nrow=4, ncol=3) X[,2] <- X[,2]*2; X[,3] <- X[,3]*3 print(X) Y <- backtransformAffine(X, b=c(1,2,3)) print(Y) Y <- backtransformAffine(X, b=c(1,2,3), project=TRUE) print(Y) stopifnot(sum(X[,1]-Y) <= .Machine$double.eps) } \keyword{methods} aroma.light/man/callNaiveGenotypes.Rd0000644000175000017500000000726714136047216017467 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % callNaiveGenotypes.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{callNaiveGenotypes} \alias{callNaiveGenotypes} \alias{callNaiveGenotypes.numeric} \title{Calls genotypes in a normal sample} \description{ Calls genotypes in a normal sample. } \usage{ \method{callNaiveGenotypes}{numeric}(y, cn=rep(2L, times = length(y)), ..., modelFit=NULL, verbose=FALSE) } \arguments{ \item{y}{A \code{\link[base]{numeric}} \code{\link[base]{vector}} of length J containing allele B fractions for a normal sample.} \item{cn}{An optional \code{\link[base]{numeric}} \code{\link[base]{vector}} of length J specifying the true total copy number in \eqn{\{0,1,2,NA\}} at each locus. This can be used to specify which loci are diploid and which are not, e.g. autosomal and sex chromosome copy numbers.} \item{...}{Additional arguments passed to \code{\link{fitNaiveGenotypes}}().} \item{modelFit}{A optional model fit as returned by \code{\link{fitNaiveGenotypes}}().} \item{verbose}{A \code{\link[base]{logical}} or a \code{\link[R.utils]{Verbose}} object.} } \value{ Returns a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length J containing the genotype calls in allele B fraction space, that is, in [0,1] where 1/2 corresponds to a heterozygous call, and 0 and 1 corresponds to homozygous A and B, respectively. Non called genotypes have value \code{\link[base]{NA}}. } \examples{ layout(matrix(1:3, ncol=1)) par(mar=c(2,4,4,1)+0.1) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A bimodal distribution # - - - - - - - - - - - - - - - - - - - - - - - - - - - - xAA <- rnorm(n=10000, mean=0, sd=0.1) xBB <- rnorm(n=10000, mean=1, sd=0.1) x <- c(xAA,xBB) fit <- findPeaksAndValleys(x) print(fit) calls <- callNaiveGenotypes(x, cn=rep(1,length(x)), verbose=-20) xc <- split(x, calls) print(table(calls)) xx <- c(list(x),xc) plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA,BB)") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution with missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - xAB <- rnorm(n=10000, mean=1/2, sd=0.1) x <- c(xAA,xAB,xBB) x[sample(length(x), size=0.05*length(x))] <- NA; x[sample(length(x), size=0.01*length(x))] <- -Inf; x[sample(length(x), size=0.01*length(x))] <- +Inf; fit <- findPeaksAndValleys(x) print(fit) calls <- callNaiveGenotypes(x) xc <- split(x, calls) print(table(calls)) xx <- c(list(x),xc) plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA,AB,BB)") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution with clear separation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - xAA <- rnorm(n=10000, mean=0, sd=0.02) xAB <- rnorm(n=10000, mean=1/2, sd=0.02) xBB <- rnorm(n=10000, mean=1, sd=0.02) x <- c(xAA,xAB,xBB) fit <- findPeaksAndValleys(x) print(fit) calls <- callNaiveGenotypes(x) xc <- split(x, calls) print(table(calls)) xx <- c(list(x),xc) plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA',AB',BB')") abline(v=fit$x) } \section{Missing and non-finite values}{ A missing value always gives a missing (\code{\link[base]{NA}}) genotype call. Negative infinity (-\code{\link[base:is.finite]{Inf}}) always gives genotype call 0. Positive infinity (+\code{\link[base:is.finite]{Inf}}) always gives genotype call 1. } \author{Henrik Bengtsson} \seealso{ Internally \code{\link{fitNaiveGenotypes}}() is used to identify the thresholds. } \keyword{methods} aroma.light/man/fitXYCurve.Rd0000644000175000017500000000721614136047216015735 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % fitXYCurve.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{fitXYCurve} \alias{fitXYCurve} \alias{fitXYCurve.matrix} \alias{backtransformXYCurve} \alias{backtransformXYCurve.matrix} \title{Fitting a smooth curve through paired (x,y) data} \description{ Fitting a smooth curve through paired (x,y) data. } \usage{ \method{fitXYCurve}{matrix}(X, weights=NULL, typeOfWeights=c("datapoint"), method=c("loess", "lowess", "spline", "robustSpline"), bandwidth=NULL, satSignal=2^16 - 1, ...) } \arguments{ \item{X}{An Nx2 \code{\link[base]{matrix}} where the columns represent the two channels to be normalized.} \item{weights}{If \code{\link[base]{NULL}}, non-weighted normalization is done. If data-point weights are used, this should be a \code{\link[base]{vector}} of length N of data point weights used when estimating the normalization function. } \item{typeOfWeights}{A \code{\link[base]{character}} string specifying the type of weights given in argument \code{weights}. } \item{method}{\code{\link[base]{character}} string specifying which method to use when fitting the intensity-dependent function. Supported methods: \code{"loess"} (better than lowess), \code{"lowess"} (classic; supports only zero-one weights), \code{"spline"} (more robust than lowess at lower and upper intensities; supports only zero-one weights), \code{"robustSpline"} (better than spline). } \item{bandwidth}{A \code{\link[base]{double}} value specifying the bandwidth of the estimator used. } \item{satSignal}{Signals equal to or above this threshold will not be used in the fitting. } \item{...}{Not used.} } \value{ A named \code{\link[base]{list}} structure of class \code{XYCurve}. } \section{Missing values}{ The estimation of the function will only be made based on complete non-saturated observations, i.e. observations that contains no \code{\link[base]{NA}} values nor saturated values as defined by \code{satSignal}. } \section{Weighted normalization}{ Each data point, that is, each row in \code{X}, which is a vector of length 2, can be assigned a weight in [0,1] specifying how much it should \emph{affect the fitting of the normalization function}. Weights are given by argument \code{weights}, which should be a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N. Note that the lowess and the spline method only support zero-one \{0,1\} weights. For such methods, all weights that are less than a half are set to zero. } \section{Details on loess}{ For \code{\link[stats]{loess}}, the arguments \code{family="symmetric"}, \code{degree=1}, \code{span=3/4}, \code{control=loess.control(trace.hat="approximate"}, \code{iterations=5}, \code{surface="direct")} are used. } \author{Henrik Bengtsson} \examples{ # Simulate data from the model y <- a + bx + x^c + eps(bx) x <- rexp(1000) a <- c(2,15) b <- c(2,1) c <- c(1,2) bx <- outer(b,x) xc <- t(sapply(c, FUN=function(c) x^c)) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x)) Y <- a + bx + xc + eps Y <- t(Y) lim <- c(0,70) plot(Y, xlim=lim, ylim=lim) # Fit principal curve through a subset of (y_1, y_2) subset <- sample(nrow(Y), size=0.3*nrow(Y)) fit <- fitXYCurve(Y[subset,], bandwidth=0.2) lines(fit, col="red", lwd=2) # Backtransform (y_1, y_2) keeping y_1 unchanged YN <- backtransformXYCurve(Y, fit=fit) points(YN, col="blue") abline(a=0, b=1, col="red", lwd=2) } \keyword{methods} aroma.light/man/sampleTuples.Rd0000644000175000017500000000241214136047216016334 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % sampleTuples.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{sampleTuples} \alias{sampleTuples.default} \alias{sampleTuples} \title{Sample tuples of elements from a set} \description{ Sample tuples of elements from a set. The elements within a sampled tuple are unique, i.e. no two elements are the same. } \usage{ \method{sampleTuples}{default}(x, size, length, ...) } \arguments{ \item{x}{A set of elements to sample from.} \item{size}{The number of tuples to sample.} \item{length}{The length of each tuple.} \item{...}{Additional arguments passed to \code{\link[base]{sample}}().} } \value{ Returns a NxK \code{\link[base]{matrix}} where N = \code{size} and K = \code{length}. } \author{Henrik Bengtsson} \examples{ pairs <- sampleTuples(1:10, size=5, length=2) print(pairs) triples <- sampleTuples(1:10, size=5, length=3) print(triples) # Allow tuples with repeated elements quadruples <- sampleTuples(1:3, size=5, length=4, replace=TRUE) print(quadruples) } \seealso{ \code{\link[base]{sample}}(). } \keyword{utilities} aroma.light/man/normalizeAffine.Rd0000644000175000017500000002323514136047216016775 0ustar nileshnilesh%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do not modify this file since it was automatically generated from: % % normalizeAffine.R % % by the Rdoc compiler part of the R.oo package. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \name{normalizeAffine} \alias{normalizeAffine} \alias{normalizeAffine.matrix} \encoding{latin1} \title{Weighted affine normalization between channels and arrays} \description{ Weighted affine normalization between channels and arrays. This method will remove curvature in the M vs A plots that are due to an affine transformation of the data. In other words, if there are (small or large) biases in the different (red or green) channels, biases that can be equal too, you will get curvature in the M vs A plots and this type of curvature will be removed by this normalization method. Moreover, if you normalize all slides at once, this method will also bring the signals on the same scale such that the log-ratios for different slides are comparable. Thus, do not normalize the scale of the log-ratios between slides afterward. It is recommended to normalize as many slides as possible in one run. The result is that if creating log-ratios between any channels and any slides, they will contain as little curvature as possible. Furthermore, since the relative scale between any two channels on any two slides will be one if one normalizes all slides (and channels) at once it is possible to add or multiply with the \emph{same} constant to all channels/arrays without introducing curvature. Thus, it is easy to rescale the data afterwards as demonstrated in the example. } \usage{ \method{normalizeAffine}{matrix}(X, weights=NULL, typeOfWeights=c("datapoint"), method="L1", constraint=0.05, satSignal=2^16 - 1, ..., .fitOnly=FALSE) } \arguments{ \item{X}{An NxK \code{\link[base]{matrix}} (K>=2) where the columns represent the channels, to be normalized.} \item{weights}{If \code{\link[base]{NULL}}, non-weighted normalization is done. If data-point weights are used, this should be a \code{\link[base]{vector}} of length N of data point weights used when estimating the normalization function. } \item{typeOfWeights}{A \code{\link[base]{character}} string specifying the type of weights given in argument \code{weights}. } \item{method}{A \code{\link[base]{character}} string specifying how the estimates are robustified. See \code{\link{iwpca}}() for all accepted values.} \item{constraint}{Constraint making the bias parameters identifiable. See \code{\link{fitIWPCA}}() for more details.} \item{satSignal}{Signals equal to or above this threshold will not be used in the fitting.} \item{...}{Other arguments passed to \code{\link{fitIWPCA}}() and in turn \code{\link{iwpca}}(). For example, the weight argument of \code{\link{iwpca}}(). See also below.} \item{.fitOnly}{If \code{\link[base:logical]{TRUE}}, the data will not be back-transform.} } \value{ A NxK \code{\link[base]{matrix}} of the normalized channels. The fitted model is returned as attribute \code{modelFit}. } \section{Negative, non-positive, and saturated values}{ Affine normalization applies equally well to negative values. Thus, contrary to normalization methods applied to log-ratios, such as curve-fit normalization methods, affine normalization, will not set these to \code{\link[base]{NA}}. Data points that are saturated in one or more channels are not used to estimate the normalization function, but they are normalized. } \section{Missing values}{ The estimation of the affine normalization function will only be made based on complete non-saturated observations, i.e. observations that contains no \code{\link[base]{NA}} values nor saturated values as defined by \code{satSignal}. } \section{Weighted normalization}{ Each data point/observation, that is, each row in \code{X}, which is a vector of length K, can be assigned a weight in [0,1] specifying how much it should \emph{affect the fitting of the affine normalization function}. Weights are given by argument \code{weights}, which should be a \code{\link[base]{numeric}} \code{\link[base]{vector}} of length N. Regardless of weights, all data points are \emph{normalized} based on the fitted normalization function. } \section{Robustness}{ By default, the model fit of affine normalization is done in \eqn{L_1} (\code{method="L1"}). This way, outliers affect the parameter estimates less than ordinary least-square methods. For further robustness, downweight outliers such as saturated signals, if possible. We do not use Tukey's biweight function for reasons similar to those outlined in \code{\link{calibrateMultiscan}}(). } \section{Using known/previously estimated channel offsets}{ If the channel offsets can be assumed to be known, then it is possible to fit the affine model with no (zero) offset, which formally is a linear (proportional) model, by specifying argument \code{center=FALSE}. In order to do this, the channel offsets have to be subtracted from the signals manually before normalizing, e.g. \code{Xa <- t(t(X)-a)} where \code{e} is \code{\link[base]{vector}} of length \code{ncol(X)}. Then normalize by \code{Xn <- normalizeAffine(Xa, center=FALSE)}. You can assert that the model is fitted without offset by \code{stopifnot(all(attr(Xn, "modelFit")$adiag == 0))}. } \details{ A line is fitted robustly through the \eqn{(y_R,y_G)} observations using an iterated re-weighted principal component analysis (IWPCA), which minimized the residuals that are orthogonal to the fitted line. Each observation is down-weighted by the inverse of the absolute residuals, i.e. the fit is done in \eqn{L_1}. } \author{Henrik Bengtsson} \references{ [1] Henrik Bengtsson and Ola \enc{Hssjer}{Hossjer}, \emph{Methodological Study of Affine Transformations of Gene Expression Data}, Methodological study of affine transformations of gene expression data with proposed robust non-parametric multi-dimensional normalization method, BMC Bioinformatics, 2006, 7:100. \cr } \examples{ pathname <- system.file("data-ex", "PMT-RGData.dat", package="aroma.light") rg <- read.table(pathname, header=TRUE, sep="\t") nbrOfScans <- max(rg$slide) rg <- as.list(rg) for (field in c("R", "G")) rg[[field]] <- matrix(as.double(rg[[field]]), ncol=nbrOfScans) rg$slide <- rg$spot <- NULL rg <- as.matrix(as.data.frame(rg)) colnames(rg) <- rep(c("R", "G"), each=nbrOfScans) layout(matrix(c(1,2,0,3,4,0,5,6,7), ncol=3, byrow=TRUE)) rgC <- rg for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) channelColor <- switch(channel, R="red", G="green") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The raw data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plotMvsAPairs(rg[,sidx]) title(main=paste("Observed", channel)) box(col=channelColor) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The calibrated data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgC[,sidx] <- calibrateMultiscan(rg[,sidx], average=NULL) plotMvsAPairs(rgC[,sidx]) title(main=paste("Calibrated", channel)) box(col=channelColor) } # for (channel ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The average calibrated data # # Note how the red signals are weaker than the green. The reason # for this can be that the scale factor in the green channel is # greater than in the red channel, but it can also be that there # is a remaining relative difference in bias between the green # and the red channel, a bias that precedes the scanning. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgCA <- rg for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) rgCA[,sidx] <- calibrateMultiscan(rg[,sidx]) } rgCAavg <- matrix(NA_real_, nrow=nrow(rgCA), ncol=2) colnames(rgCAavg) <- c("R", "G") for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) rgCAavg[,channel] <- apply(rgCA[,sidx], MARGIN=1, FUN=median, na.rm=TRUE) } # Add some "fake" outliers outliers <- 1:600 rgCAavg[outliers,"G"] <- 50000 plotMvsA(rgCAavg) title(main="Average calibrated (AC)") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Normalize data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Weight-down outliers when normalizing weights <- rep(1, nrow(rgCAavg)) weights[outliers] <- 0.001 # Affine normalization of channels rgCANa <- normalizeAffine(rgCAavg, weights=weights) # It is always ok to rescale the affine normalized data if its # done on (R,G); not on (A,M)! However, this is only needed for # esthetic purposes. rgCANa <- rgCANa *2^1.4 plotMvsA(rgCANa) title(main="Normalized AC") # Curve-fit (lowess) normalization rgCANlw <- normalizeLowess(rgCAavg, weights=weights) plotMvsA(rgCANlw, col="orange", add=TRUE) # Curve-fit (loess) normalization rgCANl <- normalizeLoess(rgCAavg, weights=weights) plotMvsA(rgCANl, col="red", add=TRUE) # Curve-fit (robust spline) normalization rgCANrs <- normalizeRobustSpline(rgCAavg, weights=weights) plotMvsA(rgCANrs, col="blue", add=TRUE) legend(x=0,y=16, legend=c("affine", "lowess", "loess", "r. spline"), pch=19, col=c("black", "orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n") plotMvsMPairs(cbind(rgCANa, rgCANlw), col="orange", xlab=expression(M[affine])) title(main="Normalized AC") plotMvsMPairs(cbind(rgCANa, rgCANl), col="red", add=TRUE) plotMvsMPairs(cbind(rgCANa, rgCANrs), col="blue", add=TRUE) abline(a=0, b=1, lty=2) legend(x=-6,y=6, legend=c("lowess", "loess", "r. spline"), pch=19, col=c("orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n") } \seealso{ \code{\link{calibrateMultiscan}}(). } \keyword{methods} aroma.light/tests/0000755000175000017500000000000014136047216013757 5ustar nileshnilesharoma.light/tests/rowAverages.matrix.R0000644000175000017500000000035614136047216017676 0ustar nileshnileshlibrary("aroma.light") X <- matrix(1:30, nrow=5L, ncol=6L) mu <- rowMeans(X) sd <- apply(X, MARGIN=1L, FUN=sd) y <- rowAverages(X) stopifnot(all(y == mu)) stopifnot(all(attr(y,"deviance") == sd)) stopifnot(all(attr(y,"df") == ncol(X))) aroma.light/tests/normalizeDifferencesToAverage.R0000644000175000017500000000164414136047216022043 0ustar nileshnileshlibrary("aroma.light") # Simulate three shifted tracks of different lengths with same profiles ns <- c(A=2, B=1, C=0.25)*1000 xx <- lapply(ns, FUN=function(n) { seq(from=1, to=max(ns), length.out=n) }) zz <- mapply(seq_along(ns), ns, FUN=function(z,n) rep(z,n)) yy <- list( A = rnorm(ns["A"], mean=0, sd=0.5), B = rnorm(ns["B"], mean=5, sd=0.4), C = rnorm(ns["C"], mean=-5, sd=1.1) ) yy <- lapply(yy, FUN=function(y) { n <- length(y) y[1:(n/2)] <- y[1:(n/2)] + 2 y[1:(n/4)] <- y[1:(n/4)] - 4 y }) # Shift all tracks toward the first track yyN <- normalizeDifferencesToAverage(yy, baseline=1) # The baseline channel is not changed stopifnot(identical(yy[[1]], yyN[[1]])) # Get the estimated parameters fit <- attr(yyN, "fit") # Plot the tracks layout(matrix(1:2, ncol=1)) x <- unlist(xx) col <- unlist(zz) y <- unlist(yy) yN <- unlist(yyN) plot(x, y, col=col, ylim=c(-10,10)) plot(x, yN, col=col, ylim=c(-10,10)) aroma.light/tests/wpca2.matrix.R0000644000175000017500000000264514136047216016430 0ustar nileshnileshlibrary("aroma.light") # ------------------------------------------------------------- # A second example # ------------------------------------------------------------- # Data x <- c(1,2,3,4,5) y <- c(2,4,3,3,6) opar <- par(bty="L") opalette <- palette(c("blue", "red", "black")) xlim <- ylim <- c(0,6) # Plot the data and the center mass plot(x,y, pch=16, cex=1.5, xlim=xlim, ylim=ylim) points(mean(x), mean(y), cex=2, lwd=2, col="blue") # Linear regression y ~ x fit <- lm(y ~ x) abline(fit, lty=1, col=1) # Linear regression y ~ x through without intercept fit <- lm(y ~ x - 1) abline(fit, lty=2, col=1) # Linear regression x ~ y fit <- lm(x ~ y) c <- coefficients(fit) b <- 1/c[2] a <- -b*c[1] abline(a=a, b=b, lty=1, col=2) # Linear regression x ~ y through without intercept fit <- lm(x ~ y - 1) b <- 1/coefficients(fit) abline(a=0, b=b, lty=2, col=2) # Orthogonal linear "regression" fit <- wpca(cbind(x,y)) b <- fit$vt[1,2]/fit$vt[1,1] a <- fit$xMean[2]-b*fit$xMean[1] abline(a=a, b=b, lwd=2, col=3) # Orthogonal linear "regression" without intercept fit <- wpca(cbind(x,y), center=FALSE) b <- fit$vt[1,2]/fit$vt[1,1] a <- fit$xMean[2]-b*fit$xMean[1] abline(a=a, b=b, lty=2, lwd=2, col=3) legend(xlim[1],ylim[2], legend=c("lm(y~x)", "lm(y~x-1)", "lm(x~y)", "lm(x~y-1)", "pca", "pca w/o intercept"), lty=rep(1:2,3), lwd=rep(c(1,1,2),each=2), col=rep(1:3,each=2)) palette(opalette) par(opar) aroma.light/tests/fitPrincipalCurve.matrix.R0000644000175000017500000000422014136047216021034 0ustar nileshnileshlibrary("aroma.light") # Simulate data from the model y <- a + bx + x^c + eps(bx) J <- 1000 x <- rexp(J) a <- c(2,15,3) b <- c(2,3,4) c <- c(1,2,1/2) bx <- outer(b,x) xc <- t(sapply(c, FUN=function(c) x^c)) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(b), mean=0, sd=0.1*x)) y <- a + bx + xc + eps y <- t(y) # Fit principal curve through (y_1, y_2, y_3) fit <- fitPrincipalCurve(y, verbose=TRUE) # Flip direction of 'lambda'? rho <- cor(fit$lambda, y[,1], use="complete.obs") flip <- (rho < 0) if (flip) { fit$lambda <- max(fit$lambda, na.rm=TRUE)-fit$lambda } # Backtransform (y_1, y_2, y_3) to be proportional to each other yN <- backtransformPrincipalCurve(y, fit=fit) # Same backtransformation dimension by dimension yN2 <- y for (cc in 1:ncol(y)) { yN2[,cc] <- backtransformPrincipalCurve(y, fit=fit, dimensions=cc) } stopifnot(identical(yN2, yN)) xlim <- c(0, 1.04*max(x)) ylim <- range(c(y,yN), na.rm=TRUE) # Pairwise signals vs x before and after transform layout(matrix(1:4, nrow=2, byrow=TRUE)) par(mar=c(4,4,3,2)+0.1) for (cc in 1:3) { ylab <- substitute(y[c], env=list(c=cc)) plot(NA, xlim=xlim, ylim=ylim, xlab="x", ylab=ylab) abline(h=a[cc], lty=3) mtext(side=4, at=a[cc], sprintf("a=%g", a[cc]), cex=0.8, las=2, line=0, adj=1.1, padj=-0.2) points(x, y[,cc]) points(x, yN[,cc], col="tomato") legend("topleft", col=c("black", "tomato"), pch=19, c("orignal", "transformed"), bty="n") } title(main="Pairwise signals vs x before and after transform", outer=TRUE, line=-2) # Pairwise signals before and after transform layout(matrix(1:4, nrow=2, byrow=TRUE)) par(mar=c(4,4,3,2)+0.1) for (rr in 3:2) { ylab <- substitute(y[c], env=list(c=rr)) for (cc in 1:2) { if (cc == rr) { plot.new() next } xlab <- substitute(y[c], env=list(c=cc)) plot(NA, xlim=ylim, ylim=ylim, xlab=xlab, ylab=ylab) abline(a=0, b=1, lty=2) points(y[,c(cc,rr)]) points(yN[,c(cc,rr)], col="tomato") legend("topleft", col=c("black", "tomato"), pch=19, c("orignal", "transformed"), bty="n") } } title(main="Pairwise signals before and after transform", outer=TRUE, line=-2) aroma.light/tests/callNaiveGenotypes.R0000644000175000017500000000323614136047216017702 0ustar nileshnileshlibrary("aroma.light") layout(matrix(1:3, ncol=1)) par(mar=c(2,4,4,1)+0.1) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A bimodal distribution # - - - - - - - - - - - - - - - - - - - - - - - - - - - - xAA <- rnorm(n=10000, mean=0, sd=0.1) xBB <- rnorm(n=10000, mean=1, sd=0.1) x <- c(xAA,xBB) fit <- findPeaksAndValleys(x) print(fit) calls <- callNaiveGenotypes(x, cn=rep(1,length(x)), verbose=-20) xc <- split(x, calls) print(table(calls)) xx <- c(list(x),xc) plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA,BB)") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution with missing values # - - - - - - - - - - - - - - - - - - - - - - - - - - - - xAB <- rnorm(n=10000, mean=1/2, sd=0.1) x <- c(xAA,xAB,xBB) x[sample(length(x), size=0.05*length(x))] <- NA_real_ x[sample(length(x), size=0.01*length(x))] <- -Inf x[sample(length(x), size=0.01*length(x))] <- +Inf fit <- findPeaksAndValleys(x) print(fit) calls <- callNaiveGenotypes(x) xc <- split(x, calls) print(table(calls)) xx <- c(list(x),xc) plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA,AB,BB)") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution with clear separation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - xAA <- rnorm(n=10000, mean=0, sd=0.02) xAB <- rnorm(n=10000, mean=1/2, sd=0.02) xBB <- rnorm(n=10000, mean=1, sd=0.02) x <- c(xAA,xAB,xBB) fit <- findPeaksAndValleys(x) print(fit) calls <- callNaiveGenotypes(x) xc <- split(x, calls) print(table(calls)) xx <- c(list(x),xc) plotDensity(xx, adjust=1.5, lwd=2, col=seq_along(xx), main="(AA',AB',BB')") abline(v=fit$x) aroma.light/tests/normalizeAverage.matrix.R0000644000175000017500000000107114136047216020677 0ustar nileshnileshlibrary("aroma.light") # Simulate three samples with on average 20% missing values N <- 10000 X <- cbind(rnorm(N, mean=3, sd=1), rnorm(N, mean=4, sd=2), rgamma(N, shape=2, rate=1)) X[sample(3*N, size=0.20*3*N)] <- NA_real_ # Normalize quantiles Xn <- normalizeAverage(X, na.rm=TRUE, targetAvg=median(X, na.rm=TRUE)) # Plot the data layout(matrix(1:2, ncol=1)) xlim <- range(X, Xn, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions") plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions") aroma.light/tests/sampleCorrelations.matrix.R0000644000175000017500000000034514136047216021255 0ustar nileshnileshlibrary("aroma.light") # Simulate 20000 genes with 10 observations each X <- matrix(rnorm(n=20000), ncol=10) # Calculate the correlation for 5000 random gene pairs cor <- sampleCorrelations(X, npairs=5000) print(summary(cor)) aroma.light/tests/normalizeQuantileRank.list.R0000644000175000017500000000140514136047216021373 0ustar nileshnileshlibrary("aroma.light") # Simulate ten samples of different lengths N <- 10000 X <- list() for (kk in 1:8) { rfcn <- list(rnorm, rgamma)[[sample(2, size=1)]] size <- runif(1, min=0.3, max=1) a <- rgamma(1, shape=20, rate=10) b <- rgamma(1, shape=10, rate=10) values <- rfcn(size*N, a, b) # "Censor" values values[values < 0 | values > 8] <- NA_real_ X[[kk]] <- values } # Add 20% missing values X <- lapply(X, FUN=function(x) { x[sample(length(x), size=0.20*length(x))] <- NA_real_ x }) # Normalize quantiles Xn <- normalizeQuantile(X) # Plot the data layout(matrix(1:2, ncol=1)) xlim <- range(X, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The original distributions") plotDensity(Xn, lwd=2, xlim=xlim, main="The normalized distributions") aroma.light/tests/normalizeAffine.matrix.R0000644000175000017500000000517614136047216020527 0ustar nileshnileshlibrary("aroma.light") pathname <- system.file("data-ex", "PMT-RGData.dat", package="aroma.light") rg <- read.table(pathname, header=TRUE, sep="\t") nbrOfScans <- max(rg$slide) rg <- as.list(rg) for (field in c("R", "G")) rg[[field]] <- matrix(as.double(rg[[field]]), ncol=nbrOfScans) rg$slide <- rg$spot <- NULL rg <- as.matrix(as.data.frame(rg)) colnames(rg) <- rep(c("R", "G"), each=nbrOfScans) rgC <- rg layout(matrix(c(1,2,0,3,4,0,5,6,7), ncol=3, byrow=TRUE)) for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) channelColor <- switch(channel, R="red", G="green") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The raw data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plotMvsAPairs(rg, channel=channel) title(main=paste("Observed", channel)) box(col=channelColor) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The calibrated data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgC[,sidx] <- calibrateMultiscan(rg[,sidx], average=NULL) plotMvsAPairs(rgC, channel=channel) title(main=paste("Calibrated", channel)) box(col=channelColor) } # for (channel ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The average calibrated data # # Note how the red signals are weaker than the green. The reason # for this can be that the scale factor in the green channel is # greater than in the red channel, but it can also be that there # is a remaining relative difference in bias between the green # and the red channel, a bias that precedes the scanning. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgCA <- matrix(NA_real_, nrow=nrow(rg), ncol=2) colnames(rgCA) <- c("R", "G") for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) rgCA[,channel] <- calibrateMultiscan(rg[,sidx]) } plotMvsA(rgCA) title(main="Average calibrated") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The affine normalized average calibrated data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Create a matrix where the columns represent the channels # to be normalized. rgCAN <- rgCA # Affine normalization of channels rgCAN <- normalizeAffine(rgCAN) plotMvsA(rgCAN) title(main="Affine normalized A.C.") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # It is always ok to rescale the affine normalized data if its # done on (R,G); not on (A,M)! However, this is only needed for # esthetic purposes. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgCAN <- rgCAN * 2^5 plotMvsA(rgCAN) title(main="Rescaled normalized") aroma.light/tests/robustSmoothSpline.R0000644000175000017500000000221314136047216017763 0ustar nileshnileshlibrary("aroma.light") data(cars) attach(cars) plot(speed, dist, main = "data(cars) & robust smoothing splines") # Fit a smoothing spline using L_2 norm cars.spl <- smooth.spline(speed, dist) lines(cars.spl, col = "blue") # Fit a smoothing spline using L_1 norm cars.rspl <- robustSmoothSpline(speed, dist) lines(cars.rspl, col = "red") # Fit a smoothing spline using L_2 norm with 10 degrees of freedom lines(smooth.spline(speed, dist, df=10), lty=2, col = "blue") # Fit a smoothing spline using L_1 norm with 10 degrees of freedom lines(robustSmoothSpline(speed, dist, df=10), lty=2, col = "red") # Fit a smoothing spline using Tukey's biweight norm cars.rspl <- robustSmoothSpline(speed, dist, method = "symmetric") lines(cars.rspl, col = "purple") legend(5,120, c( paste("smooth.spline [C.V.] => df =",round(cars.spl$df,1)), paste("robustSmoothSpline L1 [C.V.] => df =",round(cars.rspl$df,1)), paste("robustSmoothSpline symmetric [C.V.] => df =",round(cars.rspl$df,1)), "standard with s( * , df = 10)", "robust with s( * , df = 10)" ), col = c("blue","red","purple","blue","red"), lty = c(1,1,1,2,2), bg='bisque') aroma.light/tests/wpca.matrix.R0000644000175000017500000000355014136047216016342 0ustar nileshnileshlibrary("aroma.light") for (zzz in 0) { # This example requires plot3d() in R.basic [http://www.braju.com/R/] if (!require(pkgName <- "R.basic", character.only=TRUE)) break # ------------------------------------------------------------- # A first example # ------------------------------------------------------------- # Simulate data from the model y <- a + bx + eps(bx) x <- rexp(1000) a <- c(2,15,3) b <- c(2,3,15) bx <- outer(b,x) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x)) y <- a + bx + eps y <- t(y) # Add some outliers by permuting the dimensions for 1/3 of the observations idx <- sample(1:nrow(y), size=1/3*nrow(y)) y[idx,] <- y[idx,c(2,3,1)] # Down-weight the outliers W times to demonstrate how weights are used W <- 10 # Plot the data with fitted lines at four different view points N <- 4 theta <- seq(0,180,length.out=N) phi <- rep(30, length.out=N) # Use a different color for each set of weights col <- topo.colors(W) opar <- par(mar=c(1,1,1,1)+0.1) layout(matrix(1:N, nrow=2, byrow=TRUE)) for (kk in seq(theta)) { # Plot the data plot3d(y, theta=theta[kk], phi=phi[kk]) # First, same weights for all observations w <- rep(1, length=nrow(y)) for (ww in 1:W) { # Fit a line using IWPCA through data fit <- wpca(y, w=w, swapDirections=TRUE) # Get the first principal component ymid <- fit$xMean d0 <- apply(y, MARGIN=2, FUN=min) - ymid d1 <- apply(y, MARGIN=2, FUN=max) - ymid b <- fit$vt[1,] y0 <- -b * max(abs(d0)) y1 <- b * max(abs(d1)) yline <- matrix(c(y0,y1), nrow=length(b), ncol=2) yline <- yline + ymid points3d(t(ymid), col=col) lines3d(t(yline), col=col) # Down-weight outliers only, because here we know which they are. w[idx] <- w[idx]/2 } # Highlight the last one lines3d(t(yline), col="red", lwd=3) } par(opar) } # for (zzz in 0) rm(zzz) aroma.light/tests/likelihood.smooth.spline.R0000644000175000017500000000210614136047216021025 0ustar nileshnileshlibrary("aroma.light") # Define f(x) f <- expression(0.1*x^4 + 1*x^3 + 2*x^2 + x + 10*sin(2*x)) # Simulate data from this function in the range [a,b] a <- -2; b <- 5 x <- seq(a, b, length.out=3000) y <- eval(f) # Add some noise to the data y <- y + rnorm(length(y), 0, 10) # Plot the function and its second derivative plot(x,y, type="l", lwd=4) # Fit a cubic smoothing spline and plot it g <- smooth.spline(x,y, df=16) lines(g, col="yellow", lwd=2, lty=2) # Calculating the (log) likelihood of the fitted spline l <- likelihood(g) cat("Log likelihood with unique x values:\n") print(l) # Note that this is not the same as the log likelihood of the # data on the fitted spline iff the x values are non-unique x[1:5] <- x[1] # Non-unique x values g <- smooth.spline(x,y, df=16) l <- likelihood(g) cat("\nLog likelihood of the *spline* data set:\n") print(l) # In cases with non unique x values one has to proceed as # below if one want to get the log likelihood for the original # data. l <- likelihood(g, x=x, y=y) cat("\nLog likelihood of the *original* data set:\n") print(l) aroma.light/tests/normalizeFragmentLength-ex2.R0000644000175000017500000001106314136047216021425 0ustar nileshnileshlibrary("aroma.light") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Example 2: Two-enzyme fragment-length normalization of 6 arrays # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - set.seed(0xbeef) # Number samples I <- 5 # Number of loci J <- 3000 # Fragment lengths (two enzymes) fl <- matrix(0, nrow=J, ncol=2) fl[,1] <- seq(from=100, to=1000, length.out=J) fl[,2] <- seq(from=1000, to=100, length.out=J) # Let 1/2 of the units be on both enzymes fl[seq(from=1, to=J, by=4),1] <- NA_real_ fl[seq(from=2, to=J, by=4),2] <- NA_real_ # Let some have unknown fragment lengths hasUnknownFL <- seq(from=1, to=J, by=15) fl[hasUnknownFL,] <- NA_real_ # Sty/Nsp mixing proportions: rho <- rep(1, I) rho[1] <- 1/3; # Less Sty in 1st sample rho[3] <- 3/2; # More Sty in 3rd sample # Simulate data z <- array(0, dim=c(J,2,I)) maxLog2Theta <- 12 for (ii in 1:I) { # Common effect for both enzymes mu <- function(fl) { k <- runif(n=1, min=3, max=5) mu <- rep(maxLog2Theta, length(fl)) ok <- is.finite(fl) mu[ok] <- mu[ok] - fl[ok]^{1/k} mu } # Calculate the effect for each data point for (ee in 1:2) { z[,ee,ii] <- mu(fl[,ee]) } # Update the Sty/Nsp mixing proportions ee <- 2 z[,ee,ii] <- rho[ii]*z[,ee,ii] # Add random errors for (ee in 1:2) { eps <- rnorm(J, mean=0, sd=1/sqrt(2)) z[,ee,ii] <- z[,ee,ii] + eps } } hasFl <- is.finite(fl) unitSets <- list( nsp = which( hasFl[,1] & !hasFl[,2]), sty = which(!hasFl[,1] & hasFl[,2]), both = which( hasFl[,1] & hasFl[,2]), none = which(!hasFl[,1] & !hasFl[,2]) ) # The observed data is a mix of two enzymes theta <- matrix(NA_real_, nrow=J, ncol=I) # Single-enzyme units for (ee in 1:2) { uu <- unitSets[[ee]] theta[uu,] <- 2^z[uu,ee,] } # Both-enzyme units (sum on intensity scale) uu <- unitSets$both theta[uu,] <- (2^z[uu,1,]+2^z[uu,2,])/2 # Missing units (sample from the others) uu <- unitSets$none theta[uu,] <- apply(theta, MARGIN=2, sample, size=length(uu)) # Calculate target array thetaT <- rowMeans(theta, na.rm=TRUE) targetFcns <- list() for (ee in 1:2) { uu <- unitSets[[ee]] fit <- lowess(fl[uu,ee], log2(thetaT[uu])) class(fit) <- "lowess" targetFcns[[ee]] <- function(fl, ...) { predict(fit, newdata=fl) } } # Fit model only to a subset of the data subsetToFit <- setdiff(1:J, seq(from=1, to=J, by=10)) # Normalize data (to a target baseline) thetaN <- matrix(NA_real_, nrow=J, ncol=I) fits <- vector("list", I) for (ii in 1:I) { lthetaNi <- normalizeFragmentLength(log2(theta[,ii]), targetFcns=targetFcns, fragmentLengths=fl, onMissing="median", subsetToFit=subsetToFit, .returnFit=TRUE) fits[[ii]] <- attr(lthetaNi, "modelFit") thetaN[,ii] <- 2^lthetaNi } # Plot raw data xlim <- c(0, max(fl, na.rm=TRUE)) ylim <- c(0, max(log2(theta), na.rm=TRUE)) Mlim <- c(-1,1)*4 xlab <- "Fragment length" ylab <- expression(log2(theta)) Mlab <- expression(M==log[2](theta/theta[R])) layout(matrix(1:(3*I), ncol=I, byrow=TRUE)) for (ii in 1:I) { plot(NA, xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab, main="raw") # Single-enzyme units for (ee in 1:2) { # The raw data uu <- unitSets[[ee]] points(fl[uu,ee], log2(theta[uu,ii]), col=ee+1) } # Both-enzyme units (use fragment-length for enzyme #1) uu <- unitSets$both points(fl[uu,1], log2(theta[uu,ii]), col=3+1) for (ee in 1:2) { # The true effects uu <- unitSets[[ee]] lines(lowess(fl[uu,ee], log2(theta[uu,ii])), col="black", lwd=4, lty=3) # The estimated effects fit <- fits[[ii]][[ee]]$fit lines(fit, col="orange", lwd=3) muT <- targetFcns[[ee]](fl[uu,ee]) lines(fl[uu,ee], muT, col="cyan", lwd=1) } } # Calculate log-ratios thetaR <- rowMeans(thetaN, na.rm=TRUE) M <- log2(thetaN/thetaR) # Plot normalized data for (ii in 1:I) { plot(NA, xlim=xlim, ylim=Mlim, xlab=xlab, ylab=Mlab, main="normalized") # Single-enzyme units for (ee in 1:2) { # The normalized data uu <- unitSets[[ee]] points(fl[uu,ee], M[uu,ii], col=ee+1) } # Both-enzyme units (use fragment-length for enzyme #1) uu <- unitSets$both points(fl[uu,1], M[uu,ii], col=3+1) } ylim <- c(0,1.5) for (ii in 1:I) { data <- list() for (ee in 1:2) { # The normalized data uu <- unitSets[[ee]] data[[ee]] <- M[uu,ii] } uu <- unitSets$both if (length(uu) > 0) data[[3]] <- M[uu,ii] uu <- unitSets$none if (length(uu) > 0) data[[4]] <- M[uu,ii] cols <- seq_along(data)+1 plotDensity(data, col=cols, xlim=Mlim, xlab=Mlab, main="normalized") abline(v=0, lty=2) } aroma.light/tests/findPeaksAndValleys.R0000644000175000017500000000217314136047216017774 0ustar nileshnileshlibrary("aroma.light") layout(matrix(1:3, ncol=1)) par(mar=c(2,4,4,1)+0.1) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A unimodal distribution # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x1 <- rnorm(n=10000, mean=0, sd=1) x <- x1 fit <- findPeaksAndValleys(x) print(fit) plot(density(x), lwd=2, main="x1") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x2 <- rnorm(n=10000, mean=4, sd=1) x3 <- rnorm(n=10000, mean=8, sd=1) x <- c(x1,x2,x3) fit <- findPeaksAndValleys(x) print(fit) plot(density(x), lwd=2, main="c(x1,x2,x3)") abline(v=fit$x) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A trimodal distribution with clear separation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - x1b <- rnorm(n=10000, mean=0, sd=0.1) x2b <- rnorm(n=10000, mean=4, sd=0.1) x3b <- rnorm(n=10000, mean=8, sd=0.1) x <- c(x1b,x2b,x3b) # Illustrating explicit usage of density() d <- density(x) fit <- findPeaksAndValleys(d, tol=0) print(fit) plot(d, lwd=2, main="c(x1b,x2b,x3b)") abline(v=fit$x) aroma.light/tests/normalizeFragmentLength-ex1.R0000644000175000017500000000331614136047216021426 0ustar nileshnileshlibrary("aroma.light") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Example 1: Single-enzyme fragment-length normalization of 6 arrays # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Number samples I <- 9 # Number of loci J <- 1000 # Fragment lengths fl <- seq(from=100, to=1000, length.out=J) # Simulate data points with unknown fragment lengths hasUnknownFL <- seq(from=1, to=J, by=50) fl[hasUnknownFL] <- NA_real_ # Simulate data y <- matrix(0, nrow=J, ncol=I) maxY <- 12 for (kk in 1:I) { k <- runif(n=1, min=3, max=5) mu <- function(fl) { mu <- rep(maxY, length(fl)) ok <- !is.na(fl) mu[ok] <- mu[ok] - fl[ok]^{1/k} mu } eps <- rnorm(J, mean=0, sd=1) y[,kk] <- mu(fl) + eps } # Normalize data (to a zero baseline) yN <- apply(y, MARGIN=2, FUN=function(y) { normalizeFragmentLength(y, fragmentLengths=fl, onMissing="median") }) # The correction factors rho <- y-yN print(summary(rho)) # The correction for units with unknown fragment lengths # equals the median correction factor of all other units print(summary(rho[hasUnknownFL,])) # Plot raw data layout(matrix(1:9, ncol=3)) xlim <- c(0,max(fl, na.rm=TRUE)) ylim <- c(0,max(y, na.rm=TRUE)) xlab <- "Fragment length" ylab <- expression(log2(theta)) for (kk in 1:I) { plot(fl, y[,kk], xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab) ok <- (is.finite(fl) & is.finite(y[,kk])) lines(lowess(fl[ok], y[ok,kk]), col="red", lwd=2) } # Plot normalized data layout(matrix(1:9, ncol=3)) ylim <- c(-1,1)*max(y, na.rm=TRUE)/2 for (kk in 1:I) { plot(fl, yN[,kk], xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab) ok <- (is.finite(fl) & is.finite(y[,kk])) lines(lowess(fl[ok], yN[ok,kk]), col="blue", lwd=2) } aroma.light/tests/normalizeTumorBoost,flavors.R0000644000175000017500000000236214136047216021614 0ustar nileshnileshlibrary("aroma.light") library("R.utils") # Load data pathname <- system.file("data-ex/TumorBoost,fracB,exampleData.Rbin", package="aroma.light") data <- loadObject(pathname) # Drop loci with missing values data <- na.omit(data) attachLocally(data) pos <- position/1e6 # Call naive genotypes muN <- callNaiveGenotypes(betaN) # Genotype classes isAA <- (muN == 0) isAB <- (muN == 1/2) isBB <- (muN == 1) # Sanity checks stopifnot(all(muN[isAA] == 0)) stopifnot(all(muN[isAB] == 1/2)) stopifnot(all(muN[isBB] == 1)) # TumorBoost normalization with different flavors betaTNs <- list() for (flavor in c("v1", "v2", "v3", "v4")) { betaTN <- normalizeTumorBoost(betaT=betaT, betaN=betaN, preserveScale=FALSE, flavor=flavor) # Assert that no non-finite values are introduced stopifnot(all(is.finite(betaTN))) # Assert that nothing is flipped stopifnot(all(betaTN[isAA] < 1/2)) stopifnot(all(betaTN[isBB] > 1/2)) betaTNs[[flavor]] <- betaTN } # Plot layout(matrix(1:4, ncol=1)) par(mar=c(2.5,4,0.5,1)+0.1) ylim <- c(-0.05, 1.05) col <- rep("#999999", length(muN)) col[muN == 1/2] <- "#000000" for (flavor in names(betaTNs)) { betaTN <- betaTNs[[flavor]] ylab <- sprintf("betaTN[%s]", flavor) plot(pos, betaTN, col=col, ylim=ylim, ylab=ylab) } aroma.light/tests/normalizeTumorBoost.R0000644000175000017500000000154714136047216020147 0ustar nileshnileshlibrary("aroma.light") library("R.utils") # Load data pathname <- system.file("data-ex/TumorBoost,fracB,exampleData.Rbin", package="aroma.light") data <- loadObject(pathname) attachLocally(data) pos <- position/1e6 muN <- genotypeN layout(matrix(1:4, ncol=1)) par(mar=c(2.5,4,0.5,1)+0.1) ylim <- c(-0.05, 1.05) col <- rep("#999999", length(muN)) col[muN == 1/2] <- "#000000" # Allele B fractions for the normal sample plot(pos, betaN, col=col, ylim=ylim) # Allele B fractions for the tumor sample plot(pos, betaT, col=col, ylim=ylim) # TumorBoost w/ naive genotype calls betaTN <- normalizeTumorBoost(betaT=betaT, betaN=betaN, preserveScale=FALSE) plot(pos, betaTN, col=col, ylim=ylim) # TumorBoost w/ external multi-sample genotype calls betaTNx <- normalizeTumorBoost(betaT=betaT, betaN=betaN, muN=muN, preserveScale=FALSE) plot(pos, betaTNx, col=col, ylim=ylim) aroma.light/tests/normalizeQuantileSpline.matrix.R0000644000175000017500000000144514136047216022267 0ustar nileshnileshlibrary("aroma.light") # Simulate three samples with on average 20% missing values N <- 10000 X <- cbind(rnorm(N, mean=3, sd=1), rnorm(N, mean=4, sd=2), rgamma(N, shape=2, rate=1)) X[sample(3*N, size=0.20*3*N)] <- NA_real_ # Plot the data layout(matrix(c(1,0,2:5), ncol=2, byrow=TRUE)) xlim <- range(X, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions") Xn <- normalizeQuantile(X) plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions") plotXYCurve(X, Xn, xlim=xlim, main="The three normalized distributions") Xn2 <- normalizeQuantileSpline(X, xTarget=Xn[,1], spar=0.99) plotDensity(Xn2, lwd=2, xlim=xlim, main="The three normalized distributions") plotXYCurve(X, Xn2, xlim=xlim, main="The three normalized distributions") aroma.light/tests/distanceBetweenLines.R0000644000175000017500000000505414136047216020205 0ustar nileshnileshlibrary("aroma.light") for (zzz in 0) { # This example requires plot3d() in R.basic [http://www.braju.com/R/] if (!require(pkgName <- "R.basic", character.only=TRUE)) break layout(matrix(1:4, nrow=2, ncol=2, byrow=TRUE)) ############################################################ # Lines in two-dimensions ############################################################ x <- list(a=c(1,0), b=c(1,2)) y <- list(a=c(0,2), b=c(1,1)) fit <- distanceBetweenLines(ax=x$a, bx=x$b, ay=y$a, by=y$b) xlim <- ylim <- c(-1,8) plot(NA, xlab="", ylab="", xlim=ylim, ylim=ylim) # Highlight the offset coordinates for both lines points(t(x$a), pch="+", col="red") text(t(x$a), label=expression(a[x]), adj=c(-1,0.5)) points(t(y$a), pch="+", col="blue") text(t(y$a), label=expression(a[y]), adj=c(-1,0.5)) v <- c(-1,1)*10 xv <- list(x=x$a[1]+x$b[1]*v, y=x$a[2]+x$b[2]*v) yv <- list(x=y$a[1]+y$b[1]*v, y=y$a[2]+y$b[2]*v) lines(xv, col="red") lines(yv, col="blue") points(t(fit$xs), cex=2.0, col="red") text(t(fit$xs), label=expression(x(s)), adj=c(+2,0.5)) points(t(fit$yt), cex=1.5, col="blue") text(t(fit$yt), label=expression(y(t)), adj=c(-1,0.5)) print(fit) ############################################################ # Lines in three-dimensions ############################################################ x <- list(a=c(0,0,0), b=c(1,1,1)) # The 'diagonal' y <- list(a=c(2,1,2), b=c(2,1,3)) # A 'fitted' line fit <- distanceBetweenLines(ax=x$a, bx=x$b, ay=y$a, by=y$b) xlim <- ylim <- zlim <- c(-1,3) dummy <- t(c(1,1,1))*100 # Coordinates for the lines in 3d v <- seq(-10,10, by=1) xv <- list(x=x$a[1]+x$b[1]*v, y=x$a[2]+x$b[2]*v, z=x$a[3]+x$b[3]*v) yv <- list(x=y$a[1]+y$b[1]*v, y=y$a[2]+y$b[2]*v, z=y$a[3]+y$b[3]*v) for (theta in seq(30,140,length.out=3)) { plot3d(dummy, theta=theta, phi=30, xlab="", ylab="", zlab="", xlim=ylim, ylim=ylim, zlim=zlim) # Highlight the offset coordinates for both lines points3d(t(x$a), pch="+", col="red") text3d(t(x$a), label=expression(a[x]), adj=c(-1,0.5)) points3d(t(y$a), pch="+", col="blue") text3d(t(y$a), label=expression(a[y]), adj=c(-1,0.5)) # Draw the lines lines3d(xv, col="red") lines3d(yv, col="blue") # Draw the two points that are closest to each other points3d(t(fit$xs), cex=2.0, col="red") text3d(t(fit$xs), label=expression(x(s)), adj=c(+2,0.5)) points3d(t(fit$yt), cex=1.5, col="blue") text3d(t(fit$yt), label=expression(y(t)), adj=c(-1,0.5)) # Draw the distance between the two points lines3d(rbind(fit$xs,fit$yt), col="purple", lwd=2) } print(fit) } # for (zzz in 0) rm(zzz) aroma.light/tests/backtransformPrincipalCurve.matrix.R0000644000175000017500000000667514136047216023126 0ustar nileshnileshlibrary("aroma.light") # Consider the case where K=4 measurements have been done # for the same underlying signals 'x'. The different measurements # have different systematic variation # # y_k = f(x_k) + eps_k; k = 1,...,K. # # In this example, we assume non-linear measurement functions # # f(x) = a + b*x + x^c + eps(b*x) # # where 'a' is an offset, 'b' a scale factor, and 'c' an exponential. # We also assume heteroscedastic zero-mean noise with standard # deviation proportional to the rescaled underlying signal 'x'. # # Furthermore, we assume that measurements k=2 and k=3 undergo the # same transformation, which may illustrate that the come from # the same batch. However, when *fitting* the model below we # will assume they are independent. # Transforms a <- c(2, 15, 15, 3) b <- c(2, 3, 3, 4) c <- c(1, 2, 2, 1/2) K <- length(a) # The true signal N <- 1000 x <- rexp(N) # The noise bX <- outer(b,x) E <- apply(bX, MARGIN=2, FUN=function(x) rnorm(K, mean=0, sd=0.1*x)) # The transformed signals with noise Xc <- t(sapply(c, FUN=function(c) x^c)) Y <- a + bX + Xc + E Y <- t(Y) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit principal curve # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit principal curve through Y = (y_1, y_2, ..., y_K) fit <- fitPrincipalCurve(Y) # Flip direction of 'lambda'? rho <- cor(fit$lambda, Y[,1], use="complete.obs") flip <- (rho < 0) if (flip) { fit$lambda <- max(fit$lambda, na.rm=TRUE)-fit$lambda } L <- ncol(fit$s) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Backtransform data according to model fit # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Backtransform toward the principal curve (the "common scale") YN1 <- backtransformPrincipalCurve(Y, fit=fit) stopifnot(ncol(YN1) == K) # Backtransform toward the first dimension YN2 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=1) stopifnot(ncol(YN2) == K) # Backtransform toward the last (fitted) dimension YN3 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=L) stopifnot(ncol(YN3) == K) # Backtransform toward the third dimension (dimension by dimension) # Note, this assumes that K == L. YN4 <- Y for (cc in 1:L) { YN4[,cc] <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=1, dimensions=cc) } stopifnot(identical(YN4, YN2)) # Backtransform a subset toward the first dimension # Note, this assumes that K == L. YN5 <- backtransformPrincipalCurve(Y, fit=fit, targetDimension=1, dimensions=2:3) stopifnot(identical(YN5, YN2[,2:3])) stopifnot(ncol(YN5) == 2) # Extract signals from measurement #2 and backtransform according # its model fit. Signals are standardized to target dimension 1. y6 <- Y[,2,drop=FALSE] yN6 <- backtransformPrincipalCurve(y6, fit=fit, dimensions=2, targetDimension=1) stopifnot(identical(yN6, YN2[,2,drop=FALSE])) stopifnot(ncol(yN6) == 1) # Extract signals from measurement #2 and backtransform according # the the model fit of measurement #3 (because we believe these # two have undergone very similar transformations. # Signals are standardized to target dimension 1. y7 <- Y[,2,drop=FALSE] yN7 <- backtransformPrincipalCurve(y7, fit=fit, dimensions=3, targetDimension=1) stopifnot(ncol(yN7) == 1) rho <- cor(yN7, yN6) print(rho) stopifnot(rho > 0.999) aroma.light/tests/fitXYCurve.matrix.R0000644000175000017500000000123514136047216017456 0ustar nileshnileshlibrary("aroma.light") # Simulate data from the model y <- a + bx + x^c + eps(bx) x <- rexp(1000) a <- c(2,15) b <- c(2,1) c <- c(1,2) bx <- outer(b,x) xc <- t(sapply(c, FUN=function(c) x^c)) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x)) Y <- a + bx + xc + eps Y <- t(Y) lim <- c(0,70) plot(Y, xlim=lim, ylim=lim) # Fit principal curve through a subset of (y_1, y_2) subset <- sample(nrow(Y), size=0.3*nrow(Y)) fit <- fitXYCurve(Y[subset,], bandwidth=0.2) lines(fit, col="red", lwd=2) # Backtransform (y_1, y_2) keeping y_1 unchanged YN <- backtransformXYCurve(Y, fit=fit) points(YN, col="blue") abline(a=0, b=1, col="red", lwd=2) aroma.light/tests/normalizeCurveFit.matrix.R0000644000175000017500000000712314136047216021060 0ustar nileshnileshlibrary("aroma.light") pathname <- system.file("data-ex", "PMT-RGData.dat", package="aroma.light") rg <- read.table(pathname, header=TRUE, sep="\t") nbrOfScans <- max(rg$slide) rg <- as.list(rg) for (field in c("R", "G")) rg[[field]] <- matrix(as.double(rg[[field]]), ncol=nbrOfScans) rg$slide <- rg$spot <- NULL rg <- as.matrix(as.data.frame(rg)) colnames(rg) <- rep(c("R", "G"), each=nbrOfScans) layout(matrix(c(1,2,0,3,4,0,5,6,7), ncol=3, byrow=TRUE)) rgC <- rg for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) channelColor <- switch(channel, R="red", G="green") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The raw data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plotMvsAPairs(rg[,sidx]) title(main=paste("Observed", channel)) box(col=channelColor) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The calibrated data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgC[,sidx] <- calibrateMultiscan(rg[,sidx], average=NULL) plotMvsAPairs(rgC[,sidx]) title(main=paste("Calibrated", channel)) box(col=channelColor) } # for (channel ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The average calibrated data # # Note how the red signals are weaker than the green. The reason # for this can be that the scale factor in the green channel is # greater than in the red channel, but it can also be that there # is a remaining relative difference in bias between the green # and the red channel, a bias that precedes the scanning. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgCA <- rg for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) rgCA[,sidx] <- calibrateMultiscan(rg[,sidx]) } rgCAavg <- matrix(NA_real_, nrow=nrow(rgCA), ncol=2) colnames(rgCAavg) <- c("R", "G") for (channel in c("R", "G")) { sidx <- which(colnames(rg) == channel) rgCAavg[,channel] <- apply(rgCA[,sidx], MARGIN=1, FUN=median, na.rm=TRUE) } # Add some "fake" outliers outliers <- 1:600 rgCAavg[outliers,"G"] <- 50000 plotMvsA(rgCAavg) title(main="Average calibrated (AC)") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Normalize data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Weight-down outliers when normalizing weights <- rep(1, nrow(rgCAavg)) weights[outliers] <- 0.001 # Affine normalization of channels rgCANa <- normalizeAffine(rgCAavg, weights=weights) # It is always ok to rescale the affine normalized data if its # done on (R,G); not on (A,M)! However, this is only needed for # esthetic purposes. rgCANa <- rgCANa *2^1.4 plotMvsA(rgCANa) title(main="Normalized AC") # Curve-fit (lowess) normalization rgCANlw <- normalizeLowess(rgCAavg, weights=weights) plotMvsA(rgCANlw, col="orange", add=TRUE) # Curve-fit (loess) normalization rgCANl <- normalizeLoess(rgCAavg, weights=weights) plotMvsA(rgCANl, col="red", add=TRUE) # Curve-fit (robust spline) normalization rgCANrs <- normalizeRobustSpline(rgCAavg, weights=weights) plotMvsA(rgCANrs, col="blue", add=TRUE) legend(x=0,y=16, legend=c("affine", "lowess", "loess", "r. spline"), pch=19, col=c("black", "orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n") plotMvsMPairs(cbind(rgCANa, rgCANlw), col="orange", xlab=expression(M[affine])) title(main="Normalized AC") plotMvsMPairs(cbind(rgCANa, rgCANl), col="red", add=TRUE) plotMvsMPairs(cbind(rgCANa, rgCANrs), col="blue", add=TRUE) abline(a=0, b=1, lty=2) legend(x=-6,y=6, legend=c("lowess", "loess", "r. spline"), pch=19, col=c("orange", "red", "blue"), ncol=2, x.intersp=0.3, bty="n") aroma.light/tests/backtransformAffine.matrix.R0000644000175000017500000000224414136047216021354 0ustar nileshnileshlibrary("aroma.light") X <- matrix(1:8, nrow=4, ncol=2) X[2,2] <- NA_integer_ print(X) # Returns a 4x2 matrix print(backtransformAffine(X, a=c(1,5))) # Returns a 4x2 matrix print(backtransformAffine(X, b=c(1,1/2))) # Returns a 4x2 matrix print(backtransformAffine(X, a=matrix(1:4,ncol=1))) # Returns a 4x2 matrix print(backtransformAffine(X, a=matrix(1:3,ncol=1))) # Returns a 4x2 matrix print(backtransformAffine(X, a=matrix(1:2,ncol=1), b=c(1,2))) # Returns a 4x1 matrix print(backtransformAffine(X, b=c(1,1/2), project=TRUE)) # If the columns of X are identical, and a identity # backtransformation is applied and projected, the # same matrix is returned. X <- matrix(1:4, nrow=4, ncol=3) Y <- backtransformAffine(X, b=c(1,1,1), project=TRUE) print(X) print(Y) stopifnot(sum(X[,1]-Y) <= .Machine$double.eps) # If the columns of X are identical, and a identity # backtransformation is applied and projected, the # same matrix is returned. X <- matrix(1:4, nrow=4, ncol=3) X[,2] <- X[,2]*2; X[,3] <- X[,3]*3 print(X) Y <- backtransformAffine(X, b=c(1,2,3)) print(Y) Y <- backtransformAffine(X, b=c(1,2,3), project=TRUE) print(Y) stopifnot(sum(X[,1]-Y) <= .Machine$double.eps) aroma.light/tests/sampleTuples.R0000644000175000017500000000041414136047216016557 0ustar nileshnileshlibrary("aroma.light") pairs <- sampleTuples(1:10, size=5, length=2) print(pairs) triples <- sampleTuples(1:10, size=5, length=3) print(triples) # Allow tuples with repeated elements quadruples <- sampleTuples(1:3, size=5, length=4, replace=TRUE) print(quadruples) aroma.light/tests/normalizeQuantileRank.matrix.R0000644000175000017500000000101514136047216021721 0ustar nileshnileshlibrary("aroma.light") # Simulate three samples with on average 20% missing values N <- 10000 X <- cbind(rnorm(N, mean=3, sd=1), rnorm(N, mean=4, sd=2), rgamma(N, shape=2, rate=1)) X[sample(3*N, size=0.20*3*N)] <- NA_real_ # Normalize quantiles Xn <- normalizeQuantile(X) # Plot the data layout(matrix(1:2, ncol=1)) xlim <- range(X, Xn, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The three original distributions") plotDensity(Xn, lwd=2, xlim=xlim, main="The three normalized distributions") aroma.light/tests/iwpca.matrix.R0000644000175000017500000000410614136047216016511 0ustar nileshnileshlibrary("aroma.light") for (zzz in 0) { # This example requires plot3d() in R.basic [http://www.braju.com/R/] if (!require(pkgName <- "R.basic", character.only=TRUE)) break # Simulate data from the model y <- a + bx + eps(bx) x <- rexp(1000) a <- c(2,15,3) b <- c(2,3,4) bx <- outer(b,x) eps <- apply(bx, MARGIN=2, FUN=function(x) rnorm(length(x), mean=0, sd=0.1*x)) y <- a + bx + eps y <- t(y) # Add some outliers by permuting the dimensions for 1/10 of the observations idx <- sample(1:nrow(y), size=1/10*nrow(y)) y[idx,] <- y[idx,c(2,3,1)] # Plot the data with fitted lines at four different view points opar <- par(mar=c(1,1,1,1)+0.1) N <- 4 layout(matrix(1:N, nrow=2, byrow=TRUE)) theta <- seq(0,270,length.out=N) phi <- rep(20, length.out=N) xlim <- ylim <- zlim <- c(0,45) persp <- list() for (kk in seq_along(theta)) { # Plot the data persp[[kk]] <- plot3d(y, theta=theta[kk], phi=phi[kk], xlim=xlim, ylim=ylim, zlim=zlim) } # Weights on the observations # Example a: Equal weights w <- NULL # Example b: More weight on the outliers (uncomment to test) w <- rep(1, length(x)); w[idx] <- 0.8 # ...and show all iterations too with different colors. maxIter <- c(seq(1,20,length.out=10),Inf) col <- topo.colors(length(maxIter)) # Show the fitted value for every iteration for (ii in seq_along(maxIter)) { # Fit a line using IWPCA through data fit <- iwpca(y, w=w, maxIter=maxIter[ii], swapDirections=TRUE) ymid <- fit$xMean d0 <- apply(y, MARGIN=2, FUN=min) - ymid d1 <- apply(y, MARGIN=2, FUN=max) - ymid b <- fit$vt[1,] y0 <- -b * max(abs(d0)) y1 <- b * max(abs(d1)) yline <- matrix(c(y0,y1), nrow=length(b), ncol=2) yline <- yline + ymid for (kk in seq_along(theta)) { # Set pane to draw in par(mfg=c((kk-1) %/% 2, (kk-1) %% 2) + 1) # Set the viewpoint of the pane options(persp.matrix=persp[[kk]]) # Get the first principal component points3d(t(ymid), col=col[ii]) lines3d(t(yline), col=col[ii]) # Highlight the last one if (ii == length(maxIter)) lines3d(t(yline), col="red", lwd=3) } } par(opar) } # for (zzz in 0) rm(zzz) aroma.light/tests/normalizeAverage.list.R0000644000175000017500000000147514136047216020356 0ustar nileshnileshlibrary("aroma.light") # Simulate ten samples of different lengths N <- 10000 X <- list() for (kk in 1:8) { rfcn <- list(rnorm, rgamma)[[sample(2, size=1)]] size <- runif(1, min=0.3, max=1) a <- rgamma(1, shape=20, rate=10) b <- rgamma(1, shape=10, rate=10) values <- rfcn(size*N, a, b) # "Censor" values values[values < 0 | values > 8] <- NA_real_ X[[kk]] <- values } # Add 20% missing values X <- lapply(X, FUN=function(x) { x[sample(length(x), size=0.20*length(x))] <- NA_real_ x }) # Normalize quantiles Xn <- normalizeAverage(X, na.rm=TRUE, targetAvg=median(unlist(X), na.rm=TRUE)) # Plot the data layout(matrix(1:2, ncol=1)) xlim <- range(X, Xn, na.rm=TRUE) plotDensity(X, lwd=2, xlim=xlim, main="The original distributions") plotDensity(Xn, lwd=2, xlim=xlim, main="The normalized distributions") aroma.light/tests/medianPolish.matrix.R0000644000175000017500000000102714136047216020021 0ustar nileshnileshlibrary("aroma.light") # Deaths from sport parachuting; from ABC of EDA, p.224: deaths <- matrix(c(14,15,14, 7,4,7, 8,2,10, 15,9,10, 0,2,0), ncol=3, byrow=TRUE) rownames(deaths) <- c("1-24", "25-74", "75-199", "200++", "NA") colnames(deaths) <- 1973:1975 print(deaths) mp <- medianPolish(deaths) mp1 <- medpolish(deaths, trace=FALSE) print(mp) ff <- c("overall", "row", "col", "residuals") stopifnot(all.equal(mp[ff], mp1[ff])) # Validate decomposition: stopifnot(all.equal(deaths, mp$overall+outer(mp$row,mp$col,"+")+mp$resid)) aroma.light/.Rinstignore0000644000175000017500000000041514136047216015121 0ustar nileshnileshdoc/Makefile$ # Certain LaTeX files (e.g. bib, bst, sty) must be part of the build # such that they are available for R CMD check. These are excluded # from the install using .Rinstignore in the top-level directory # such as this one. doc/.*[.](bib|bst|sty)$ aroma.light/R/0000755000175000017500000000000014136047216013016 5ustar nileshnilesharoma.light/R/normalizeQuantileSpline.R0000644000175000017500000001734214136047216020026 0ustar nileshnilesh###########################################################################/** # @RdocGeneric normalizeQuantileSpline # @alias normalizeQuantileSpline.numeric # @alias normalizeQuantileSpline.matrix # @alias normalizeQuantileSpline.list # # @title "Normalizes the empirical distribution of one or more samples to a target distribution" # # \usage{ # @usage normalizeQuantileSpline,numeric # @usage normalizeQuantileSpline,matrix # @usage normalizeQuantileSpline,list # } # # \description{ # @get "title". # After normalization, all samples have the same average empirical # density distribution. # } # # \arguments{ # \item{x, X}{A single (\eqn{K=1}) @numeric @vector of length \eqn{N}, # a @numeric \eqn{NxK} @matrix, or a @list of length \eqn{K} with # @numeric @vectors, where \eqn{K} represents the number of samples # and \eqn{N} the number of data points.} # \item{w}{An optional @numeric @vector of length \eqn{N} of weights # specific to each data point.} # \item{xTarget}{The target empirical distribution as a \emph{sorted} # @numeric @vector of length \eqn{M}. # If @NULL and \code{X} is a @list, then the target distribution is # calculated as the average empirical distribution of the samples.} # \item{sortTarget}{If @TRUE, argument \code{xTarget} will be sorted, # otherwise it is assumed to be already sorted.} # \item{robust}{If @TRUE, the normalization function is # estimated robustly.} # \item{...}{Arguments passed to (@see "stats::smooth.spline" # or @see "aroma.light::robustSmoothSpline").} # } # # \value{ # Returns an object of the same type and dimensions as the input. # } # # \section{Missing values}{ # Both argument \code{X} and \code{xTarget} may contain non-finite values. # These values do not affect the estimation of the normalization function. # Missing values and other non-finite values in \code{X}, # remain in the output as is. No new missing values are introduced. # } # # @examples "../incl/normalizeQuantileSpline.matrix.Rex" # # @author "HB" # # \seealso{ # The target distribution can be calculated as the average # using @see "averageQuantile". # # Internally either # @see "aroma.light::robustSmoothSpline" (\code{robust=TRUE}) or # @see "stats::smooth.spline" (\code{robust=FALSE}) is used. # # An alternative normalization method that is also normalizing the # empirical densities of samples is @see "normalizeQuantileRank". # Contrary to this method, that method requires that all samples are # based on the exact same set of data points and it is also more likely # to over-correct in the tails of the distributions. # } # # \references{ # [1] @include "../incl/BengtssonH_etal_2008.bib.Rdoc" \cr # } # # @keyword "nonparametric" # @keyword "multivariate" # @keyword "robust" #*/########################################################################### setMethodS3("normalizeQuantileSpline", "list", function(X, w=NULL, xTarget=NULL, sortTarget=TRUE, robust=TRUE, ...) { # Argument 'xTarget': if (is.null(xTarget)) { # Get the target quantile for all channels? xTarget <- averageQuantile(X); sortTarget <- FALSE; } else if (!is.numeric(xTarget)) { throw("Argument 'xTarget' is not numeric: ", mode(xTarget)); } # Sort target distribution? if (sortTarget) { xTarget <- sort(xTarget, na.last=TRUE); } # Normalizes the data nTarget <- length(xTarget); X <- lapply(X, FUN=function(x) { normalizeQuantileSpline(x, w=w, xTarget=xTarget, sortTarget=FALSE, robust=TRUE, ...); }) X; }) setMethodS3("normalizeQuantileSpline", "matrix", function(X, w=NULL, xTarget=NULL, sortTarget=TRUE, robust=TRUE, ...) { # Argument 'xTarget': if (is.null(xTarget)) { # Get the target quantile for all channels? xTarget <- averageQuantile(X); sortTarget <- FALSE; } else if (!is.numeric(xTarget)) { throw("Argument 'xTarget' is not numeric: ", mode(xTarget)); } if (length(xTarget) != nrow(X)) { throw("Argument 'xTarget' is of different length than the number of rows in 'X': ", length(xTarget) , " != ", nrow(X)); } # Sort target distribution? if (sortTarget) { xTarget <- sort(xTarget, na.last=TRUE); } # Normalize each of the columns towards the target distribution for (cc in seq_len(ncol(X))) { X[,cc] <- normalizeQuantileSpline(X[,cc], w=w, xTarget=xTarget, sortTarget=FALSE, robust=robust, ...); } X; }) # normalizeQuantileSpline.matrix() setMethodS3("normalizeQuantileSpline", "numeric", function(x, w=NULL, xTarget, sortTarget=TRUE, robust=TRUE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - n <- length(x); # Argument 'w': if (!is.null(w)) { if (!is.numeric(w)) { throw("Argument 'w' is not numeric: ", mode(w)); } if (length(w) != n) { throw("Argument 'w' is of different length than 'x': ", length(w), " != ", n); } } # Argument 'xTarget': if (!is.numeric(xTarget)) { throw("Argument 'xTarget' is not numeric: ", mode(xTarget)); } if (length(xTarget) != n) { throw("Argument 'xTarget' is of different length than 'x': ", length(xTarget), " != ", n); } # Sort target distribution? if (sortTarget) { xTarget <- sort(xTarget, na.last=TRUE); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # A) Fit normalization function # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Sort signals (w/ weights) to be normalized o <- order(x, na.last=TRUE); xx <- x[o]; if (!is.null(w)) w <- w[o]; # Not needed anymore o <- NULL; # Keep only finite values ok <- (is.finite(xx) & is.finite(xTarget)); # Exclude data points with zero weight if (!is.null(w)) ok <- (ok & w > 0); xx <- xx[ok]; if (!is.null(w)) w <- w[ok]; xTarget <- xTarget[ok]; # Not needed anymore ok <- NULL; if (robust) { # robustSmoothSpline() does not return 'data'. fit <- robustSmoothSpline(x=xx, w=w, y=xTarget, ...); } else { # smooth.spline() returns 'data' by default. fit <- smooth.spline(x=xx, w=w, y=xTarget, keep.data=FALSE, ...); } # Not needed anymore xx <- xTarget <- NULL; # Not needed below fit[c("x", "y", "w", "yin", "call")] <- NULL; # Saves < 1MB, though. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # B) Normalize the data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ok <- is.finite(x); x[ok] <- predict(fit, x=x[ok])$y; x; }) # normalizeQuantileSpline.numeric() ############################################################################## # HISTORY: # 2013-10-08 # o SPEEDUP: Now normalizeQuantileSpline(..., sortTarget=TRUE) sorts the # target only once for lists of vectors just as done for matrices. # 2013-10-07 # o normalizeQuantileSpline() for list:s gained explicit argument 'w', # 'sortTarget' and 'robust'. # 2013-05-25 # o SPEEDUP: Removed all gc() calls. # 2008-04-14 # o Added normalizeQuantileSpline() for list:s, which works analogously as # normalizeQuantileRank() for list:s. # 2007-03-28 # o BUG FIX: Weights 'w' are now correctly ordered. # o BUG FIX: Due to an incorrect if(), TRUE & FALSE was swapped for 'robust'. # o Memory optimization; now the fitting is not keeping the data. # o Renamed argument 'sort' to 'sortTarget'. # 2007-03-22 # o Updated the Rdocs slightly. # 2007-02-05 # o Now normalizeQuantileSpline() handles NAs too. # 2007-02-04 # o Created from normalizeQuantile.numeric.R. ############################################################################## aroma.light/R/rowAverages.matrix.R0000644000175000017500000000317414136047216016736 0ustar nileshnileshsetMethodS3("rowAverages", "matrix", function(X, average=base::mean, deviance=stats::sd, df=function(x, ...) length(if(na.rm) na.omit(x) else x), na.rm=TRUE, ..., asAttributes=TRUE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'X' if (!is.matrix(X)) stop(paste("Argument 'X' is not a matrix: ", class(X)[1])); # Argument: '...', 'average', and 'deviance'. args <- list(...); args[["average"]] <- average; args[["deviance"]] <- deviance; args[["df"]] <- df; for (kk in seq_along(args)) { key <- names(args)[kk]; arg <- args[[kk]]; if (!is.null(arg) && !is.function(arg)) stop(paste("Argument '", key, "' must be a function: ", mode(arg))); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Calculate the average and the deviance # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - stats <- list(); for (kk in seq_along(args)) { key <- names(args)[kk]; arg <- args[[kk]]; stats[[key]] <- as.matrix(apply(X, MARGIN=1, FUN=arg, na.rm=na.rm)); } if (asAttributes) { attrs <- attributes(X); X <- stats[["average"]]; stats[["average"]] <- NULL; mostattributes(X) <- c(stats, attrs); X; } else { stats; } }) # rowAverages() ############################################################################ # HISTORY: # o 2004-05-17 # Recreated. Made into its own function. This is need by *many* methods. ############################################################################ aroma.light/R/normalizeDifferencesToAverage.R0000644000175000017500000000471014136047216021077 0ustar nileshnilesh###########################################################################/** # @RdocGeneric normalizeDifferencesToAverage # @alias normalizeDifferencesToAverage.list # # @title "Rescales channel vectors to get the same average" # # \description{ # @get "title". # } # # \usage{ # @usage normalizeDifferencesToAverage,list # } # # \arguments{ # \item{x}{A @numeric @list of length K.} # \item{baseline}{An @integer in [1,K] specifying which channel should be # the baseline. The baseline channel will be almost unchanged. # If @NULL, the channels will be shifted towards median of them all.} # \item{FUN}{A @function for calculating the average of one channel.} # \item{...}{Additional arguments passed to the \code{avg} @function.} # } # # \value{ # Returns a normalized @list of length K. # } # # @examples "../incl/normalizeDifferencesToAverage.Rex" # # @author "HB" #*/########################################################################### setMethodS3("normalizeDifferencesToAverage", "list", function(x, baseline=1, FUN=median, ...) { # Argument 'x': if (!is.list(x)) { throw("Argument 'x' is not a list: ", class(x)[1]); } # Number dimensions ndim <- length(x); # Argument 'baseline': if (!is.null(baseline)) { baseline <- as.integer(baseline); if (baseline < 1 && baseline > ndim) { throw(sprintf("Argument 'baseline' is out of range [1,%d]: %d", ndim, baseline)); } } # Calculate the overall average level for each dimension mus <- sapply(x, FUN=function(y) { y <- y[is.finite(y)]; FUN(y); }); # Estimate the overall target level if (is.null(baseline)) { targetMu <- mus[baseline]; } else { targetMu <- median(mus, na.rm=TRUE); } # Calculate the required overall shifts per dimension deltas <- mus - targetMu; # Shift all dimensions so that all have the same overall average xN <- mapply(x, as.list(deltas), FUN=function(y, dy) { y <- y - dy; list(y); }); # Return estimated parameters fit <- list(mus=mus, baseline=baseline, targetMu=targetMu, deltas=deltas); attr(xN, "fit") <- fit; xN; }) ############################################################################ # HISTORY: # 2010-04-04 # o Made the code independent of R.utils::Arguments. # 2009-09-30 # o Created from the source of an aroma.tcga vignette from May 2009. ############################################################################ aroma.light/R/plotMvsAPairs.R0000644000175000017500000000500114136047216015701 0ustar nileshnilesh#########################################################################/** # @RdocGeneric plotMvsAPairs # @alias plotMvsAPairs.matrix # # @title "Plot log-ratios/log-intensities for all unique pairs of data vectors" # # \description{ # @get "title". # } # # \usage{ # @usage plotMvsAPairs,matrix # } # # \arguments{ # \item{X}{NxK @matrix where N is the number of observations and # K is the number of channels.} # \item{Alab,Mlab}{Labels on the x and y axes.} # \item{Alim,Mlim}{Plot range on the A and M axes.} # \item{pch}{Plot symbol used.} # \item{...}{Additional arguments accepted by @see "graphics::points".} # \item{add}{If @TRUE, data points are plotted in the current plot, # otherwise a new plot is created.} # } # # \details{ # Log-ratios and log-intensities are calculated for each neighboring pair # of channels (columns) and plotted. Thus, in total there will be K-1 # data set plotted. # # The colors used for the plotted pairs are 1, 2, and so on. To change # the colors, use a different color palette. # } # # \value{ # Returns nothing. # } # # @author "HB" #*/######################################################################### setMethodS3("plotMvsAPairs", "matrix", function(X, Alab="A", Mlab="M", Alim=c(0,16), Mlim=c(-1,1)*diff(Alim), pch=".", ..., add=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X' if (ncol(X) < 2) throw("Argument 'X' must have at least two columns: ", ncol(X)); if (!add) { plot(NA, xlab=Alab, ylab=Mlab, xlim=Alim, ylim=Mlim); } nbrOfChannels <- ncol(X); # Do not plot (or generate false) M vs A for non-positive signals. X[X <= 0] <- NA; col <- 1; for (ii in 1:(nbrOfChannels-1)) { Xii <- as.double(X[,ii]); for (jj in (ii+1):nbrOfChannels) { Xjj <- as.double(X[,jj]); M <- log(Xii/Xjj, base=2); A <- log(Xii*Xjj, base=2)/2; points(A,M, pch=pch, col=col, ...); col <- col + 1; } } }) # plotMvsAPairs() ############################################################################ # HISTORY: # 2005-09-06 # o Coercing to doubles to avoid overflow when multiplying to integers. # o Now non-positive signals are excluded. # 2005-06-03 # o Now using arguments 'Alab' and 'Mlab' instead of 'xlab' and 'ylab'. # Same for 'Alim' and 'Mlim'. # 2005-04-07 # o Created Rdoc comments. ############################################################################# aroma.light/R/fitIWPCA.R0000644000175000017500000003550214136047216014514 0ustar nileshnilesh########################################################################/** # @RdocGeneric fitIWPCA # @alias fitIWPCA.matrix # # @title "Robust fit of linear subspace through multidimensional data" # # \description{ # @get "title". # } # # \usage{ # @usage fitIWPCA,matrix # } # # \arguments{ # \item{X}{NxK @matrix where N is the number of observations and # K is the number of dimensions (channels). # } # # \item{constraint}{A @character string or a @numeric value. # If @character it specifies which additional constraint to be used # to specify the offset parameters along the fitted line; # # If \code{"diagonal"}, the offset vector will be a point on the line # that is closest to the diagonal line (1,...,1). # With this constraint, all bias parameters are identifiable. # # If \code{"baseline"} (requires argument \code{baselineChannel}), the # estimates are such that of the bias and scale parameters of the # baseline channel is 0 and 1, respectively. # With this constraint, all bias parameters are identifiable. # # If \code{"max"}, the offset vector will the point on the line that is # as "great" as possible, but still such that each of its components is # less than the corresponding minimal signal. This will guarantee that # no negative signals are created in the backward transformation. # If @numeric value, the offset vector will the point on the line # such that after applying the backward transformation there are # \code{constraint*N}. Note that \code{constraint==0} corresponds # approximately to \code{constraint=="max"}. # With the latter two constraints, the bias parameters are only # identifiable modulo the fitted line. # } # # \item{baselineChannel}{Index of channel toward which all other # channels are conform. # This argument is required if \code{constraint=="baseline"}. # This argument is optional if \code{constraint=="diagonal"} and # then the scale factor of the baseline channel will be one. The # estimate of the bias parameters is not affected in this case. # Defaults to one, if missing. # } # # \item{...}{Additional arguments accepted by @see "iwpca". # For instance, a N @vector of weights for each observation may be # given, otherwise they get the same weight. # } # # \item{aShift, Xmin}{For internal use only.} # } # # \value{ # Returns a @list that contains estimated parameters and algorithm # details; # # \item{a}{A @double @vector \eqn{(a[1],...,a[K])}with offset # parameter estimates. # It is made identifiable according to argument \code{constraint}. # } # \item{b}{A @double @vector \eqn{(b[1],...,b[K])}with scale # parameter estimates. It is made identifiable by constraining # \code{b[baselineChannel] == 1}. # These estimates are independent of argument \code{constraint}. # } # \item{adiag}{If identifiability constraint \code{"diagonal"}, # a @double @vector \eqn{(adiag[1],...,adiag[K])}, where # \eqn{adiag[1] = adiag[2] = ... adiag[K]}, specifying the point # on the diagonal line that is closest to the fitted line, # otherwise the zero vector. # } # \item{eigen}{A KxK @matrix with columns of eigenvectors. # } # \item{converged}{@TRUE if the algorithm converged, otherwise @FALSE. # } # \item{nbrOfIterations}{The number of iterations for the algorithm # to converge, or zero if it did not converge. # } # # \item{t0}{Internal parameter estimates, which contains no more # information than the above listed elements. # } # \item{t}{Always @NULL.} # } # # \details{ # This method uses re-weighted principal component analysis (IWPCA) # to fit a the model \eqn{y_n = a + bx_n + eps_n} where \eqn{y_n}, # \eqn{a}, \eqn{b}, and \eqn{eps_n} are vector of the K and \eqn{x_n} # is a scalar. # # The algorithm is: # For iteration i: # 1) Fit a line \eqn{L} through the data close using weighted PCA # with weights \eqn{\{w_n\}}. Let # \eqn{r_n = \{r_{n,1},...,r_{n,K}\}} # be the \eqn{K} principal components. # 2) Update the weights as # \eqn{w_n <- 1 / \sum_{2}^{K} (r_{n,k} + \epsilon_r)} # where we have used the residuals of all but the first principal # component. # 3) Find the point a on \eqn{L} that is closest to the # line \eqn{D=(1,1,...,1)}. Similarly, denote the point on D that is # closest to \eqn{L} by \eqn{t=a*(1,1,...,1)}. # } # # @author # # %examples "fitMultiIWPCA.matrix.Rex" # # \seealso{ # This is an internal method used by the @see "calibrateMultiscan" # and @see "normalizeAffine" methods. # Internally the function @see "iwpca" is used to fit a line # through the data cloud and the function @see "distanceBetweenLines" to # find the closest point to the diagonal (1,1,...,1). # } # # @keyword "algebra" #*/######################################################################## setMethodS3("fitIWPCA", "matrix", function(X, constraint=c("diagonal", "baseline", "max"), baselineChannel=NULL, ..., aShift=rep(0, times=ncol(X)), Xmin=NULL) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 0. Define local functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - statistic <- function(X, ..., constraint="diagonal", Xmin=NULL, baselineChannel=1, aShift=rep(0, times=ncol(X))) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit an K-dimensional line through the data using iterative # re-weighted PCA. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fit <- iwpca(X, ...); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Get the fitted line L # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Get the center of the fitted line... ax <- fit$xMean; names(ax) <- NULL; # ...and the fitted eigenvectors (u1,u2,...,uK) # with ui*uj = 0; i!=j and ui*ui = 1. U <- t(fit$vt); colnames(U) <- rownames(U) <- NULL; # The fitted scale parameters b=(b[1],b[2],...,b[K]) where # the elements are rescaled such that b[1] == 1. # [ min(b[i]) == 1. Before it was such that b[1] == 1, but this # is probably better. ] # [ Indeed not; this is not good if one do more than one estimate per # array, e.g. printtip etc. /HB 2004-04-26 ] # [ With the introduction of 'baselineChannel' it is possible to # specify which channel should get scale one. / HB 2004-06-30 ] U1 <- U[,1]; bx <- as.vector(U1/U1[baselineChannel]); # Shift the data. # [ This is for instance useful if fitting towards the diagonal line # and resampling under H0: y_i = alpha + z_i and /HB 2004-01-02 ] ax <- ax + aShift; if (identical(constraint, "diagonal")) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Find the point t on the fitted line that is closest to the # points s on the "diagonal" line (1,1,...,1) in K-space. # [This works also for lines in two dimension.] # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # x(s) is the fitted line (the first IWPCA component) # y(t) is the diagonal line ay <- rep(0, times=length(ax)); # (0,0,...,0) by <- rep(1, times=length(ay)); # (1,1,...,1) dbl <- distanceBetweenLines(ax=ax,bx=bx, ay=ay,by=by); a <- as.vector(dbl$xs); adiag <- as.vector(dbl$yt); } else if (identical(constraint, "baseline")) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Find the point t on the fitted line for which the bias parameter of # the baseline channel is zero, i.e. for which a[baselineChannel]==0. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # The scale parameters are already such that b[baselineChannel]==1. # y[c,i] = a[c] + b[c]*x[c,i] ; c = 1,...,C # y[b,i] = a[b] + x[b,i] ; b - baseline channel # Similar to the constraint=="max" reasoning: # For channel b, find t such that # ax[b] + bx[b]*t == 0 <=> { bx[b]==1 } <=> t = -ax[b] # => a[c] <- ax[c] + bx[c]*t <=> a[c] <- ax[c] - bx[c]*ax[b] a <- ax - bx*ax[baselineChannel]; adiag <- rep(0, times=length(ax)); } else if (identical(constraint, "max")) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Find the "greatest" point t on the fitted line that is within # the cube C whose upper limits are defined by the minimum value # in each channel. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Find the minimal value of each X component. if (is.null(Xmin)) Xmin <- colMins(X, na.rm=TRUE); # For each component k, find the value t such that # ax[k] + bx[k]*t[k] == Xmin[k] <=> t[k] == (Xmin[k] - ax[k])/bx[k] t <- (Xmin-ax)/bx; # Choose minimum t[k] # Now, amax <<= Xmin if amax <- ax - bx[k]*min(t) where <<= (\prec) # means componentswise less or equal than. a <- ax + bx*min(t); adiag <- rep(0, times=length(ax)); } else if (is.numeric(constraint)) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Find the "greatest" point t on the fitted line that is within # the cube C whose upper limits are defined by the alpha quantile # value in each channel. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Find the alpha quantile value of each X component. if (is.null(Xmin)) { Xmin <- colQuantiles(X, probs=constraint, na.rm=TRUE); } # For each component k, find the value t such that # ax[k] + bx[k]*t[k] == Xmin[k] <=> t[k] == (Xmin[k] - ax[k])/bx[k] t <- (Xmin-ax)/bx; # Choose minimum t[k] # Now, amax <<= Xmin if amax <- ax - bx[k]*min(t) where <<= (\prec) # means componentswise less or equal than. a <- ax + bx*min(t); adiag <- rep(0, times=length(ax)); } # Return the statistic t <- c(a=a); t <- c(t, b=bx); t <- c(t, adiag=adiag); t <- c(t, U=as.vector(U)); t <- c(t, niter=fit$nbrOfIterations * (fit$converged*2-1)); t; } # statistic() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'X' if (!is.matrix(X)) stop("Argument 'X' must be a matrix:", mode(X)); N <- nrow(X); K <- ncol(X); if (K == 1) { stop("Argument 'X' must have two or more columns:", K); } if (N < K) { stop("Argument 'X' must have at least as many rows as columns:", N, "<", K); } # Argument: 'constraint' if (is.numeric(constraint)) { if (length(constraint) != 1) stop("Argument 'constraint' can not be a numerical vector."); if (constraint < 0 || constraint > 1) stop("Invalid value of argument 'constraint':", constraint); } else { constraint <- match.arg(constraint); if (identical(constraint, "baseline")) { if (is.null(baselineChannel)) { stop("Argument 'baselineChannel' must be given if 'constraint' is \"baseline\"."); } } } # Argument: 'baselineChannel' if (!is.null(baselineChannel)) { if (!is.numeric(baselineChannel) || length(baselineChannel) != 1) { stop("Argument 'baselineChannel' must be a single numeric: ", baselineChannel); } if (baselineChannel < 1 || baselineChannel > ncol(X)) { stop("Argument 'baselineChannel' is out of range [1,", ncol(X),"]: ", baselineChannel); } if (!(constraint %in% c("baseline", "diagonal"))) { stop("Argument 'baselineChannel' must not be specified if argument 'constraint' is \"baseline\" or \"diagonal\": ", constraint); } if (!is.null(Xmin)) { stop("Argument 'Xmin' must not be specified if 'baselineChannel' is specified: ", paste(Xmin, collapse=", ")); } } else { baselineChannel <- 1; } # Argument: 'aShift' if (is.null(aShift)) { aShift <- rep(0, times=ncol(X)); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Prepare the data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (identical(constraint, "max")) { Xmin <- colMins(X, na.rm=TRUE); } else { Xmin <- NULL; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. Fit the model # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Use only finite observations isFinite <- apply(X, MARGIN=1L, FUN=function(r) all(is.finite(r))); # Number of finite observations N <- sum(isFinite); # Validate the number of finite observations if (N < K) { stop("Argument 'X' must have at least as many non-finite observations (rows) as columns:", N, "<", K); } t0 <- statistic(X[isFinite,], constraint=constraint, Xmin=Xmin, baselineChannel=baselineChannel, aShift=aShift, ...); t <- NULL; # Extract the parameter estimates from the internal estimation vector. a <- t0[regexpr("^a[0-9]*$", names(t0)) != -1]; b <- t0[regexpr("^b[0-9]*$", names(t0)) != -1]; adiag <- t0[regexpr("^adiag[0-9]*$", names(t0)) != -1]; U <- t0[regexpr("^U[0-9]*$", names(t0)) != -1]; U <- matrix(U, nrow=sqrt(length(U))); niter <- as.integer(abs(t0["niter"])); converged <- (niter > 0); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 5. Return the parameter estimates # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - list(a=a, b=b, adiag=adiag, eigen=U, converged=converged, nbrOfIterations=niter, t0=t0, t=t); }) # fitIWPCA() ########################################################################### # HISTORY: # 2013-09-26 # o Now utilizing colMins() and colQuantiles() of 'matrixStats'. # 2011-02-05 # o DOCUMENTATION: Fixed broken links to help for iwpca(). # 2006-01-22 # o Added Rdoc help on the returned parameters. # o If missing, 'baselineChannel' is now set to one before calling the # internal function. # o Now fitIWPCA() does not return the data matrix. This is to save memory. # The calling algorithm can equally well add the data if it is needed. # 2004-06-30 # o Added argument 'baselineChannel' with 'constraint' "baseline". This # is useful for instance when normalizing toward a common reference. In # such cases, the common-reference channel is unaffected and only the # other channel(s) is affinely transformed. # 2004-06-28 # o BUG FIX: Forgot to exclude non-finite observations when fitting the # iwpca(). This was done before, but somehow it disappeared while # re-organizing the code. ########################################################################### aroma.light/R/normalizeAffine.R0000644000175000017500000002252114136047216016254 0ustar nileshnilesh#########################################################################/** # @RdocGeneric normalizeAffine # @alias normalizeAffine.matrix # # \encoding{latin1} # # @title "Weighted affine normalization between channels and arrays" # # \description{ # @get "title". # # This method will remove curvature in the M vs A plots that are # due to an affine transformation of the data. In other words, if there # are (small or large) biases in the different (red or green) channels, # biases that can be equal too, you will get curvature in the M vs A plots # and this type of curvature will be removed by this normalization method. # # Moreover, if you normalize all slides at once, this method will also # bring the signals on the same scale such that the log-ratios for # different slides are comparable. Thus, do not normalize the scale of # the log-ratios between slides afterward. # # It is recommended to normalize as many slides as possible in one run. # The result is that if creating log-ratios between any channels and any # slides, they will contain as little curvature as possible. # # Furthermore, since the relative scale between any two channels on any # two slides will be one if one normalizes all slides (and channels) at # once it is possible to add or multiply with the \emph{same} constant # to all channels/arrays without introducing curvature. Thus, it is # easy to rescale the data afterwards as demonstrated in the example. # } # # \usage{ # @usage normalizeAffine,matrix # } # # \arguments{ # \item{X}{An NxK @matrix (K>=2) where the columns represent the channels, # to be normalized.} # \item{weights}{If @NULL, non-weighted normalization is done. # If data-point weights are used, this should be a @vector of length # N of data point weights used when estimating the normalization # function. # } # \item{typeOfWeights}{A @character string specifying the type of # weights given in argument \code{weights}. # } # \item{method}{A @character string specifying how the estimates are # robustified. See @see "iwpca" for all accepted values.} # \item{constraint}{Constraint making the bias parameters identifiable. # See @see "fitIWPCA" for more details.} # \item{satSignal}{Signals equal to or above this threshold will not # be used in the fitting.} # \item{...}{Other arguments passed to @see "fitIWPCA" and in # turn @see "iwpca". For example, the weight argument # of @see "iwpca". See also below.} # \item{.fitOnly}{If @TRUE, the data will not be back-transform.} # } # # \value{ # A NxK @matrix of the normalized channels. # The fitted model is returned as attribute \code{modelFit}. # } # # \section{Negative, non-positive, and saturated values}{ # Affine normalization applies equally well to negative values. Thus, # contrary to normalization methods applied to log-ratios, such as curve-fit # normalization methods, affine normalization, will not set these to @NA. # # Data points that are saturated in one or more channels are not used # to estimate the normalization function, but they are normalized. # } # # \section{Missing values}{ # The estimation of the affine normalization function will only be made # based on complete non-saturated observations, i.e. observations that # contains no @NA values nor saturated values as defined by \code{satSignal}. # } # # \section{Weighted normalization}{ # Each data point/observation, that is, each row in \code{X}, which is a # vector of length K, can be assigned a weight in [0,1] specifying how much # it should \emph{affect the fitting of the affine normalization function}. # Weights are given by argument \code{weights}, # which should be a @numeric @vector of length N. Regardless of weights, # all data points are \emph{normalized} based on the fitted normalization # function. # } # # \section{Robustness}{ # By default, the model fit of affine normalization is done in \eqn{L_1} # (\code{method="L1"}). This way, outliers affect the parameter estimates # less than ordinary least-square methods. # # For further robustness, downweight outliers such as saturated signals, # if possible. # # We do not use Tukey's biweight function for reasons similar to those # outlined in @see "calibrateMultiscan". # } # # \section{Using known/previously estimated channel offsets}{ # If the channel offsets can be assumed to be known, then it is # possible to fit the affine model with no (zero) offset, which # formally is a linear (proportional) model, by specifying # argument \code{center=FALSE}. # In order to do this, the channel offsets have to be subtracted # from the signals manually before normalizing, e.g. # \code{Xa <- t(t(X)-a)} where \code{e} is @vector of length # \code{ncol(X)}. Then normalize by # \code{Xn <- normalizeAffine(Xa, center=FALSE)}. # You can assert that the model is fitted without offset by # \code{stopifnot(all(attr(Xn, "modelFit")$adiag == 0))}. # } # # \details{ # A line is fitted robustly through the \eqn{(y_R,y_G)} observations # using an iterated re-weighted principal component analysis (IWPCA), # which minimized the residuals that are orthogonal to the fitted line. # Each observation is down-weighted by the inverse of the absolute # residuals, i.e. the fit is done in \eqn{L_1}. # } # # @author # # \references{ # [1] @include "../incl/BengtssonHossjer_2006.bib.Rdoc" \cr # } # # @examples "../incl/normalizeCurveFit.matrix.Rex" # # \seealso{ # @see "calibrateMultiscan". # } #*/######################################################################### setMethodS3("normalizeAffine", "matrix", function(X, weights=NULL, typeOfWeights=c("datapoint"), method="L1", constraint=0.05, satSignal=2^16-1, ..., .fitOnly=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'X' if (ncol(X) < 2) stop("Affine normalization requires at least two channels: ", ncol(X)); if (nrow(X) < 3) stop("Affine normalization requires at least three observations: ", nrow(X)); # Argument: 'satSignal' if (satSignal < 0) stop("Argument 'satSignal' is negative: ", satSignal); # Argument: 'typeOfWeights' typeOfWeights <- match.arg(typeOfWeights); # Argument: 'weights' datapointWeights <- NULL; if (!is.null(weights)) { # If 'weights' is an object of a class with as.double(), cast it. weights <- as.double(weights); if (anyMissing(weights)) stop("Argument 'weights' must not contain NA values."); if (any(weights < 0 | weights > 1)) { stop("Argument 'weights' out of range [0,1]: ", paste(weights[weights < 0.0 | weights > 1.0], collapse=", ")); } weights <- as.vector(weights); if (length(weights) == 1) { weights <- rep(weights, length.out=nrow(X)); } else if (length(weights) != nrow(X)) { stop("Argument 'weights' does not have the same length as the number of data points (rows9 in the matrix: ", length(weights), " != ", nrow(X)); } datapointWeights <- weights; } # Argument: 'method' # Validate by fitIWPCA() -> iwpca() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Prepare data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Use only non-saturated observations to estimate the normalization # function (non-finite values are taken care of by fitIWPCA()). isSaturated <- (is.finite(X) & X >= satSignal); Xsat <- X[isSaturated]; X[isSaturated] <- NA; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. Fit the model # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fit <- fitIWPCA(X, w=datapointWeights, method=method, constraint=constraint, ...); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 4. Backtransform # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - X[isSaturated] <- Xsat; # Not needed anymore isSaturated <- Xsat <- NULL; if (.fitOnly == FALSE) { X <- backtransformAffine(X, a=fit); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 5. Return the backtransformed data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - attr(X, "modelFit") <- fit; X; }) # normalizeAffine() ############################################################################ # HISTORY: # 2013-09-26 # o Now utilizing anyMissing(). # 2011-02-05 # o DOCUMENTATION: Added section on how to normalize when channel offsets # are supposed to be known/zero. # o DOCUMENTATION: Fixed broken links to help for iwpca(). # 2005-06-03 # o Added argument 'typeOfWeights' to make it similar to other normalization # methods, although only "datapoint" weights are allowed. # 2005-02-27 # o Passes argument 'methods' to fitIWPCA() now. # 2005-02-02 # o BUG FIX: isSaturated could contain NA. # 2005-02-01 # o Added argument '.fitOnly'. # o Added validation of argument 'weights'. # 2005-01-24 # o Added argument 'weights' (instead of passing 'w' to fitIWPCA()). # o Now, saturated functions are normalized, but just not used when # estimating the normalization function. # 2005-01-23 # o Updated the Rdoc comments and error messages. # 2004-12-28 # o Added Rdoc comments on weights. # 2004-06-28 # o BUG FIX: Missing braces in Rdoc comments. ############################################################################ aroma.light/R/backtransformPrincipalCurve.R0000644000175000017500000001517214136047216020652 0ustar nileshnilesh#########################################################################/** # @RdocGeneric backtransformPrincipalCurve # @alias backtransformPrincipalCurve.numeric # @alias backtransformPrincipalCurve.matrix # # @title "Reverse transformation of principal-curve fit" # # \description{ # @get "title". # } # # \usage{ # @usage backtransformPrincipalCurve,matrix # @usage backtransformPrincipalCurve,numeric # } # # \arguments{ # \item{X}{An NxK @matrix containing data to be backtransformed.} # \item{fit}{An MxL principal-curve fit object of class # \code{principal_curve} as returned by @see "fitPrincipalCurve". # Typically \eqn{L = K}, but not always. # } # \item{dimensions}{An (optional) subset of of D dimensions all in [1,L] # to be returned (and backtransform).} # \item{targetDimension}{An (optional) index specifying the dimension # in [1,L] to be used as the target dimension of the \code{fit}. # More details below.} # \item{...}{Passed internally to @see "stats::smooth.spline".} # } # # \value{ # The backtransformed NxK (or NxD) @matrix. # } # # \details{ # Each column in X ("dimension") is backtransformed independently # of the others. # } # # \section{Target dimension}{ # By default, the backtransform is such that afterward the signals are # approximately proportional to the (first) principal curve as fitted # by @see "fitPrincipalCurve". This scale and origin of this # principal curve is not uniquely defined. # If \code{targetDimension} is specified, then the backtransformed signals # are approximately proportional to the signals of the target dimension, # and the signals in the target dimension are unchanged. # } # # \section{Subsetting dimensions}{ # Argument \code{dimensions} can be used to backtransform a subset of # dimensions (K) based on a subset of the fitted dimensions (L). # If \eqn{K = L}, then both \code{X} and \code{fit} is subsetted. # If \eqn{K <> L}, then it is assumed that \code{X} is already # subsetted/expanded and only \code{fit} is subsetted. # } # # @examples "../incl/backtransformPrincipalCurve.matrix.Rex" # # \seealso{ # @see "fitPrincipalCurve" # } #*/######################################################################### setMethodS3("backtransformPrincipalCurve", "matrix", function(X, fit, dimensions=NULL, targetDimension=NULL, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X' if (!is.numeric(X)) { stop("Argument 'X' is not numeric: ", mode(X)); } dimnamesX <- dimnames(X); dimX <- dim(X); K <- dimX[2]; if (!is.matrix(X)) { X <- as.matrix(X); } # Argument 'fit' if (!inherits(fit, "principal_curve")) { stop("Argument 'fit' is not a principal_curve object: ", class(fit)[1]); } # Argument 'dimensions' dimS <- dim(fit$s); L <- dimS[2]; if (!is.null(dimensions)) { dimensions <- as.integer(dimensions); if (any(dimensions < 1 | dimensions > L)) { stop("Argument 'dimensions' contains values out of range [1,", L, "]"); } } # Argument 'targetDimension': if (!is.null(targetDimension)) { targetDimension <- as.integer(targetDimension); if (length(targetDimension) != 1L) { stop("Argument 'targetDimension' should be a scalar or NULL."); } if (targetDimension < 1L | targetDimension > L) { stop("Argument 'targetDimension' is out of range [1,", L, "]: ", targetDimension); } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Transform towards a target dimension? # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - hasTargetDimension <- (!is.null(targetDimension)); if (hasTargetDimension) { lambda <- fit$s[,targetDimension]; } else { lambda <- fit$lambda; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subset dimensions? # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - s <- fit$s; if (!is.null(dimensions)) { s <- s[,dimensions,drop=FALSE]; if (K == L) { X <- X[,dimensions,drop=FALSE]; dimX <- dim(X); dimnamesX <- dimnames(X); } dimS <- dim(s); L <- dimS[2]; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Find backtransformations and backtransform data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - naValue <- NA; mode(naValue) <- mode(X); Xhat <- matrix(naValue, nrow=dimX[1], ncol=dimX[2]); okLambda <- is.finite(lambda); for (kk in seq_len(L)) { sKK <- s[,kk]; ok <- (is.finite(sKK) & okLambda); fitKK <- smooth.spline(sKK[ok], lambda[ok], ...); Xkk <- X[,kk]; keep <- which(is.finite(Xkk)); Xkk <- Xkk[keep]; XhatKK <- predict(fitKK, x=Xkk)$y; # Sanity check stopifnot(length(XhatKK) == length(keep)); Xhat[keep,kk] <- XhatKK; } # Not needed anymore sKK <- lambda <- fitKK <- XhatKK <- keep <- s <- NULL; dim(Xhat) <- dimX; dimnames(Xhat) <- dimnamesX; Xhat; }) # backtransformPrincipalCurve() setMethodS3("backtransformPrincipalCurve", "numeric", function(X, ...) { X <- as.matrix(X); backtransformPrincipalCurve(X, ...); }) ########################################################################### # HISTORY: # 2013-04-18 # o BUG FIX: backtransformPrincipalCurve() gave an error if the # pricipal curve was fitted using data with missing values. # Now backtransformPrincipalCurve() preserves dimension names. # 2009-05-29 # o BUG FIX: Previous bug fix in backtransformPrincipalCurve() regarding # argument 'dimension' broke the initial purpose of this argument. Since # both use cases are still of interest, how the subsetting is done is now # based on whether the number of dimensions of the input data and the # model fit match or not. See help(backtransformPrincipalCurve.matrix). # Added several cases to the example code for testing this. # o Added more Rdoc comments. # 2009-05-12 # o BUG FIX: backtransformPrincipalCurve(..., dimensions) did not subset # the 'X' matrix. Also, the method now returns a matrix of the same # number of columns requested. The Rd example now illustrates this. # Thanks to Pierre Neuvial, UC Berkeley for the troublshooting and fix. # 2009-02-08 # o An error was thrown in backtransformPrincipalCurve() if argument # 'dimensions' was specified. # o BUG FIX: # 2009-01-12 # o Updated validation of arguments such that it does not require R.utils. # 2008-10-08 # o Added argument 'targetDimension' to backtransformPrincipalCurve(). # 2008-10-07 # o Created. ########################################################################### aroma.light/R/callNaiveGenotypes.R0000644000175000017500000001573114136047216016744 0ustar nileshnilesh###########################################################################/** # @RdocGeneric callNaiveGenotypes # @alias callNaiveGenotypes.numeric # # @title "Calls genotypes in a normal sample" # # \description{ # @get "title". # } # # \usage{ # @usage callNaiveGenotypes,numeric # } # # \arguments{ # \item{y}{A @numeric @vector of length J containing allele B fractions # for a normal sample.} # \item{cn}{An optional @numeric @vector of length J specifying the true # total copy number in \eqn{\{0,1,2,NA\}} at each locus. This can be # used to specify which loci are diploid and which are not, e.g. # autosomal and sex chromosome copy numbers.} # \item{...}{Additional arguments passed to @see "fitNaiveGenotypes".} # \item{modelFit}{A optional model fit as returned # by @see "fitNaiveGenotypes".} # \item{verbose}{A @logical or a @see "R.utils::Verbose" object.} # } # # \value{ # Returns a @numeric @vector of length J containing the genotype calls # in allele B fraction space, that is, in [0,1] where 1/2 corresponds # to a heterozygous call, and 0 and 1 corresponds to homozygous A # and B, respectively. # Non called genotypes have value @NA. # } # # @examples "../incl/callNaiveGenotypes.Rex" # # \section{Missing and non-finite values}{ # A missing value always gives a missing (@NA) genotype call. # Negative infinity (-@Inf) always gives genotype call 0. # Positive infinity (+@Inf) always gives genotype call 1. # } # # @author # # \seealso{ # Internally @see "fitNaiveGenotypes" is used to identify the thresholds. # } #*/########################################################################### setMethodS3("callNaiveGenotypes", "numeric", function(y, cn=rep(2L, times=length(y)), ..., modelFit=NULL, verbose=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'y': J <- length(y); y <- as.double(y); # Argument 'cn': cn <- as.integer(cn); if (length(cn) == 1L) { cn <- rep(cn, times=J); } else if (length(cn) != J) { stop("The length of argument 'cn' does not match 'y': ", length(cn), " != ", J); } uniqueCNs <- sort(unique(cn)); unknown <- which(!is.element(uniqueCNs, c(0,1,2,NA))); if (length(unknown) > 0L) { unknown <- paste(uniqueCNs[unknown], collapse=", "); stop("Argument 'cn' contains unknown CN levels: ", unknown); } # Argument 'modelFit': if (!is.null(modelFit)) { if (!inherits(modelFit, "NaiveGenotypeModelFit")) { throw("Argument 'modelFit' is not of class NaiveGenotypeModelFit: ", class(modelFit)[1]); } } # Argument 'verbose': verbose <- Arguments$getVerbose(verbose); if (verbose) { pushState(verbose); on.exit(popState(verbose)); } verbose && enter(verbose, "Calling genotypes from allele B fractions (BAFs)"); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit naive genotype model? # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (is.null(modelFit)) { verbose && enter(verbose, "Fitting naive genotype model"); modelFit <- fitNaiveGenotypes(y=y, cn=cn, ..., verbose=verbose); verbose && print(verbose, modelFit); verbose && exit(verbose); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Call genotypes # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mu <- rep(NA_real_, times=J); # To please R CMD check type <- NULL; rm(list="type"); # Fitted CNs cns <- sapply(modelFit, FUN=function(fit) fit$cn); for (kk in seq_along(uniqueCNs)) { cnKK <- uniqueCNs[kk]; verbose && enter(verbose, sprintf("Copy number level #%d (C=%g) of %d", kk, cnKK, length(uniqueCNs))); # Special case if (cnKK == 0) { verbose && cat(verbose, "TCN=0 => BAF not defined. Skipping."); verbose && exit(verbose); next; } keep <- which(cn == cnKK); yKK <- y[keep]; idx <- which(cnKK == cns); if (length(idx) != 1L) { msg <- sprintf("Cannot call genotypes for %d loci with true total copy number %d, because the naive genotype model was not fit for such copy numbers. Skipping.", length(yKK), cnKK); verbose && cat(verbose, msg); verbose && exit(verbose); next; } fitKK <- modelFit[[idx]]; verbose && cat(verbose, "Model fit:"); verbose && print(verbose, fitKK); tau <- fitKK$tau; if (is.null(tau)) { # Backward compatibility fitValleys <- fitKK$fitValleys; verbose && cat(verbose, "Local minimas (\"valleys\") in BAF:"); verbose && print(verbose, fitValleys); tau <- fitValleys$x; # Not needed anymore fitValleys <- NULL; } verbose && printf(verbose, "Genotype threshholds [%d]: %s\n", length(tau), hpaste(tau)); # Call genotypes muKK <- rep(NA_real_, times=length(yKK)); if (cnKK == 1) { verbose && cat(verbose, "TCN=1 => BAF in {0,1}."); a <- tau[1]; verbose && printf(verbose, "Call regions: A = (-Inf,%.3f], B = (%.3f,+Inf)\n", a, a); muKK[yKK <= a] <- 0; muKK[a < yKK] <- 1; } else if (cnKK == 2) { verbose && cat(verbose, "TCN=2 => BAF in {0,1/2,1}."); a <- tau[1]; b <- tau[2]; verbose && printf(verbose, "Call regions: AA = (-Inf,%.3f], AB = (%.3f,%.3f], BB = (%.3f,+Inf)\n", a, a, b, b); muKK[yKK <= a] <- 0; muKK[a < yKK & yKK <= b] <- 1/2; muKK[b < yKK] <- 1; } else { verbose && printf(verbose, "TCN=%d => Skipping.\n", cnKK); } mu[keep] <- muKK; verbose && exit(verbose); } # for (kk ...) # Sanity check stopifnot(length(mu) == J); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Return genotype calls (and parameter estimates) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - attr(mu, "modelFit") <- modelFit; verbose && exit(verbose); mu; }) # callNaiveGenotypes() ########################################################################### # HISTORY: # 2012-04-16 # o CLEANUP: Dropped argument 'flavor' of callNaiveGenotypes(); it is # now passed to fitNaiveGenotypes() via '...'. # o GENERALIZATION: Now callNaiveGenotypes() no longer relies on 'modelFit' # to hold a 'fitValleys' element, but rather a 'tau' element. # 2010-10-14 # o TYPO FIX: Used name 'fitPeaks' instead of 'fitValleys'. # 2010-10-07 # o Now callNaiveGenotypes() utilizes fitNaiveGenotypes(). # o Added more detailed verbose to callNaiveGenotypes(). # 2010-07-23 # o Now callNaiveGenotypes() returns the model estimates as attribute # 'modelFit'. # 2010-04-04 # o Updated code such that R.utils::Verbose is optional. # o Corrected an Rdoc tag typo. # 2009-11-03 # o Added an example() to the Rd help of callNaiveGenotypes(). # 2009-07-08 # o BUG FIX: Was never tested. Now tested via example(normalizeTumorBoost). # 2009-07-06 # o Created from aroma.cn test script. ########################################################################### aroma.light/R/linearAlgebra.R0000644000175000017500000000136314136047216015674 0ustar nileshnilesh# The trace of matrix X tr <- function(X, na.rm=FALSE) { sum(diag(X), na.rm=na.rm); } # u and v are column vectors. scalarProduct <- function(u,v, na.rm=FALSE) { colSums(u*v, na.rm=na.rm); } # u are column vectors, v a single vector for now. projectUontoV <- function(u,v, na.rm=FALSE) { vN <- v / sqrt(sum(v^2, na.rm=na.rm)); sp <- scalarProduct(u,vN, na.rm=na.rm); sp <- rep(sp, each=length(vN)); sp <- matrix(sp, nrow=length(vN)); v * sp; } ############################################################################ # HISTORY: # 2005-01-24 # o Added arg. na.rm=FALSE to tr(), scalarProduct(), and projectUontoV(). # 2003-11-06 # o Created for readability. ############################################################################ aroma.light/R/000.R0000644000175000017500000000034614136047216013443 0ustar nileshnilesh## covr: skip=all ## Look for existing generic functions also in imported namespaces. ## This will affect whether setGenericS3() creates a generic function ## or not. options("R.methodsS3:checkImports:setGenericS3"=TRUE) aroma.light/R/normalizeFragmentLength.R0000644000175000017500000003456114136047216020000 0ustar nileshnilesh###########################################################################/** # @RdocDefault normalizeFragmentLength # # @title "Normalizes signals for PCR fragment-length effects" # # \description{ # @get "title". Some or all signals are used to estimated the # normalization function. All signals are normalized. # } # # @synopsis # # \arguments{ # \item{y}{A @numeric @vector of length K of signals to be normalized # across E enzymes.} # \item{fragmentLengths}{An @integer KxE @matrix of fragment lengths.} # \item{targetFcns}{An optional @list of E @functions; one per enzyme. # If @NULL, the data is normalized to have constant fragment-length # effects (all equal to zero on the log-scale).} # \item{subsetToFit}{The subset of data points used to fit the # normalization function. # If @NULL, all data points are considered.} # \item{onMissing}{Specifies how data points for which there is no # fragment length is normalized. # If \code{"ignore"}, the values are not modified. # If \code{"median"}, the values are updated to have the same # robust average as the other data points. # } # \item{.isLogged}{A @logical.} # \item{...}{Additional arguments passed to @see "stats::lowess".} # \item{.returnFit}{A @logical.} # } # # \value{ # Returns a @numeric @vector of the normalized signals. # } # # \section{Multi-enzyme normalization}{ # It is assumed that the fragment-length effects from multiple enzymes # added (with equal weights) on the intensity scale. # The fragment-length effects are fitted for each enzyme separately based # on units that are exclusively for that enzyme. # \emph{If there are no or very such units for an enzyme, the assumptions # of the model are not met and the fit will fail with an error.} # Then, from the above single-enzyme fits the average effect across # enzymes is the calculated for each unit that is on multiple enzymes. # } # # \section{Target functions}{ # It is possible to specify custom target function effects for each # enzyme via argument \code{targetFcns}. This argument has to be a # @list containing one @function per enzyme and ordered in the same # order as the enzyme are in the columns of argument # \code{fragmentLengths}. # For instance, if one wish to normalize the signals such that their # mean signal as a function of fragment length effect is constantly # equal to 2200 (or the intensity scale), the use # \code{targetFcns=function(fl, ...) log2(2200)} which completely # ignores fragment-length argument 'fl' and always returns a # constant. # If two enzymes are used, then use # \code{targetFcns=rep(list(function(fl, ...) log2(2200)), 2)}. # # Note, if \code{targetFcns} is @NULL, this corresponds to # \code{targetFcns=rep(list(function(fl, ...) 0), ncol(fragmentLengths))}. # # Alternatively, if one wants to only apply minimal corrections to # the signals, then one can normalize toward target functions that # correspond to the fragment-length effect of the average array. # } # # \examples{ # @include "../incl/normalizeFragmentLength-ex1.Rex" # # @include "../incl/normalizeFragmentLength-ex2.Rex" # } # # @author "HB" # # \references{ # [1] @include "../incl/BengtssonH_etal_2008.bib.Rdoc" \cr # } # # @keyword "nonparametric" # @keyword "robust" #*/########################################################################### setMethodS3("normalizeFragmentLength", "default", function(y, fragmentLengths, targetFcns=NULL, subsetToFit=NULL, onMissing=c("ignore", "median"), .isLogged=TRUE, ..., .returnFit=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'y': y <- as.double(y); nbrOfDataPoints <- length(y); okY <- is.finite(y); # Sanity check if (!any(okY, na.rm=TRUE)) { throw("Cannot fit normalization function to enzyme, because there are no (finite) data points in argument 'y'."); } # Argument 'fragmentLengths': if (!is.matrix(fragmentLengths)) { if (is.vector(fragmentLengths)) { fragmentLengths <- as.matrix(fragmentLengths); } else { throw("Argument 'fragmentLengths' must be a matrix: ", class(fragmentLengths)[[1]]); } } if (nrow(fragmentLengths) != nbrOfDataPoints) { throw("Number of rows in argument 'fragmentLengths' does not match the length of argument 'y': ", nrow(fragmentLengths), " != ", nbrOfDataPoints); } nbrOfEnzymes <- ncol(fragmentLengths); allEnzymes <- seq_len(nbrOfEnzymes); # Coerce to doubles for (ee in allEnzymes) { fragmentLengths[,ee] <- as.double(fragmentLengths[,ee]); } # Assert that there are some finite fragment lengths hasFL <- is.finite(fragmentLengths); if (!any(hasFL)) { throw("Cannot fit normalization function. Argument 'fragmentLengths' contains no finite values."); } # Assert that for each enzyme there exist some finite fragment lengths for (ee in allEnzymes) { if (sum(hasFL[,ee]) == 0) { throw(sprintf("Cannot fit normalization function to enzyme #%d, because there are no units with finite fragment lengths for this enzyme: ", ee)); } } # Count the number of enzymes per units countFL <- rep(0L, times=nbrOfDataPoints); for (ee in allEnzymes) { countFL <- countFL + as.integer(hasFL[,ee]); } # Assert that there are units from a single enzyme isSingleEnzymed <- (countFL == 1L); if (sum(isSingleEnzymed) == 0) { throw("Cannot fit normalization function, because none of the units are on fragments from a single enzyme, or equivalently, there exist no rows in argument 'fragmentLenghts' that only have one finite value."); } # Argument 'targetFcns': if (!is.null(targetFcns)) { if (!is.list(targetFcns)) { if (nbrOfEnzymes == 1L) { targetFcns <- list(targetFcns); } else { throw("Argument 'targetFcns' is not a list: ", class(targetFcns)[1]); } } if (length(targetFcns) != nbrOfEnzymes) { throw("Number of elements in 'targetFcns' does not match the number of columns in 'fragmentLengths': ", length(targetFcns), " != ", nbrOfEnzymes); } # Validate each element for (ee in allEnzymes) { if (!is.function(targetFcns[[ee]])) { throw("One element in 'targetFcns' is not a function: ", class(targetFcns[[ee]])[1]); } } } # Argument 'subsetToFit': if (!is.null(subsetToFit)) { subsetToFit <- as.integer(subsetToFit); if (length(subsetToFit) > nbrOfDataPoints) { throw("The length of argument 'subsetToFit' does not match the number of data points: ", length(subsetToFit), " != ", nbrOfDataPoints); } } # Argument 'onMissing': onMissing <- match.arg(onMissing); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Estimate normalization function and predict the signals # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit smooth curve to each enzyme separately # KxE matrix for sample (and target predictions) mu <- matrix(NA_real_, nrow=nbrOfDataPoints, ncol=nbrOfEnzymes); if (!is.null(targetFcns)) { muT <- matrix(NA_real_, nrow=nbrOfDataPoints, ncol=nbrOfEnzymes); } if (.returnFit) { fits <- vector("list", nbrOfEnzymes); } for (ee in allEnzymes) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # (a) Fit normalization function # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # (i) Fit only to units that are on fragments from a single (this) # enzyme and that there exist finite fragment lengths ok <- isSingleEnzymed & hasFL[,ee]; if (!any(ok)) { throw(sprintf("Cannot fit normalization function to enzyme #%d, because there are no units in argument 'fragmentLengths' that are unique to this enzyme and with finite fragment lengths: ", ee)); } # (ii) Fit only to units with non-missing data points. ok <- ok & okY; # Sanity check if (!any(ok)) { throw(sprintf("Cannot fit normalization function to enzyme #%d, because there are no units in argument 'fragmentLengths' that are unique to this enzyme and with finite fragment lengths and at the same time have finite values in argument 'y': ", ee)); } if (!is.null(subsetToFit)) { ok[-subsetToFit] <- FALSE; # Sanity check if (!any(ok)) { throw(sprintf("Cannot fit normalization function to enzyme #%d, because after subsetting there are no units in argument 'fragmentLengths' that are unique to this enzyme and with finite fragment lengths and at the same time have finite values in argument 'y': ", ee)); } } # All fragment lengths for current enzyme fl <- fragmentLengths[,ee]; # Fit finite {(lambda, log2theta)_j} to data points j on current enzyme suppressWarnings({ fit <- lowess(fl[ok], y[ok], ...); class(fit) <- "lowess"; }) # Not needed anymore ok <- NULL; if (.returnFit) fits[[ee]] <- fit; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # (b) Calculate correction factor # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Calculate the correction factor for every data point on this enzyme ok <- (hasFL[,ee] & okY); mu[ok,ee] <- predict(fit, newdata=fl[ok]); if (.returnFit) { fits[[ee]] <- list(fit=fit, mu=mu[,ee]); } # Normalize toward a target function? if (!is.null(targetFcns)) { muT[ok,ee] <- targetFcns[[ee]](fl[ok]); if (.returnFit) { fits[[ee]]$muT <- muT[,ee]; } } # Not needed anymore fit <- fl <- NULL; } # for (ee ...) # Not needed anymore hasFL <- isSingleEnzymed <- NULL; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Calculate the *average* predicted signal across enzymes # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Sum on the non-log scale. if (.isLogged) { mu <- 2^mu; if (!is.null(targetFcns)) muT <- 2^muT; } mu <- rowSums(mu, na.rm=TRUE); # mu <- mu / countFL; # Averaging (needed?!?) if (!is.null(targetFcns)) { muT <- rowSums(muT, na.rm=TRUE); # muT <- muT / countFL; # Averaging (needed?!?) } # Special case: Units with unknown fragment lengths if (onMissing != "ignore") { isMissing <- (countFL == 0); if (any(isMissing)) { if (onMissing == "median") { # Let the predicted value for these units be the robust average # of all other units (based on the assumption that the missing # fragment lengths are distributed as the known ones). # Identify the set to be used to estimate the target average ok <- (okY & !isMissing); # Sanity check if (!any(ok)) { throw("Cannot fit normalization function to loci with unknown fragment lengths, because there are no (finite) data points to be fitted."); } if (!is.null(subsetToFit)) { ok[-subsetToFit] <- FALSE; # Sanity check if (!any(ok)) { throw("Cannot fit normalization function to loci with unknown fragment lengths, because after subsetting there are no (finite) data points to be fitted."); } } # Substitute the predicted means with the median of the already # predicted set of loci. mu[isMissing] <- median(mu[ok], na.rm=TRUE); if (!is.null(targetFcns)) { muT[isMissing] <- median(muT[ok], na.rm=TRUE); } # Not needed anymore ok <- NULL; } # if (onMissing == "median") } # Not needed anymore isMissing <- NULL; } # Not needed anymore countFL <- NULL; if (.isLogged) { mu <- log2(mu); if (!is.null(targetFcns)) muT <- log2(muT); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Calculate the correction ("normalization") factor # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Calculate correction factors if (is.null(targetFcns)) { dy <- mu; } else { dy <- (mu - muT); } # Not needed anymore mu <- NULL; if (!is.null(targetFcns)) { # Not needed anymore muT <- NULL; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Normalize signals # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Transform signals ok <- is.finite(dy) & okY; # Not needed anymore okY <- NULL; y[ok] <- y[ok] - dy[ok]; if (.returnFit) { attr(y, "modelFit") <- fits; } y; }, private=TRUE) ############################################################################ # HISTORY: # 2010-09-18 # o ROBUSTNESS: Now normalizeFragmentLength() asserts that arguments # 'fragmentLengths' and 'y' contain at least some finite values and # specifies the same number of units. In addition, the method also # gives more informative error messages in case it cannot fit the # normalization function due to non-finite values. # 2008-09-11 # o Now onMissing="median" estimates the median on using the subset to fit. # 2008-09-10 # o Added argument 'onMissing' to normalizeFragmentLength() for specifying # how to normalize (if at all) data points for which the fragment lengths # are unknown. For backward compatibility, we start of by having it # "ignore" by default. # 2008-05-10 # o BUG FIX: If the 'subsetToFit' was shorter than the number of data # points, an exception was thrown. The test was supposed to be assert # that the subset was not greater than the number of data points. # 2008-04-14 # o Removed any usage of R.utils::Arguments. # 2007-11-29 # o BUG FIX: The implemented multi-enzyme model was not the one in mind; # The correction for the multi-enzyme data points was not right. # Have now created an updated example that displays the normalized # log-ratios (as a function of fragment length as well as they densities). # The example does also test the case for non-aliquot mixing proportions # between enzymes. This is actually automagically corrected for by the # way the model was set up, i.e. there is no need to estimate the # mixing proportions. # 2007-11-19 # o Added Rdoc examples. From these simulation examples, it looks like the # multi-enzyme normalization method works. # o Updated normalizeFragmentLength() to handle multiple enzymes. # 2006-11-28 # o Created. ############################################################################ aroma.light/R/iwpca.R0000644000175000017500000002223714136047216014252 0ustar nileshnilesh#########################################################################/** # @RdocGeneric iwpca # @alias iwpca.matrix # # @title "Fits an R-dimensional hyperplane using iterative re-weighted PCA" # # \description{ # @get "title". # } # # \usage{ # @usage iwpca,matrix # } # # \arguments{ # \item{X}{N-times-K @matrix where N is the number of observations and # K is the number of dimensions.} # \item{w}{An N @vector of weights for each row (observation) in # the data matrix. If @NULL, all observations get the same weight.} # \item{R}{Number of principal components to fit. By default a line # is fitted.} # \item{method}{ # If \code{"symmetric"} (or \code{"bisquare"}), Tukey's biweight # is used. If \code{"tricube"}, the tricube weight is used. # If \code{"L1"}, the model is fitted in \eqn{L_1}. # If a @function, it is used to calculate weights for next iteration # based on the current iteration's residuals.} # \item{maxIter}{Maximum number of iterations.} # \item{acc}{The (Euclidean) distance between two subsequent parameters # fit for which the algorithm is considered to have converged.} # \item{reps}{Small value to be added to the residuals before the # the weights are calculated based on their inverse. This is to avoid # infinite weights.} # \item{fit0}{A @list containing elements \code{vt} and \code{pc} # specifying an initial fit. # If @NULL, the initial guess will be equal to the (weighted) PCA fit.} # \item{...}{Additional arguments accepted by @see "wpca".} # } # # \value{ # Returns the fit (a @list) from the last call to @see "wpca" # with the additional elements \code{nbrOfIterations} and # \code{converged}. # } # # \details{ # This method uses weighted principal component analysis (WPCA) to fit a # R-dimensional hyperplane through the data with initial internal # weights all equal. # At each iteration the internal weights are recalculated based on # the "residuals". # If \code{method=="L1"}, the internal weights are 1 / sum(abs(r) + reps). # This is the same as \code{method=function(r) 1/sum(abs(r)+reps)}. # The "residuals" are orthogonal Euclidean distance of the principal # components R,R+1,...,K. # In each iteration before doing WPCA, the internal weighted are # multiplied by the weights given by argument \code{w}, if specified. # } # # @author # # @examples "../incl/iwpca.matrix.Rex" # # \seealso{ # Internally @see "wpca" is used for calculating the weighted PCA. # } # # @keyword "algebra" #*/######################################################################### setMethodS3("iwpca", "matrix", function(X, w=NULL, R=1, method=c("symmetric", "bisquare", "tricube", "L1"), maxIter=30, acc=1e-4, reps=0.02, fit0=NULL, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'w' if (!is.null(w)) w <- rep(w, length.out=nrow(X)); w0 <- w; # Argument: 'method' if (is.function(method)) { dummy <- method(1:5); if (!is.numeric(dummy)) stop("Argument 'method' (weight function) does not return numeric values."); if (!is.vector(dummy)) stop("Argument 'method' (weight function) does not return a vector."); if (length(dummy) != 5) stop("Argument 'method' (weight function) does not return the correct number of values."); } else { method <- match.arg(method); } # Argument: 'fit0' if (!is.null(fit0)) { if (!all(c("vt", "pc") %in% names(fit0))) { throw("Argument 'fit0' is missing element 'vt' or 'pc': ", paste(names(fit0), collapse=", ")); } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Fit the model # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ulast <- 1/.Machine$double.eps; # A large number iter <- 0; isConverged <- FALSE; w <- rep(1, length=nrow(X)); while (!isConverged && iter < maxIter) { if (iter > 0 || is.null(fit0)) { iter <- iter + 1; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # "Re-weight the weights" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (!is.null(w0)) w <- w0 * w; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Fit N-dimensional weighted PCA. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fit <- wpca(X, w=w, scale=FALSE, ...); } else { fit <- fit0; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Get the fitted line L # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Get fitted eigenvectors (u1,u2,...,uN) # with ui*uj = 0; i!=j and ui*ui = 1. U <- fit$vt; colnames(U) <- rownames(U) <- NULL; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Check for convergence # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - isConverged <- (sum(abs(U-Ulast))/length(U) < acc); Ulast <- U; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Finally, update the weights # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Residuals in the "tailing" dimensions. r <- fit$pc[,-c(1:R), drop=FALSE]; # Residuals in orthogonal Euclidean distance if (anyMissing(r)) { # Sometimes some residuals become NAs. r <- sqrt(rowSums(r^2, na.rm=TRUE)); } else { r <- sqrt(rowSums(r^2)); } # Down-weight points that are "far" away... if (is.character(method)) { if (method == "L1") { # Add small number to residuals to avoid infinite weights r <- abs(r) + reps; w <- 1/r; } else if (method %in% c("symmetric", "bisquare")) { # Add small number to residuals to avoid infinite weights r <- abs(r) + reps; r <- r/6; # Zero weights introduce NA's (for unknown reasons), therefore # with use a number very close to zero instead. w <- rep(.Machine$double.eps, times=length(r)); ii <- (r < 1); w[ii] <- (1-r[ii]^2)^2; # Not needed anymore ii <- NULL; } else if (method == "tricube") { # Add small number to residuals to avoid infinite weights r <- abs(r) + reps; r <- r/6; # Zero weights introduce NA's (for unknown reasons), therefore # with use a number very close to zero instead. w <- rep(.Machine$double.eps, times=length(r)); ii <- (r < 1); w[ii] <- (1-r[ii]^3)^3; # Not needed anymore ii <- NULL; } } else if (is.function(method)) { # Pass also the "fitted values" to the weight function. attr(r, "x") <- fit$pc[,1:R, drop=FALSE]; attr(r, "reps") <- reps; w <- method(r); # Combine w_i = ||w_{i,j}||_2 (Euclidean distance), if needed. if (is.matrix(w) && ncol(w) > 1) { w <- sqrt(rowSums(w^2)/ncol(w)); } else { w <- as.vector(w); } } # Sometimes some weights become NAs (not sure why). Set them to zero. if (anyMissing(w)) { w[is.na(w)] <- 0; } # Not needed anymore r <- NULL; } # while(...) fit$w <- w; fit$nbrOfIterations <- iter; fit$converged <- isConverged; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. Return the estimated parameters # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fit; }) # iwpca() ############################################################################ # HISTORY: # 2013-09-26 # o Now utilizing anyMissing(). # 2006-04-25 # o Updated the example to first plot data from all viewpoints, then just # the lines. Faster since the lines are only fitted once and nicer. # 2005-05-03 # o Now test of argument 'fit0' checks if it is NULL. # 2005-03-28 # o Second try with initial guess; added argument 'fit0'. # 2005-02-08 # o Added "symmetric" (now default) and "tricube" too. # 2005-02-07 # o Argument 'method' is now how the weights are calculated from the # residuals, not how residuals are combined across dimensions. # Method "L2" is therefore removed, because it corresponds to wpca(). # o Added support for weight functions via argument 'method'. The function # must take a matrix of residuals as the first argument. # 2004-05-14 # o Made into a method of class matrix instead of a stand-alone function. # 2004-04-18 # o Added support for weighted IWPCA; simply by weighing the weights. # 2004-03-09 # o Now making use of our own weighted PCA method instead of the # multidim::acp() method, which is not maintained anymore. # 2003-12-29 # o Generalized the method to fit a R-dimensional hyperplane instead of # just a line, which is the default fit. # 2003-12-28 # o Added to the R.basic package. # o Created by extracted code from RGData.fitMultiIWPCA(). ############################################################################ aroma.light/R/zzz.R0000644000175000017500000000062114136047216013775 0ustar nileshnilesh## covr: skip=all # Allows conflicts. For more information, see library() and # conflicts() in [R] base. .conflicts.OK <- TRUE .onLoad <- function(libname, pkgname) { ## covr: skip=3 ns <- getNamespace(pkgname); pkg <- Package(pkgname); assign(pkgname, pkg, envir=ns); } .onAttach <- function(libname, pkgname) { pkg <- get(pkgname, envir=getNamespace(pkgname)); startupMessage(pkg); } aroma.light/R/sampleCorrelations.matrix.R0000644000175000017500000000735514136047216020324 0ustar nileshnilesh#########################################################################/** # @RdocGeneric sampleCorrelations # @alias sampleCorrelations.matrix # # @title "Calculates the correlation for random pairs of observations" # # \description{ # @get "title". # } # # \usage{ # @usage sampleCorrelations,matrix # } # # \arguments{ # \item{X}{An NxK @matrix where N >= 2 and K >= 2.} # \item{MARGIN}{The dimension (1 or 2) in which the observations are. # If \code{MARGIN==1} (\code{==2}), each row (column) is an observation.} # \item{pairs}{If a Lx2 @matrix, the L index pairs for which the # correlations are calculated. # If @NULL, pairs of observations are sampled.} # \item{npairs}{The number of correlations to calculate.} # \item{...}{Not used.} # } # # \value{ # Returns a @double @vector of length \code{npairs}. # } # # @author "HB" # # @examples "../incl/sampleCorrelations.matrix.Rex" # # \seealso{ # @see "base::sample". # } # # \references{ # [1] A. Ploner, L. Miller, P. Hall, J. Bergh & Y. Pawitan. # \emph{Correlation test to assess low-level processing of high-density # oligonucleotide microarray data}. BMC Bioinformatics, 2005, vol 6. # } # # @keyword utilities #*/######################################################################### setMethodS3("sampleCorrelations", "matrix", function(X, MARGIN=1, pairs=NULL, npairs=max(5000, nrow(X)), ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Local functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - corFast <- function(x, y, ...) { ## .Internal() calls are no longer allowed. /HB 2012-04-16 ## # 3 == "pairwise.complete.obs" ## .Internal(cor(x, y, as.integer(3), FALSE)); cor(x=x, y=y, use="pairwise.complete.obs", method="pearson"); } # corFast() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X' if (!is.matrix(X)) throw("Argument 'X' must be a matrix: ", mode(X)); if (nrow(X) < 2) throw("Argument 'X' must have more than two rows."); if (ncol(X) < 2) throw("Argument 'X' must have more than two columns."); # Argument 'MARGIN' if (MARGIN < 1 || MARGIN > 2) throw("Argument 'MARGIN' is out of range [1,2]: ", MARGIN); # Argument 'npairs' if (npairs < 1) throw("Argument 'npairs' must be equal or greater than one: ", npairs); # Get row/column-index pairs to calculate correlations for. if (is.null(pairs)) { pairs <- sampleTuples(dim(X)[MARGIN], size=npairs, length=2); } else { npairs <- nrow(pairs); } # Are 'pairs' and 'npairs' consistent with each other? if (nrow(pairs) < npairs) { throw("The number of pairs in 'pairs' is smaller than 'npairs': ", nrow(pairs), " < ", npairs); } # Pre-create result vector to optimize speed (and memory) cors <- rep(NA_real_, times=npairs); if (MARGIN == 1) { for (kk in 1:npairs) { pair <- pairs[kk,]; x <- X[pair[1],]; y <- X[pair[2],]; cors[kk] <- corFast(x,y); } } else { for (kk in 1:npairs) { pair <- pairs[kk,]; x <- X[,pair[1]]; y <- X[,pair[2]]; cors[kk] <- corFast(x,y); } } cors; }) # sampleCorrelations() ############################################################################ # HISTORY: # 2012-04-16 # o sampleCorrelations() no longer utilizes .Internal() calls. # o Added internal corFast() to sampleCorrelations(). # 2011-04-12 # o Now using NAs of the correct storage type. # 2005-07-25 # o Added Rdoc comments with a simple example. # 2005-04-07 # o Created. ############################################################################ aroma.light/R/fitNaiveGenotypes.R0000644000175000017500000001726714136047216016621 0ustar nileshnilesh###########################################################################/** # @RdocGeneric fitNaiveGenotypes # @alias fitNaiveGenotypes.numeric # # @title "Fit naive genotype model from a normal sample" # # \description{ # @get "title". # } # # \usage{ # @usage fitNaiveGenotypes,numeric # } # # \arguments{ # \item{y}{A @numeric @vector of length J containing allele B fractions # for a normal sample.} # \item{cn}{An optional @numeric @vector of length J specifying the true # total copy number in \eqn{\{0,1,2,NA\}} at each locus. This can be # used to specify which loci are diploid and which are not, e.g. # autosomal and sex chromosome copy numbers.} # \item{subsetToFit}{An optional @integer or @logical @vector specifying # which loci should be used for estimating the model. # If @NULL, all loci are used.} # \item{flavor}{A @character string specifying the type of algorithm used.} # \item{adjust}{A positive @double specifying the amount smoothing for # the empirical density estimator.} # \item{...}{Additional arguments passed to @see "findPeaksAndValleys".} # \item{censorAt}{A @double @vector of length two specifying the range # for which values are considered finite. Values below (above) this # range are treated as -@Inf (+@Inf).} # \item{verbose}{A @logical or a @see "R.utils::Verbose" object.} # } # # \value{ # Returns a @list of @lists. # } # # @author # # \seealso{ # To call genotypes see @see "callNaiveGenotypes". # Internally @see "findPeaksAndValleys" is used to identify the thresholds. # } #*/########################################################################### setMethodS3("fitNaiveGenotypes", "numeric", function(y, cn=rep(2L, times=length(y)), subsetToFit=NULL, flavor=c("density", "fixed"), adjust=1.5, ..., censorAt=c(-0.1,1.1), verbose=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'y': J <- length(y); y <- as.double(y); # Argument 'cn': cn <- as.integer(cn); if (length(cn) == 1L) { cn <- rep(cn, times=J); } else if (length(cn) != J) { stop("The length of argument 'cn' does not match 'y': ", length(cn), " != ", J); } uniqueCNs <- sort(unique(cn)); unknown <- which(!is.element(uniqueCNs, c(0,1,2,NA))); if (length(unknown) > 0L) { unknown <- paste(uniqueCNs[unknown], collapse=", "); stop("Argument 'cn' contains unknown CN levels: ", unknown); } # Argument 'subsetToFit': if (!is.null(subsetToFit)) { if (is.logical(subsetToFit)) { if (length(subsetToFit) != J) { stop("The length of argument 'subsetToFit' does not match 'y': ", length(subsetToFit), " != ", J); } subsetToFit <- which(subsetToFit); } else { subsetToFit <- as.integer(subsetToFit); subsetToFit <- sort(unique(subsetToFit)); if (!all(1 <= subsetToFit & subsetToFit <= J)) { stop(sprintf("Some elements of argument 'subsetToFit' is out of range [1,%d].", J)); } } } # Argument 'flavor': flavor <- match.arg(flavor); # Argument 'adjust': adjust <- as.double(adjust); if (length(adjust) != 1L) { stop("Argument 'adjust' must be single value: ", adjust); } if (adjust <= 0) { stop("Argument 'adjust' must be positive: ", adjust); } ## # Argument 'tol': ## tol <- as.double(tol); ## if (length(tol) != 1) { ## stop("Argument 'tol' must be single value: ", tol); ## } ## if (tol <= 0) { ## stop("Argument 'tol' must be positive: ", tol); ## } # Argument 'censorAt': censorAt <- as.double(censorAt); stopifnot(length(censorAt) == 2L); stopifnot(censorAt[1] <= censorAt[2]); # Argument 'verbose': verbose <- Arguments$getVerbose(verbose); if (verbose) { pushState(verbose); on.exit(popState(verbose)); } verbose && enter(verbose, "Fitting naive genotype model from normal allele B fractions (BAFs)"); verbose && cat(verbose, "Flavor: ", flavor); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Adjust signals # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (verbose) { enter(verbose, "Censoring BAFs"); cat(verbose, "Before:"); summary(verbose, y); print(verbose, sum(is.finite(y))); } # Censor values y[y < censorAt[1]] <- -Inf; y[y > censorAt[2]] <- +Inf; if (verbose) { cat(verbose, "After:"); summary(verbose, y); print(verbose, sum(is.finite(y))); exit(verbose); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Subsetting # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (!is.null(subsetToFit)) { if (verbose) { enter(verbose, "Subsetting"); cat(verbose, "Number of data points before: ", length(y)); cat(verbose, "Number of true copy-number levels before: ", length(uniqueCNs)); } y <- y[subsetToFit]; cn <- cn[subsetToFit]; if (verbose) { uniqueCNs <- sort(unique(cn)); cat(verbose, "Number of data points afterward: ", length(y)); cat(verbose, "Number of true copy-number levels afterward: ", length(uniqueCNs)); exit(verbose); } } # To please R CMD check type <- NULL; rm(list="type"); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Call genotypes # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fitList <- list(); for (kk in seq_along(uniqueCNs)) { cnKK <- uniqueCNs[kk]; verbose && enter(verbose, sprintf("Copy number level #%d (C=%g) of %d", kk, cnKK, length(uniqueCNs))); keep <- which(cn == cnKK); yKK <- y[keep]; # Exclude missing and non-finited values when fitting the density yT <- yKK[is.finite(yKK)]; n <- length(yT); if (flavor == "density") { fit <- findPeaksAndValleys(yT, adjust=adjust, ...); verbose && cat(verbose, "Identified extreme points in density of BAF:"); verbose && print(verbose, fit); fitValleys <- subset(fit, type == "valley"); nbrOfGenotypeGroups <- nrow(fitValleys) + 1L; verbose && cat(verbose, "Local minimas (\"valleys\") in BAF:"); verbose && print(verbose, fitValleys); tau <- fitValleys$x; } else if (flavor == "fixed") { args <- list(...); tau <- args$tau; if (is.null(tau)) { tau <- seq_len(cnKK) / (cnKK + 1L); } nbrOfGenotypeGroups <- length(tau) + 1L; } # Sanity check stopifnot(length(tau) == nbrOfGenotypeGroups - 1L); # Store fitKK <- list( flavor = flavor, cn=cnKK, nbrOfGenotypeGroups=nbrOfGenotypeGroups, # Not really used tau=tau, n=n ); if (flavor == "density") { fitKK$fit <- fit; fitKK$fitValleys <- fitValleys; } fitList[[kk]] <- fitKK; verbose && exit(verbose); } # for (kk ...) verbose && exit(verbose); class(fitList) <- c("NaiveGenotypeModelFit", class(fitList)); fitList; }) # fitNaiveGenotypes() ########################################################################### # HISTORY: # 2012-04-16 # o Added support for fitNaiveGenotypes(..., flavor="fixed"). # o GENERALIZATION: Now fitNaiveGenotypes() returns also 'flavor' and # 'tau'. The latter are the genotype threshholds used by the caller. # 2010-10-14 # o TYPO FIX: Used name 'fitPeaks' instead of 'fitValleys'. # 2010-10-12 # o New default of argument 'censorAt' for fitNaiveGenotypes(). # o BUG FIX: fitNaiveGenotypes(..., subsetToFit=) would throw # an exception reporting "Some elements of argument 'subsetToFit' is # out of range ...". # 2010-10-07 # o Created from callNaiveGenotypes.R. ########################################################################### aroma.light/R/robustSmoothSpline.R0000644000175000017500000002651214136047216017032 0ustar nileshnilesh############################################################################/** # @RdocDefault robustSmoothSpline # # @title "Robust fit of a Smoothing Spline" # # @synopsis # # \description{ # Fits a smoothing spline robustly using the \eqn{L_1} norm. Currently, the # algorithm is an \emph{iterative reweighted smooth spline} algorithm which # calls \code{smooth.spline(x,y,w,...)} at each iteration with the weights # \code{w} equal to the inverse of the absolute value of the residuals for # the last iteration step. # } # # \arguments{ # \item{x}{a @vector giving the values of the predictor variable, or a # @list or a two-column @matrix specifying \code{x} and \code{y}. # If \code{x} is of class \code{smooth.spline} then \code{x$x} is used # as the \code{x} values and \code{x$yin} are used as the \code{y} # values.} # \item{y}{responses. If \code{y} is missing, the responses are assumed to be # specified by \code{x}.} # \item{w}{a @vector of weights the same length as \code{x} giving the weights # to use for each element of \code{x}. Default value is equal weight # to all values.} # \item{...}{Other arguments passed to @see "stats::smooth.spline".} # \item{minIter}{the minimum number of iterations used to fit the smoothing # spline robustly. Default value is 3.} # \item{maxIter}{the maximum number of iterations used to fit the smoothing # spline robustly. Default value is 25.} # \item{method}{the method used to compute robustness weights at each # iteration. Default value is \code{"L1"}, which uses the inverse of # the absolute value of the residuals. Using \code{"symmetric"} will # use Tukey's biweight with cut-off equal to six times the MAD of # the residuals, equivalent to @see "stats::lowess".} # \item{sdCriteria}{Convergence criteria, which the difference between the # standard deviation of the residuals between two consecutive # iteration steps. Default value is 2e-4.} # \item{reps}{Small positive number added to residuals to avoid division by # zero when calculating new weights for next iteration.} # \item{tol}{Passed to @see "stats::smooth.spline" (R >= 2.14.0).} # \item{plotCurves}{If @TRUE, the fitted splines are added to the current # plot, otherwise not.} # } # # \value{ # Returns an object of class \code{smooth.spline}. # } # # @examples "../incl/robustSmoothSpline.Rex" # # \seealso{ # This implementation of this function was adopted from # @see "stats::smooth.spline" of the \pkg{stats} package. # Because of this, this function is also licensed under GPL v2. # } # # @author # # @keyword "smooth" # @keyword "robust" #*/############################################################################ setMethodS3("robustSmoothSpline", "default", function(x, y=NULL, w=NULL, ..., minIter=3, maxIter=max(minIter, 50), method=c("L1", "symmetric"), sdCriteria=2e-4, reps=1e-15, tol=1e-6*IQR(x), plotCurves=FALSE) { requireNamespace("stats") || throw("Package not loaded: stats"); # smooth.spline() stats.smooth.spline <- smooth.spline; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Verify arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'w' if (is.numeric(w)) { w <- as.double(w); if (anyMissing(w)) { stop("Weights with value NA are not allowed."); } if (any(w < 0 | w > 1)) { stop("Weights out of range [0,1]: ", paste(w[w < 0.0 | w > 1.0], collapse=", ")); } } else if (!is.null(w)) { stop("Argument 'w' is of an unsupported datatype/class: ", class(weights)[1]); } # Argument: 'method' method <- match.arg(method) # Argument: 'reps' if (!is.numeric(reps) || length(reps) != 1 || reps <= 0) throw("Argument 'reps' must be a single postive number."); # smooth.spline() next will only operate on unique x-values. For this reason, # we have to remove corresponding weights too. There is a small problem here; # if different weights are used for data points (x,y,w) with same x-value, which # data points (x,y,w) should be used? Here we use the first one only. /HB 2005-01-24 uIdxs <- .whichUnique(x, tol = tol); nu <- length(uIdxs); w0 <- w[uIdxs]; # WORKAROUND # We need to make sure that 'g$x == x' below. /HB 2011-10-10 x <- x[uIdxs]; y <- y[uIdxs]; w <- w[uIdxs]; uIdxs <- seq_along(x); if (inherits(x, "smooth.spline")) { g <- x; } else if (missing(w) || is.null(w)) { x <- as.vector(x); y <- as.vector(y); g <- stats.smooth.spline(x, y, ..., tol=tol); # Sanity check /HB 2011-10-10 stopifnot(length(g$x) == nu); # Not needed anymore x <- y <- NULL; } else { x <- as.vector(x); y <- as.vector(y); w <- as.vector(w); g <- stats.smooth.spline(x, y, w=w, ..., tol=tol); # Sanity check /HB 2011-10-10 stopifnot(length(g$x) == nu); # Not needed anymore x <- y <- w <- NULL; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Step 0. Initiation # # This will generate an object of class smooth.spline # containing the fields # x : the distinct `x' values in increasing order. # y : the fitted values corresponding to `x'. # yin : the y values used at the unique `y' values. # From these the residuals can be calculated as # r <- yin - y # The important is that we use these (x,yin) as our # (x,y) in the rest of the algorithm. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - sdR0 <- NA_real_; col <- 0; ready <- FALSE; iter <- 0; while (!ready & iter < maxIter) { iter <- iter + 1; # Calculate the residuals and the weights r <- (g$yin-g$y); if (method == "L1") { w <- 1/(abs(r)+reps); # Add a small constant for stability. } else if (method == "symmetric") { rmad <- mad(r); threshold <- 6 * rmad; # same as lowess(). threshold <- max(reps, threshold); # avoid instability at very low MADs. w <- (1 - pmin(1, abs(r)/threshold)^2)^2; } # If the user specified weights initially, the weights # calculated from the inverse of the residuals are themselve # weighted by the user initial weights. if (!is.null(w0)) { w <- w0*w; } sdR <- sd(r); # Not needed anymore r <- NULL; if (iter > minIter) { if (!is.na(sdR0)) { dSd <- abs(sdR0-sdR); if (dSd < sdCriteria) break; } } # Remove "bad" weights. For instance, too large w's gives: # Error in smooth.spline(g$x, g$yin, w = w, ...) : # NA/NaN/Inf in foreign function call (arg 4) ok.weights <- (w != 0 & is.finite(w)); if (!all(ok.weights)) w[!ok.weights] <- 0; # Not needed anymore ok.weights <- NULL; g <- stats.smooth.spline(g$x, g$yin, w=w, ..., tol=tol); # Not needed anymore w <- NULL; if (plotCurves == TRUE) lines(g, col=(col<-col+1)); sdR0 <- sdR; } # while ( ... ) g$iter <- iter g; }) # robustSmoothSpline() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Local functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .whichUnique <- function(x, ..., tol) { # We need to make sure that 'g$x == x' below. /HB 2011-10-10 xx <- x; keep <- rep(TRUE, times=length(x)); while (TRUE) { idxs <- which(keep); xx <- round((x[idxs] - mean(x[idxs]))/tol); # de-mean to avoid possible overflow dups <- duplicated(xx); if (!any(dups)) { break; } keep[idxs[dups]] <- FALSE; } # while() nd <- keep; # Sanity check stopifnot(length(nd) == length(x)); which(nd); } # .whichUnique() ###################################################################### # HISTORY # 2015-01-06 # o Using requestNamespace() instead of request(). # 2014-03-25 # o CLEANUP: The internal .Fortran() calls no longer pass DUP=FALSE, # which "may be disabled in future versions of R.". # 2013-09-26 # o Now utilizing anyMissing(). # 2012-08-30 # o BUG FIX: Now local getNativeSplineFitFunction() sets up the # function such that it is called via a FortranRoutine object, # rather than by name. # 2012-08-19 # o Added local getNativeSplineFitFunction() function to # robustSmoothSpline() which returns a wrapper to a proper # native and internal spline fit function of R. # o Make it clear that robustSmoothSpline() is under GPL (>= 2), # because it is adapted from smooth.spline() of R by R Core Team. # Added a GPL source code header. # 2011-10-10 # o Updated robustSmoothSpline() such that it works with the new # "uniqueness" scheme of smooth.spline() in R v2.14.0 and newer. # It is tricky, because robustSmoothSpline() is a reiterative # algorithm which requires that the choosen "unique" x:s does # not change in each iteration. Previously, 'signif(x, 6)' was # used to identify unique x:s, which gives the same set of values # when called twice, whereas this is not true for the new choice # with 'round((x - mean(x))/tol)'. # 2011-04-12 # o Now using as.double(NA) instead of NA, which is logical. # o Interestingly, stats::smooth.spline() of R v2.14.0 now does # very similar speedups as robustSmoothSpline() has done # internally in its smooth.spline.fit() since 2002. Great. # o CLEANUP: Now robustSmoothSpline() utilizes stats:::n.knots() # internally, if running on R v2.14.0 or newer. # 2008-07-20 # o MEMORY OPTIMIZATION: Removing more variables when done etc. # Helping the garbage collector by doing x <- as.vector(x) before # calling a function rather than having as.vector(x) as an argument. # 2007-06-08 # o Added declaration 'nx <- 0' in robustSmoothSpline.matrix() in # order to please R CMD check R v2.6.0. # 2007-01-01 # o Removed any code to make method backward compatibility with # R < 1.9.0, which was before 'modreg' was merged into 'stats'. # 2005-06-03 # o Now making use of setMethodS3(). # o Renamed to robustSmoothSpline(). # o Copied from R.basic. At the same time, we speedup functions were made # into local functions. # 2005-01-24 # o Added support for weights. # 2002-04-21 # o Updated due to modreg is merged into stats from R v1.9.0. # 2002-03-02 # o SPEED UP: Since robust. smooth. spline() now makes use of # the "home-made" smooth.spline.prepare() and smooth.spline0() it # speed up about three times on my test data; 32secs -> 9secs. # o Splitted smooth.spline() into the two functions # smooth.spline.prepare() and smooth.spline.fit(). The purpose of # this is to speed up robust.spline(), especially when there are # duplicate x values! # 2002-02-19 # o The idea of using w.org is not simple since the data points are # reorder by smooth.spline. # o Made w <- as.vector(w). # 2002-02-18 # o Created the Rd comments with an example adapted from # smooth.spline. # o Made it possible to specify weights even in the robust estimation. # o Added a assertion that the weights are non-illegal and not to # big. # o Renamed to robust. smooth. spline() and made analogue to # smooth.spline(). # 2002-02-15 # o Created. It seems like the robust spline alorithm gives pretty # much the same result as lowess. If not, the differences are # quite small compared to the noise level of cDNA microarray data. ###################################################################### aroma.light/R/plotXYCurve.R0000644000175000017500000001230514136047216015406 0ustar nileshnilesh###########################################################################/** # @RdocGeneric plotXYCurve # @alias plotXYCurve.numeric # @alias plotXYCurve.matrix # # @title "Plot the relationship between two variables as a smooth curve" # # \usage{ # @usage plotXYCurve,numeric # @usage plotXYCurve,matrix # } # # \description{ # @get "title". # } # # \arguments{ # \item{x, y, X, Y}{Two @numeric @vectors of length N for one curve (K=1), # or two @numeric NxK @matrix:es for K curves.} # \item{col}{The color of each curve. # Either a scalar specifying the same value of all curves, # or a @vector of K curve-specific values.} # \item{lwd}{The line width of each curve. # Either a scalar specifying the same value of all curves, # or a @vector of K curve-specific values.} # \item{dlwd}{The width of each density curve.} # \item{dcol}{The fill color of the interior of each density curve.} # \item{xlim, ylim}{The x and y plotting limits.} # \item{xlab, ylab}{The x and y labels.} # \item{curveFit}{The @function used to fit each curve. The two first # arguments of the function must take \code{x} and \code{y}, and the # function must return a @list with fitted elements \code{x} and # \code{y}.} # \item{...}{Additional arguments passed to @see "graphics::lines" # used to draw each curve.} # \item{add}{If @TRUE, the graph is added to the current plot, otherwise # a new plot is created.} # } # # \value{ # Returns nothing. # } # # \section{Missing values}{ # Data points (x,y) with non-finite values are excluded. # } # # @author "HB" # # @keyword "nonparametric" # @keyword "multivariate" # @keyword "robust" #*/########################################################################### setMethodS3("plotXYCurve", "numeric", function(x, y, col=1L, lwd=2, dlwd=1, dcol=NA, xlim=NULL, ylim=xlim, xlab=NULL, ylab=NULL, curveFit=smooth.spline, ..., add=FALSE) { if (is.null(xlab)) xlab <- substitute(X); if (is.null(ylab)) ylab <- substitute(Y); # Exclude non-finite data points ok <- (is.finite(x) & is.finite(y)); x <- x[ok]; y <- y[ok]; # Create empty plot? if (!add) { par(mar=c(5,4,4,5)+0.1); suppressWarnings({ plot(NA, xlim=xlim, ylim=ylim, xlab="", ylab="", ..., axes=FALSE); }) cex <- par("cex.lab")*par("cex"); mtext(xlab, side=1, line=3, cex=cex, col=par("col.lab"), font=par("font.lab")); mtext(ylab, side=4, line=3, cex=cex, col=par("col.lab"), font=par("font.lab")); abline(a=0, b=1, col="gray", lty=2L); } # Estimate and draw smooth function suppressWarnings({ args <- list(x=x, y=y, ...); keep <- intersect(names(args), names(formals(smooth.spline))); args <- args[keep]; fit <- do.call(smooth.spline, args=args); lines(fit, col=col, lwd=lwd, ...); }) usr <- par("usr"); # Limit the density plot to the plot region and data range rx <- range(x); rx[1L] <- max(rx[1], usr[1L]); rx[2L] <- min(rx[2], usr[2L]); ry <- range(y); ry[1L] <- max(ry[1], usr[3L]); ry[2L] <- min(ry[2], usr[4L]); # Estimate density of x d <- density(x, from=rx[1L], to=rx[2L]); n <- length(d$y); d$y[c(1L,n)] <- 0; d$y <- d$y / max(d$y, na.rm=TRUE); dx <- d; d$y <- 1/10*(usr[4L]-usr[3L])*d$y; d$y <- usr[4L]+d$y; polygon(d, col=dcol, border=col, lwd=dlwd, xpd=TRUE); # Estimate density of y d <- density(y, from=ry[1L], to=ry[2L]); n <- length(d$y); d$y[c(1L,n)] <- 0; d$y <- d$y / max(d$y, na.rm=TRUE); dy <- d; t <- d$x; d$x <- d$y; d$y <- t; d$x <- usr[1L]-1/10*(usr[2L]-usr[1L])*d$x; polygon(d, col=dcol, border=col, lwd=dlwd, xpd=TRUE); d <- dx; t <- d$x; d$x <- d$y; d$y <- t; d$x <- usr[1L]-1/10*(usr[2L]-usr[1L])*d$x; lines(d, col="black", lwd=0.618*dlwd, lty=2, xpd=TRUE); if (!add) { axis(side=1L); axis(side=4L); box(); } invisible(fit); }) # plotXYCurve.numeric() setMethodS3("plotXYCurve", "matrix", function(X, Y, col=seq_len(nrow(X)), lwd=2, dlwd=1, dcol=NA, xlim=NULL, ylim=xlim, xlab=NULL, ylab=NULL, curveFit=smooth.spline, ..., add=FALSE) { if (identical((X), dim(Y))) { throw("Argument 'X' and 'Y' have different dimensions."); } if (is.null(xlab)) xlab <- substitute(X); if (is.null(ylab)) ylab <- substitute(Y); ncol <- ncol(X); if (is.null(col)) { col <- seq_len(ncol); } else { col <- rep(col, length.out=ncol); } if (!is.null(lwd)) lwd <- rep(lwd, length.out=ncol); if (is.null(xlim)) { xlim <- range(X, na.rm=TRUE); } if (is.null(ylim)) { ylim <- range(Y, na.rm=TRUE); } for (kk in seq_len(ncol)) { plotXYCurve(X[,kk], Y[,kk], col=col[kk], lwd=lwd, dlwd=dlwd, dcol=dcol, xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab, curveFit=curveFit, ..., add=add || (kk > 1L)); } box(); invisible(); }) # plotXYCurve.matrix() ############################################################################ # HISTORY: # 2013-10-08 # o BUG FIX: Argument 'lwd' of plotXYCurve(X, ...) was ignored if 'X' # was a matrix. # o DOCUMENTATION: Now there is one combined plotXYCurve() help pages # for all data types. # 2008-04-14 # o Replaced a R.utils::doCall() with a "cleanup" do.call(). # 2007-02-04 # o Created. ############################################################################ aroma.light/R/normalizeQuantileRank.R0000644000175000017500000001313614136047216017464 0ustar nileshnilesh###########################################################################/** # @RdocGeneric normalizeQuantileRank # @alias normalizeQuantileRank.numeric # @alias normalizeQuantileRank.list # @alias normalizeQuantile # @alias normalizeQuantile.default # # @title "Normalizes the empirical distribution of one of more samples to a target distribution" # # \usage{ # @usage normalizeQuantileRank,numeric # @usage normalizeQuantileRank,list # @usage normalizeQuantile,default # } # # \description{ # @get "title". # # The average sample distribution is calculated either robustly or not # by utilizing either \code{weightedMedian()} or \code{weighted.mean()}. # A weighted method is used if any of the weights are different from one. # } # # \arguments{ # \item{x, X}{a @numeric @vector of length N or a @list of length N # with @numeric @vectors. # If a @list, then the @vectors may be of different lengths.} # \item{xTarget}{The target empirical distribution as a \emph{sorted} # @numeric @vector of length \eqn{M}. # If @NULL and \code{X} is a @list, then the target distribution is # calculated as the average empirical distribution of the samples.} # \item{ties}{Should ties in \code{x} be treated with care or not? # For more details, see "limma:normalizeQuantiles".} # \item{...}{Not used.} # } # # \value{ # Returns an object of the same shape as the input argument. # } # # \section{Missing values}{ # Missing values are excluded when estimating the "common" (the baseline). # Values that are @NA remain @NA after normalization. # No new @NAs are introduced. # } # # \section{Weights}{ # Currently only channel weights are support due to the way quantile # normalization is done. # If signal weights are given, channel weights are calculated from these # by taking the mean of the signal weights in each channel. # } # # @examples "../incl/normalizeQuantileRank.list.Rex" # # \author{ # Adopted from Gordon Smyth (\url{http://www.statsci.org/}) in 2002 \& 2006. # Original code by Ben Bolstad at Statistics Department, University of # California. # } # # \seealso{ # To calculate a target distribution from a set of samples, see # @see "averageQuantile". # For an alternative empirical density normalization methods, see # @see "normalizeQuantileSpline". # } # # @keyword "nonparametric" # @keyword "multivariate" # @keyword "robust" #*/########################################################################### setMethodS3("normalizeQuantileRank", "list", function(X, xTarget=NULL, ...) { # Get the target quantile for all channels (columns)? if (is.null(xTarget)) xTarget <- averageQuantile(X); # Normalizes the data nTarget <- length(xTarget); X <- lapply(X, FUN=function(x) { normalizeQuantileRank(x, xTarget=xTarget, ...); }) X; }) setMethodS3("normalizeQuantileRank", "numeric", function(x, xTarget, ties=FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - n <- length(x); # Argument 'xTarget': if (!is.numeric(xTarget)) { throw("Argument 'xTarget' is not numeric: ", mode(xTarget)); } nTarget <- length(xTarget); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Different length of sample and target? # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nDiff <- (nTarget - n); if (nDiff > 0L) { # Add hoc fix for differences in lengths. naValue <- NA; storage.mode(naValue) <- storage.mode(x); x <- c(x, rep(naValue, times=nDiff)); n <- n + nDiff; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # For all columns, get for each sample quantile the value of # average sample distribution at that quantile. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - quantiles <- (0:(nTarget-1))/(nTarget-1); ok <- !is.na(x); nok <- sum(ok); if(nok < n) { # Get the sample quantiles for those values if (ties) { r <- rank(x[ok]); xNew <- (r-1)/(nok-1); } else { xNew <- (0:(nok-1))/(nok-1); } # Interpolate to get the xTarget's at positions specified by # 'quantile' using data points given by 'xNew' and 'xTarget'. if (!ties) { # Order and sort the values ok <- ((1:n)[ok])[order(x[ok])]; } x[ok] <- approx(x=quantiles, y=xTarget, xout=xNew, ties="ordered")$y; if (nDiff > 0L) { x <- x[1:(n-nDiff)]; } } else { if (ties || n != nTarget) { r <- rank(x); xNew <- (r-1)/(n-1); x <- approx(x=quantiles, y=xTarget, xout=xNew, ties="ordered")$y; } else { ok <- order(x); x[ok] <- xTarget; } } x; }) setMethodS3("normalizeQuantile", "default", function(x, ...) { normalizeQuantileRank(x, ...); }) ############################################################################## # HISTORY: # 2013-10-07 # o DOCUMENTATION: Merged the documentation for normalizeQuantileRank() # for numeric vectors and lists. # 2011-04-12 # o Now using NAs of the correct storage type. # 2008-04-14 # o Renamed normalizeQuantile() to normalizeQuantileRank(). Keeping the old # name for backward compatibility. # 2006-05-21 # o Now 'x' and 'xTarget' may be of different lengths. # 2006-05-15 # o Now the method can normalize vectors of length different from 'xTarget'. # 2006-05-12 # o Created from normalizeQuantile.matrix.R. It has been optimized for # memory. Hence, the normalization is done using a two-pass procedure. ############################################################################## aroma.light/R/pairedAlleleSpecificCopyNumbers.R0000644000175000017500000001177014136047216021367 0ustar nileshnilesh###########################################################################/** # @RdocGeneric pairedAlleleSpecificCopyNumbers # @alias pairedAlleleSpecificCopyNumbers.numeric # # @title "Calculating tumor-normal paired allele-specific copy number stratified on genotypes" # # \description{ # @get "title". # The method is a single-sample (single-pair) method. # It requires paired tumor-normal parent-specific copy number signals. # } # # \usage{ # @usage pairedAlleleSpecificCopyNumbers,numeric # } # # \arguments{ # \item{thetaT, betaT}{Theta and allele-B fraction signals for the tumor.} # \item{thetaN, betaN}{Total and allele-B fraction signals for the # matched normal.} # \item{muN}{An optional @vector of length J containing # normal genotypes calls in (0,1/2,1,@NA) for (AA,AB,BB).} # \item{...}{Not used.} # } # # \value{ # Returns a @data.frame with elements \code{CT}, \code{betaT} and \code{muN}. # } # # \seealso{ # This definition of calculating tumor-normal paired ASCN is related # to how the @see "normalizeTumorBoost" method calculates normalized # tumor BAFs. # } # # @author "PN, HB" #*/########################################################################### setMethodS3("pairedAlleleSpecificCopyNumbers", "numeric", function(thetaT, betaT, thetaN, betaN, muN=callNaiveGenotypes(betaN), ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'thetaT' & 'betaT': thetaT <- as.numeric(thetaT); betaT <- as.numeric(betaT); J <- length(thetaT); if (length(betaT) != J) { stop("The length of arguments 'betaT' and 'thetaT' differ: ", length(betaT), " != ", J); } # Argument: 'thetaN' & 'betaN': thetaN <- as.numeric(thetaN); betaN <- as.numeric(betaN); if (length(thetaN) != J) { stop("The length of arguments 'thetaN' and 'thetaT' differ: ", length(thetaN), " != ", J); } if (length(betaN) != J) { stop("The length of arguments 'betaN' and 'thetaN' differ: ", length(betaN), " != ", J); } # Argument: 'muN': if (length(muN) != J) { stop("The length of arguments 'muN' and 'betaN' differ: ", length(muN), " != ", J); } knownGenotypes <- c(0, 1/2, 1, NA); unknown <- which(!is.element(muN, knownGenotypes)); n <- length(unknown); if (n > 0L) { unknown <- unique(muN[unknown]); stop("Argument 'muN' contains unknown values: ", hpaste(unknown)); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Calculate (thetaA,thetaB) for tumor and normal (for SNP only) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # SNPs are identifies as those loci that have non-missing 'betaTN' & 'muN' isSnp <- (!is.na(betaT) & !is.na(muN)); nbrOfSnps <- sum(isSnp); thetaTs <- thetaT[isSnp] * matrix(c(1-betaT[isSnp], betaT[isSnp]), ncol=2L); stopifnot(nrow(thetaTs) == nbrOfSnps); thetaNs <- thetaN[isSnp] * matrix(c(1-betaN[isSnp], betaN[isSnp]), ncol=2L); stopifnot(nrow(thetaNs) == nbrOfSnps); muNs <- muN[isSnp]; stopifnot(length(muNs) == nbrOfSnps); isHomAs <- (muNs == 0); isHomBs <- (muNs == 1); stopifnot(length(isHomAs) == nbrOfSnps); stopifnot(length(isHomBs) == nbrOfSnps); muNs <- NULL; # Not needed anymore # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Calculate tumor (CA,CB) conditioned on genotype (for SNP only) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CTs <- thetaTs / thetaNs; CTs[isHomAs,1L] <- 2*CTs[isHomAs,1L]; CTs[isHomAs,2L] <- 0; CTs[isHomBs,1L] <- 0; CTs[isHomBs,2L] <- 2*CTs[isHomBs,2L]; thetaTs <- thetaNs <- isHomAs <- isHomBs <- NULL; # Not needed anymore # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Translate (CA,CB) to (CT,betaT) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CT <- betaT <- rep(NA_real_, times=J); # Total CN ratios CT[isSnp] <- CTs[,1L] + CTs[,2L]; CT[!isSnp] <- 2 * thetaT[!isSnp] / thetaN[!isSnp]; # Tumor BAFs betaT[isSnp] <- CTs[,2L] / CT[isSnp]; CTs <- isSnp <- NULL; # Not needed anymore # Sanity checks stopifnot(length(CT) == J); stopifnot(length(betaT) == J); stopifnot(length(muN) == J); # Return value data <- data.frame(CT=CT, betaT=betaT, muN=muN); data; }) # pairedAlleleSpecificCopyNumbers() ############################################################################## # HISTORY: # 2014-03-30 [HB in Juvisy] # o Created from PN's description just to be on the same page. PN has argued # for this way of calculating ASCN's PN since our TumorBoost days (~2009). # PN has a high-level implementation elsewhere, but HB decided to do this # from scratch to get a low-level API similar to that of TumorBoost. ############################################################################## aroma.light/R/plotDensity.R0000644000175000017500000001530314136047216015461 0ustar nileshnilesh#########################################################################/** # @RdocGeneric plotDensity # @alias plotDensity.list # @alias plotDensity.data.frame # @alias plotDensity.matrix # @alias plotDensity.numeric # @alias plotDensity.density # # @title "Plots density distributions for a set of vectors" # # \description{ # @get "title". # } # # \usage{ # @usage plotDensity,data.frame # @usage plotDensity,matrix # @usage plotDensity,numeric # @usage plotDensity,list # } # # \arguments{ # \item{X}{A single of @list of @numeric @vectors or @see "stats::density" # objects, a @numeric @matrix, or a @numeric @data.frame.} # \item{W}{(optional) weights of similar data types and dimensions as # \code{X}.} # \item{xlim,ylim}{@character @vector of length 2. The x and y limits.} # \item{xlab,ylab}{@character string for labels on x and y axis.} # \item{col}{The color(s) of the curves.} # \item{lty}{The types of curves.} # \item{lwd}{The width of curves.} # \item{...}{Additional arguments passed to @see "stats::density", # @see "graphics::plot", and @see "graphics::lines".} # \item{add}{If @TRUE, the curves are plotted in the current plot, # otherwise a new is created.} # } # # \seealso{ # Internally, @see "stats::density" is used to estimate the # empirical density. # } # # @author "HB" #*/######################################################################### setMethodS3("plotDensity", "list", function(X, W=NULL, xlim=NULL, ylim=NULL, xlab=NULL, ylab="density (integrates to one)", col=1:length(X), lty=NULL, lwd=NULL, ..., add=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X': nbrOfSamples <- length(X); # Argument 'W': if (is.numeric(W)) { nX <- sapply(X, FUN=length); if (any(nX != nX[1L])) { throw("If argument 'W' is a numeric vector or matrix, then all vectors of 'X' must of identical lengths, which is not the case."); } nX <- nX[1L]; if (is.vector(W)) { nW <- length(W); if (nW != nX) { throw("Length of argument 'W' and the length of the elements of 'X' does not match: ", nW, " != ", nX); } # Coerce into a list of weights of the same number of elements as 'X' W <- rep(list(W), times=nbrOfSamples); } else if (is.matrix(W)) { nW <- nrow(W); if (nW != nX) { throw("Number of rows of argument 'W' and the length of the elements of 'X' does not match: ", nW, " != ", nX); } # Coerce into a list of weights of the same number of elements as 'X' Wx <- vector("list", length=ncol(W)); for (kk in 1:ncol(W)) Wx[[kk]] <- W[,kk,drop=TRUE]; W <- Wx; Wx <- NULL; # Not needed anymore } } # if (is.numeric(W)) if (is.list(W)) { if (length(W) != nbrOfSamples) { throw("The lists of argument 'W' and 'X' do not have the same number of elements: ", length(W), " != ", nbrOfSamples); } for (kk in 1:nbrOfSamples) { w <- W[[kk]]; nW <- length(w); nX <- length(X[[kk]]); if (nW != nX) { throw(sprintf("Element #%d of arguments 'W' and 'X' are of different lengths: %d != %d", kk, nW, nX)); } if (any(w < 0)) throw("Argument 'W' contains negative weights."); w <- nW <- nX <- NULL; # Not needed anymore } } else if (!is.null(W)) { throw("Argument 'W' must be a list, a numeric vector, or a numeric matrix: ", class(W)[1L]); } # Argument 'xlab': if (is.null(xlab)) xlab <- substitute(X); # Argument 'col': if (is.null(col)) { col <- seq_len(nbrOfSamples); } else { col <- rep(col, length.out=nbrOfSamples); } # Argument 'lty': if (!is.null(lty)) lty <- rep(lty, length.out=nbrOfSamples); # Argument 'lwd': if (!is.null(lwd)) lwd <- rep(lwd, length.out=nbrOfSamples); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Generate all densities first and figure out the plot limits. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ds <- list(); xlimDef <- c(NA_real_,NA_real_); ylimDef <- c(0,NA_real_); for(kk in 1:nbrOfSamples) { x <- X[[kk]]; if (inherits(x, "density")) { d <- x; } else { w <- W[[kk]]; if (is.null(w)) { keep <- is.finite(x); x <- x[keep]; keep <- NULL; # Not needed anymore suppressWarnings({ d <- density(x, ...); }); x <- NULL; # Not needed anymore } else { keep <- is.finite(x) & is.finite(w); x <- x[keep]; w <- w[keep]; keep <- NULL; # Not needed anymore # Standardize to sum(w) == 1 w <- w / sum(w); suppressWarnings({ d <- density(x, weights=w, ...); }); x <- w <- NULL; # Not needed anymore } } ds[[kk]] <- d; xlimDef <- range(c(xlimDef, d$x), na.rm=TRUE); ylimDef <- range(c(ylimDef, d$y), na.rm=TRUE); } # for (kk ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plot the densities # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (is.null(xlim)) { xlim <- xlimDef; } else { for (kk in 1:2) if (is.na(xlim[kk])) xlim[kk] <- xlimDef[kk] } if (is.null(ylim)) { ylim <- ylimDef; } else { for (kk in 1:2) if (is.na(ylim[kk])) ylim[kk] <- ylimDef[kk] } if (add == FALSE) { suppressWarnings({ plot(NA, xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab, ...); }) } for(kk in 1:nbrOfSamples) { suppressWarnings({ lines(ds[[kk]], col=col[kk], lty=lty[kk], lwd=lwd[kk], ...); }) } invisible(ds); }) # plotDensity() setMethodS3("plotDensity", "data.frame", function(X, ..., xlab=NULL) { # Argument 'xlab': if (is.null(xlab)) xlab <- substitute(X); plotDensity(as.list(X), ..., xlab=xlab); }) setMethodS3("plotDensity", "matrix", function(X, ..., xlab=NULL) { # Argument 'xlab': if (is.null(xlab)) xlab <- substitute(X); plotDensity(as.data.frame(X), ..., xlab=xlab); }) setMethodS3("plotDensity", "numeric", function(X, ..., xlab=NULL) { # Argument 'xlab': if (is.null(xlab)) xlab <- substitute(X); plotDensity(list(X), ..., xlab=xlab); }) setMethodS3("plotDensity", "density", function(X, ..., xlab=NULL) { # Argument 'xlab': if (is.null(xlab)) xlab <- substitute(X); plotDensity(list(X), ..., xlab=xlab); }) ############################################################################## # HISTORY: # 2014-03-25 # o Now plotDensity() supports weights via argument 'W'. # o Now plotDensity() also supports density() objects. # 2006-05-12 # o Created. ############################################################################## aroma.light/R/901.CalibrationAndNormalization.R0000644000175000017500000002333014136047216021073 0ustar nileshnilesh#########################################################################/** # @RdocDocumentation "1. Calibration and Normalization" # # \encoding{latin1} # # \description{ # In this section we give \emph{our} recommendation on how spotted # two-color (or multi-color) microarray data is best calibrated and # normalized. # } # # \section{Classical background subtraction}{ # We do \emph{not} recommend background subtraction in classical # means where background is estimated by various image analysis # methods. This means that we will only consider foreground signals # in the analysis. # # We estimate "background" by other means. In what is explain below, # only a global background, that is, a global bias, is estimated # and removed. # } # # \section{Multiscan calibration}{ # In Bengtsson et al (2004) we give evidence that microarray scanners # can introduce a significant bias in data. This bias, which is # about 15-25 out of 65535, \emph{will} introduce intensity dependency # in the log-ratios, as explained in Bengtsson & # \enc{Hssjer}{Hossjer} (2006). # # In Bengtsson et al (2004) we find that this bias is stable across # arrays (and a couple of months), but further research is needed # in order to tell if this is true over a longer time period. # # To calibrate signals for scanner biases, scan the same array at # multiple PMT-settings at three or more (K >= 3) different # PMT settings (preferably in decreasing order). # While doing this, \emph{do not adjust the laser power settings}. # Also, do the multiscan \emph{without} washing, cleaning or by other # means changing the array between subsequent scans. # Although not necessary, it is preferred that the array # remains in the scanner between subsequent scans. This will simplify # the image analysis since spot identification can be made once # if images aligns perfectly. # # After image analysis, read all K scans for the same array into the # two matrices, one for the red and one for the green channel, where # the K columns corresponds to scans and the N rows to the spots. # It is enough to use foreground signals. # # In order to multiscan calibrate the data, for each channel # separately call \code{Xc <- calibrateMultiscan(X)} where \code{X} # is the NxK matrix of signals for one channel across all scans. The # calibrated signals are returned in the Nx1 matrix \code{Xc}. # # Multiscan calibration may sometimes be skipped, especially if affine # normalization is applied immediately after, but we do recommend that # every lab check at least once if their scanner introduce bias. # If the offsets in a scanner is already estimated from earlier # multiscan analyses, or known by other means, they can readily be # subtracted from the signals of each channel. If arrays are still # multiscanned, it is possible to force the calibration method to # fit the model with zero intercept (assuming the scanner offsets # have been subtracted) by adding argument \code{center=FALSE}. # } # # \section{Affine normalization}{ # In Bengtsson & \enc{Hssjer}{Hossjer} (2006), we carry out a detailed # study on how biases in each channel introduce so called # intensity-dependent log-ratios among other systematic artifacts. # Data with (additive) bias in each channel is said to be \emph{affinely} # transformed. Data without such bias, is said to be \emph{linearly} # (proportionally) transform. Ideally, observed signals (data) is a # linear (proportional) function of true gene expression levels. # # We do \emph{not} assume proportional observations. The scanner bias # is real evidence that assuming linearity is not correct. # Affine normalization corrects for affine transformation in data. # Without control spots it is not possible to estimate the bias in each # of the channels but only the relative bias such that after # normalization the effective bias are the same in all channels. # This is why we call it normalization and not calibration. # # In its simplest form, affine normalization is done by # \code{Xn <- normalizeAffine(X)} where \code{X} is a Nx2 matrix with # the first column holds the foreground signals from the red channel and # the second holds the signals from the green channel. If three- or # four-channel data is used these are added the same way. The normalized # data is returned as a Nx2 matrix \code{Xn}. # # To normalize all arrays and all channels at once, one may put all # data into one big NxK matrix where the K columns hold the all channels # from the first array, then all channels from the second array and so # on. Then \code{Xn <- normalizeAffine(X)} will return the across-array # and across-channel normalized data in the NxK matrix \code{Xn} where # the columns are stored in the same order as in matrix \code{X}. # # Equal effective bias in all channels is much better. First of all, # any intensity-dependent bias in the log-ratios is removed \emph{for # all non-differentially expressed genes}. There is still an # intensity-dependent bias in the log-ratios for differentially expressed # genes, but this is now symmetric around log-ratio zero. # # Affine normalization will (by default and recommended) normalize # \emph{all} arrays together and at once. This will guarantee that # all arrays are "on the same scale". Thus, it \emph{not} recommended # to apply a classical between-array scale normalization afterward. # Moreover, the average log-ratio will be zero after an affine # normalization. # # Note that an affine normalization will only remove curvature in the # log-ratios at lower intensities. # If a strong intensity-dependent bias at high intensities remains, # this is most likely due to saturation effects, such as too high PMT # settings or quenching. # # Note that for a perfect affine normalization you \emph{should} # expect much higher noise levels in the \emph{log-ratios} at lower # intensities than at higher. It should also be approximately # symmetric around zero log-ratio. # In other words, \emph{a strong fanning effect is a good sign}. # # Due to different noise levels in red and green channels, different # PMT settings in different channels, plus the fact that the # minimum signal is zero, "odd shapes" may be seen in the log-ratio # vs log-intensity graphs at lower intensities. Typically, these # show themselves as non-symmetric in positive and negative log-ratios. # Note that you should not see this at higher intensities. # # If there is a strong intensity-dependent effect left after the # affine normalization, we recommend, for now, that a subsequent # curve-fit or quantile normalization is done. # Which one, we do not know. # # Why negative signals? # By default, 5\% of the normalized signals will have a non-positive # signal in one or both channels. \emph{This is on purpose}, although # the exact number 5\% is chosen by experience. The reason for # introducing negative signals is that they are indeed expected. # For instance, when measure a zero gene expression level, there is # a chance that the observed value is (should be) negative due to # measurement noise. (For this reason it is possible that the scanner # manufacturers have introduced scanner bias on purpose to avoid # negative signals, which then all would be truncated to zero.) # To adjust the ratio (or number) of negative signals allowed, use # for example \code{normalizeAffine(X, constraint=0.01)} for 1\% # negative signals. If set to zero (or \code{"max"}) only as much # bias is removed such that no negative signals exist afterward. # Note that this is also true if there were negative signals on # beforehand. # # Why not lowess normalization? # Curve-fit normalization methods such as lowess normalization are # basically designed based on linearity assumptions and will for this # reason not correct for channel biases. Curve-fit normalization # methods can by definition only be applied to one pair of channels # at the time and do therefore require a subsequent between-array # scale normalization, which is by the way very ad hoc. # # Why not quantile normalization? # Affine normalization can be though of a special case of quantile # normalization that is more robust than the latter. # See Bengtsson & \enc{Hssjer}{Hossjer} (2006) for details. # Quantile normalization is probably better to apply than curve-fit # normalization methods, but less robust than affine normalization, # especially at extreme (low and high) intensities. # For this reason, we do recommend to use affine normalization first, # and if this is not satisfactory, quantile normalization may be applied. # } # # \section{Linear (proportional) normalization}{ # If the channel offsets are zero, already corrected for, or estimated # by other means, it is possible to normalize the data robustly by # fitting the above affine model without intercept, that is, fitting # a truly linear model. This is done adding argument \code{center=FALSE} # when calling \code{normalizeAffine()}. # } # # @author "HB" #*/######################################################################### ############################################################################ # HISTORY: # 2011-02-05 # o DOCUMENTATION: Added paragraphs on how to do affine normalization # when channel offsets are known/zero. Same for multiscan calibration # when scanner offsets are known/zero. # 2006-06-29 # o Added to aroma.light instead. # 2005-02-02 # o Created. ############################################################################ aroma.light/R/normalizeAverage.R0000644000175000017500000000475414136047216016446 0ustar nileshnilesh###########################################################################/** # @RdocGeneric normalizeAverage # @alias normalizeAverage.list # @alias normalizeAverage.matrix # # @title "Rescales channel vectors to get the same average" # # \description{ # @get "title". # } # # \usage{ # @usage normalizeAverage,matrix # @usage normalizeAverage,list # } # # \arguments{ # \item{x}{A @numeric NxK @matrix (or @list of length K).} # \item{baseline}{An @integer in [1,K] specifying which channel should be # the baseline.} # \item{avg}{A @function for calculating the average of one channel.} # \item{targetAvg}{The average that each channel should have afterwards. # If @NULL, the baseline column sets the target average.} # \item{...}{Additional arguments passed to the \code{avg} @function.} # } # # \value{ # Returns a normalized @numeric NxK @matrix (or @list of length K). # } # # @author "HB" #*/########################################################################### setMethodS3("normalizeAverage", "matrix", function(x, baseline=1, avg=stats::median, targetAvg=2200, ...) { # Estimate the scale for each channel scale <- apply(x, MARGIN=2, FUN=avg, ...); # The scale of the baseline column scale1 <- scale[baseline]; # Standardize so that the 'baseline' column is not rescaled (has scale one). scale <- scale / scale1; # Rescale to target averages? if (!is.null(targetAvg)) { rho <- (scale1 / targetAvg); scale <- rho * scale; } # Rescale so that all channels have the same scale for (cc in 1:ncol(x)) { x[,cc] <- x[,cc] / scale[cc]; } x; }, private=TRUE) setMethodS3("normalizeAverage", "list", function(x, baseline=1, avg=stats::median, targetAvg=2200, ...) { # Estimate the scale for each channel scale <- lapply(x, FUN=avg, ...); scale <- unlist(scale, use.names=FALSE); scale1 <- scale[baseline]; # Standardize so that the 'baseline' channel has scale one. scale <- scale / scale1; # Rescale to target averages? if (!is.null(targetAvg)) { rho <- (scale1 / targetAvg); scale <- rho * scale; } # Rescale so that all channels have the same scale for (cc in 1:length(x)) { x[[cc]] <- x[[cc]] / scale[cc]; } x; }, private=TRUE) ############################################################################ # HISTORY: # 2007-06-04 # o Corrected minor ineffective typo in code. # 2007-03-29 # o Added Rdoc comments. # 2006-05-08 # o Created. ############################################################################ aroma.light/R/print.SmoothSplineLikelihood.R0000644000175000017500000000332214136047216020724 0ustar nileshnilesh###########################################################################/** # @class SmoothSplineLikelihood # @RdocMethod print # # @title "Prints an SmoothSplineLikelihood object" # # \description{ # @get "title". A SmoothSplineLikelihood object is returned by # \code{\link{likelihood.smooth.spline}()}. # } # # \usage{ # @usage print,SmoothSplineLikelihood # } # # \arguments{ # \item{x}{Object to be printed.} # \item{digits}{Minimal number of significant digits to print.} # \item{...}{Not used.} # } # # \value{ # Returns nothing. # } # # @author "HB" # # @keyword internal #*/########################################################################### setMethodS3("print", "SmoothSplineLikelihood", function(x, digits=getOption("digits"), ...) { # To please R CMD check... object <- x; s <- paste("Likelihood of smoothing spline:", format(object, digits=digits), "\n"); base <- attr(object, "base"); s <- paste(s, "Log base:", format(base, digits=digits), "\n") wrss <- attr(object, "wrss"); s <- paste(s, "Weighted residuals sum of square:", format(wrss, digits=digits), "\n"); penalty <- attr(object, "penalty"); s <- paste(s, "Penalty:", format(penalty, digits=digits), "\n"); lambda <- attr(object, "lambda"); s <- paste(s, "Smoothing parameter lambda:", format(lambda, digits=digits), "\n"); roughness <- attr(object, "roughness"); s <- paste(s, "Roughness score:", format(roughness, digits=digits), "\n"); cat(s); invisible(object); }) ############################################################################ # HISTORY: # 2005-06-03 # o Added Rdoc comments. # o Extracted from likelihood.smooth.spline.R. ############################################################################ aroma.light/R/likelihood.smooth.spline.R0000644000175000017500000001320614136047216020067 0ustar nileshnilesh###########################################################################/** # @class smooth.spline # @RdocMethod likelihood # # @title "Calculate the log likelihood of a smoothing spline given the data" # # @synopsis # # \arguments{ # \item{object}{The smooth.spline object.} # \item{x, y}{The x and y values for which the (weighted) likelihood will # be calculated. If \code{x} is of type \code{xy.coords} any value of # argument \code{y} will be omitted. If \code{x==NULL}, the x and y values # of the smoothing spline will be used.} # \item{w}{The weights for which the (weighted) likelihood will be # calculated. If @NULL, weights equal to one are assumed.} # \item{base}{The base of the logarithm of the likelihood. If @NULL, # the non-logged likelihood is returned.} # \item{rel.tol}{The relative tolerance used in the call to # \code{integrate}.} # \item{...}{Not used.} # } # # \description{ # Calculate the (log) likelihood of a spline given the data used to fit # the spline, \eqn{g}. The likelihood consists of two main parts: # 1) (weighted) residuals sum of squares, and 2) a penalty term. The # penalty term consists of a \emph{smoothing parameter} \eqn{lambda} # and a \emph{roughness measure} of the spline # \eqn{J(g) = \int g''(t) dt}. Hence, the overall log likelihood is # \deqn{\log L(g|x) = (y-g(x))'W(y-g(x)) + \lambda J(g)} # In addition to the overall likelihood, all its separate # components are also returned. # # Note: when fitting a smooth spline with \eqn{(x,y)} values where the # \eqn{x}'s are \emph{not} unique, \code{smooth.spline} will replace # such \eqn{(x,y)}'s with a new pair \eqn{(x,y')} where \eqn{y'} is a # reweighted average on the original \eqn{y}'s. It is important to # be aware of this. In such cases, the resulting \code{smooth.spline} # object does \emph{not} contain all \eqn{(x,y)}'s and therefore this # function will not calculate the weighted residuals sum of square on # the original data set, but on the data set with unique \eqn{x}'s. # See examples below how to calculate the likelihood for the spline with # the original data. # } # # \value{ # Returns the overall (log) likelihood of class # \code{SmoothSplineLikelihood}, a class with the following attributes: # \item{wrss}{the (weighted) residual sum of square} # \item{penalty}{the penalty which is equal to \code{-lambda*roughness}.} # \item{lambda}{the smoothing parameter} # \item{roughness}{the value of the roughness functional given the # specific smoothing spline and the range of data} # } # # \details{ # The roughness penalty for the smoothing spline, \eqn{g}, fitted # from data in the interval \eqn{[a,b]} is defined as # \deqn{J(g) = \int_a^b g''(t) dt} # which is the same as # \deqn{J(g) = g'(b) - g'(a)} # The latter is calculated internally by using # @see "stats::predict.smooth.spline". # } # # @examples "../incl/likelihood.smooth.spline.Rex" # # \seealso{ # @see "stats::smooth.spline" and @see "robustSmoothSpline". # } # # @author # # @keyword smooth # @keyword internal #*/########################################################################### setMethodS3("likelihood", "smooth.spline", function(object, x=NULL, y=NULL, w=NULL, base=exp(1), rel.tol=.Machine$double.eps^(1/8), ...) { requireNamespace("stats") || throw("Package not loaded: stats") smooth.spline <- stats::smooth.spline g <- object; if (is.null(x)) { x <- g$x; y <- g$yin; w <- g$w; yg <- g$y; } else { xy <- xy.coords(x, y); if (is.element("w", names(x))) w <- x$w; x <- xy$x; y <- xy$y; if (is.null(w)) w <- rep(1, times=length(x)); yg <- NULL; ok <- (!is.na(x) & !is.na(y) & !is.na(w)); if (any(ok == FALSE)) { x <- x[ok]; y <- y[ok]; z <- z[ok]; } } # The weighted residuals sum of square if (is.null(yg)) yg <- predict(g, x)$y; wrss <- sum(w * (y-yg)^2); # The smoothing parameter lambda <- g$lambda # The roughness score J(g) = \int_a^b (g''(t))^2 dt gbis <- smooth.spline(predict(g, x, deriv=2)); ab <- range(x, na.rm=TRUE); Jg <- integrate(function(x) predict(gbis, x=x)$y, lower=ab[1], upper=ab[2], rel.tol=rel.tol, stop.on.error=FALSE)$value # The penalty term penalty <- -lambda * Jg; # The log likelihood l <- -(wrss + penalty); # Return the correct logarithm (if any) if (missing(base) || (!is.null(base) && base == exp(1))) { } else if (is.null(base)) { l <- exp(l); } else { l <- l*log(exp(1), base=base);; } attr(l, "base") <- base; attr(l, "wrss") <- wrss; attr(l, "lambda") <- lambda; attr(l, "roughness") <- Jg; attr(l, "penalty") <- penalty; class(l) <- "SmoothSplineLikelihood"; l; }) ############################################################################ # HISTORY: # 2007-01-01 # o Removed any code to make method backward compatibility with # R < 1.9.0, which was before 'modreg' was merged into 'stats'. # 2005-06-03 # o now returns an object of class SmoothSplineLikelihood. # 2005-02-20 # o Now using setMethodS3() and added '...' to please R CMD check. # 2002-04-21 # o Updated due to modreg is merged into stats from R v1.9.0. # 2002-03-04 # o Returns an object of class likelihood. smooth.spline instead of a list. # o Added the option to explicitly specify x, y and w. # o Rename from logLikelihood(...) to likelihood(..., base=exp(1)). # o BUG FIX: Forgot to take the square in the integral of J(g). # 2002-03-02 # o Added Rdoc details about case with non unique x values. # 2002-03-01 # o Wrote the Rdoc comments # o Created. ############################################################################ aroma.light/R/calibrateMultiscan.R0000644000175000017500000002437014136047216016755 0ustar nileshnilesh#########################################################################/** # @RdocGeneric calibrateMultiscan # @alias calibrateMultiscan.matrix # # \encoding{latin1} # # @title "Weighted affine calibration of a multiple re-scanned channel" # # \description{ # @get "title". # } # # \usage{ # @usage calibrateMultiscan,matrix # } # # \arguments{ # \item{X}{An NxK @matrix (K>=2) where the columns represent the # multiple scans of one channel (a two-color array contains two # channels) to be calibrated.} # \item{weights}{If @NULL, non-weighted normalization is done. # If data-point weights are used, this should be a @vector of length # N of data point weights used when estimating the normalization # function. # } # \item{typeOfWeights}{A @character string specifying the type of # weights given in argument \code{weights}. # } # \item{method}{A @character string specifying how the estimates are # robustified. See @see "iwpca" for all accepted values.} # \item{constraint}{Constraint making the bias parameters identifiable. # See @see "fitIWPCA" for more details.} # \item{satSignal}{Signals equal to or above this threshold is considered # saturated signals.} # \item{...}{Other arguments passed to @see "fitIWPCA" and in # turn @see "iwpca", e.g. \code{center} (see below).} # \item{average}{A @function to calculate the average signals between calibrated scans.} # \item{deviance}{A @function to calculate the deviance of the signals between calibrated scans.} # \item{project}{If @TRUE, the calibrated data points projected onto the # diagonal line, otherwise not. Moreover, if @TRUE, argument # \code{average} is ignored.} # \item{.fitOnly}{If @TRUE, the data will not be back-transform.} # } # # \value{ # If \code{average} is specified or \code{project} is @TRUE, # an Nx1 @matrix is returned, otherwise an NxK @matrix is returned. # If \code{deviance} is specified, a deviance Nx1 @matrix is returned # as attribute \code{deviance}. # In addition, the fitted model is returned as attribute \code{modelFit}. # } # # \section{Negative, non-positive, and saturated values}{ # Affine multiscan calibration applies also to negative values, which are # therefor also calibrated, if they exist. # # Saturated signals in any scan are set to @NA. Thus, they will not be # used to estimate the calibration function, nor will they affect an # optional projection. # } # # \section{Missing values}{ # Only observations (rows) in \code{X} that contain all finite values are # used in the estimation of the calibration functions. Thus, # observations can be excluded by setting them to @NA. # } # # \section{Weighted normalization}{ # Each data point/observation, that is, each row in \code{X}, which is a # vector of length K, can be assigned a weight in [0,1] specifying how much # it should \emph{affect the fitting of the calibration function}. # Weights are given by argument \code{weights}, # which should be a @numeric @vector of length N. Regardless of weights, # all data points are \emph{calibrated} based on the fitted calibration # function. # } # # \section{Robustness}{ # By default, the model fit of multiscan calibration is done in \eqn{L_1} # (\code{method="L1"}). This way, outliers affect the parameter estimates # less than ordinary least-square methods. # # When calculating the average calibrated signal from multiple scans, # by default the median is used, which further robustify against outliers. # # For further robustness, downweight outliers such as saturated signals, # if possible. # # Tukey's biweight function is supported, but not used by default because # then a "bandwidth" parameter has to selected. This can indeed be done # automatically by estimating the standard deviation, for instance using # MAD. However, since scanner signals have heteroscedastic noise # (standard deviation is approximately proportional to the non-logged # signal), Tukey's bandwidth parameter has to be a function of the # signal too, cf. @see "stats::loess". We have experimented with this # too, but found that it does not significantly improve the robustness # compared to \eqn{L_1}. # Moreover, using Tukey's biweight as is, that is, assuming homoscedastic # noise, seems to introduce a (scale dependent) bias in the estimates # of the offset terms. # } # # \section{Using a known/previously estimated offset}{ # If the scanner offsets can be assumed to be known, for instance, # from prior multiscan analyses on the scanner, then it is possible # to fit the scanner model with no (zero) offset by specifying # argument \code{center=FALSE}. # Note that you cannot specify the offset. Instead, subtract it # from all signals before calibrating, e.g. # \code{Xc <- calibrateMultiscan(X-e, center=FALSE)} # where \code{e} is the scanner offset (a scalar). # You can assert that the model is fitted without offset by # \code{stopifnot(all(attr(Xc, "modelFit")$adiag == 0))}. # } # # \details{ # Fitting is done by iterated re-weighted principal component analysis # (IWPCA). # } # # @author # # \references{ # [1] @include "../incl/BengtssonH_etal_2004.bib.Rdoc" \cr # } # # \examples{\dontrun{# For an example, see help(normalizeAffine).}} # # \seealso{ # @see "1. Calibration and Normalization". # @see "normalizeAffine". # } #*/######################################################################### setMethodS3("calibrateMultiscan", "matrix", function(X, weights=NULL, typeOfWeights=c("datapoint"), method="L1", constraint="diagonal", satSignal=2^16-1, ..., average=median, deviance=NULL, project=FALSE, .fitOnly=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'X' if (ncol(X) < 2L) stop("Multiscan calibratation requires at least two scans: ", ncol(X)); if (nrow(X) < 3L) stop("Multiscan calibratation requires at least three observations: ", nrow(X)); # Argument: 'satSignal' if (satSignal < 0) stop("Argument 'satSignal' is negative: ", satSignal); # Argument: 'typeOfWeights' typeOfWeights <- match.arg(typeOfWeights); # Argument: 'weights' datapointWeights <- NULL; if (!is.null(weights)) { # If 'weights' is an object of a class with as.double(), cast it. weights <- as.double(weights); if (anyMissing(weights)) stop("Argument 'weights' must not contain NA values."); if (any(weights < 0 | weights > 1)) { stop("Argument 'weights' out of range [0,1]: ", paste(weights[weights < 0.0 | weights > 1.0], collapse=", ")); } weights <- as.vector(weights); if (length(weights) == 1L) { weights <- rep(weights, length.out=nrow(X)); } else if (length(weights) != nrow(X)) { stop("Argument 'weights' does not have the same length as the number of data points (rows) in the matrix: ", length(weights), " != ", nrow(X)); } datapointWeights <- weights; } # Argument 'average': if (!is.null(average) && !is.function(average)) { throw("Argument 'average' must be a function or NULL: ", class(average)[1]); } # Argument 'deviance': if (!is.null(deviance) && !is.function(deviance)) { throw("Argument 'deviance' must be a function or NULL: ", class(deviance)[1]); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Prepare the data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Use non-saturated observations (non-finite values are taken care of by # the fitIWPCA() function. X[(X >= satSignal)] <- NA_real_; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. Fit the model # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fit <- fitIWPCA(X, w=datapointWeights, method=method, constraint=constraint, ...); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 4. Backtransform # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (.fitOnly == FALSE) { X <- backtransformAffine(X, a=fit, project=project); if (project == FALSE && !is.null(average)) { X <- apply(X, MARGIN=1L, FUN=average, na.rm=TRUE); X <- as.matrix(X); } if (!is.null(deviance)) { deviance <- apply(X, MARGIN=1L, FUN=deviance, na.rm=TRUE); attr(X, "deviance") <- as.matrix(deviance); } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 5. Return the backtransformed data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - attr(X, "modelFit") <- fit; X; }) # calibrateMultiscan() ############################################################################ # HISTORY: # 2013-09-26 # o Now utilizing anyMissing(). # 2011-02-05 # o DOCUMENTATION: Added section on how to calibrate when scanner offsets # are supposed to be known/zero. # o DOCUMENTATION: Fixed broken links to help for iwpca(). # 2005-06-03 # o Added argument 'typeOfWeights' to make it similar to other normalization # methods, although only "datapoint" weights are allowed. # 2005-02-13 # o Made argument 'method="L1"' explicit and wrote a Rdoc comment about it # to document the fact that we have deliberately choosen not to use # "symmetric" Tukey's biweight. # 2005-02-04 # o Put arguments 'average' and 'deviance' back again. It is much more # userfriendly. Averaging with median() is now the default. # 2005-02-01 # o Added argument '.fitOnly'. # 2005-01-24 # o Added argument 'weights' (instead of passing 'w' to fitIWPCA()). # o Saturated values are not used to estimate the calibration function nor # are the used if data is projected. # 2004-12-28 # o Added Rdoc comments on weights. # 2004-06-28 # o BUG FIX: Missing braces in Rdoc comments. # 2004-05-18 # o Removed averaging etc. That is now in its own function rowAverages(). # o The only difference between calibrateMultiscanSpatial() and # calibrateMultiscan() is how the parameters are fitted. # 2004-05-14 # o Cleaned up. Making use of new backtransformAffine(), which makes the # code clearer. Explicit arguments that were just passed to iwpca() etc # are now passed as "..." to make the documentation simpler and less # confusing for the end user. Experts will follow "..." to iwpca(). ############################################################################ aroma.light/R/findPeaksAndValleys.R0000644000175000017500000000764014136047216017037 0ustar nileshnilesh###########################################################################/** # @RdocGeneric findPeaksAndValleys # @alias findPeaksAndValleys.density # @alias findPeaksAndValleys.numeric # # @title "Finds extreme points in the empirical density estimated from data" # # \description{ # @get "title". # } # # \usage{ # @usage findPeaksAndValleys,density # @usage findPeaksAndValleys,numeric # } # # \arguments{ # \item{x}{A @numeric @vector containing data points or # a @see "stats::density" object.} # \item{...}{Arguments passed to @see "stats::density". # Ignored if \code{x} is a @see "stats::density" object.} # \item{tol}{A non-negative @numeric threshold specifying the minimum # density at the extreme point in order to accept it.} # \item{na.rm}{If @TRUE, missing values are dropped, otherwise not.} # } # # \value{ # Returns a @data.frame (of class 'PeaksAndValleys') containing # of "peaks" and "valleys" filtered by \code{tol}. # } # # @examples "../incl/findPeaksAndValleys.Rex" # # @author # # \seealso{ # This function is used by @see "callNaiveGenotypes". # } # # @keyword internal #*/########################################################################### setMethodS3("findPeaksAndValleys", "density", function(x, tol=0, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'x': d <- x; # Argument 'tol': tol <- as.double(tol); stopifnot(length(tol) == 1); stopifnot(tol >= 0); delta <- diff(d$y); n <- length(delta); isPeak <- (delta[-n] > 0 & delta[-1] < 0); isValley <- (delta[-n] < 0 & delta[-1] > 0); isPeakOrValley <- (isPeak | isValley); idxs <- which(isPeakOrValley); types <- c("valley", "peak")[isPeak[idxs]+1]; names(idxs) <- types; x <- d$x[idxs]; y <- d$y[idxs]; res <- data.frame(type=types, x=x, density=y); class(res) <- c("PeaksAndValleys", class(res)); # Filter valleys by density? if (tol > 0) { res <- subset(res, density >= tol); } res; }) # findPeaksAndValleys() setMethodS3("findPeaksAndValleys", "numeric", function(x, ..., tol=0, na.rm=TRUE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'na.rm': na.rm <- as.logical(na.rm); stopifnot(length(na.rm) == 1); # Argument 'tol': tol <- as.double(tol); stopifnot(length(tol) == 1); stopifnot(tol >= 0); d <- density(x, na.rm=na.rm, ...); findPeaksAndValleys(d, tol=tol); }) # findPeaksAndValleys() ############################################################################ # HISTORY: # 2011-03-03 [HB] # o BUG FIX: findPeaksAndValleys(x, to) were 'x' is numeric would use # partial match and interpret 'to' as argument 'tol' and not part of # '...' passed to density(). This problem was solved by placing '...' # before argument 'tol'. Thanks Oscar Rueda at the Cancer Reasearch UK # for reporting and identify this bug. # 2010-10-08 [HB] # o Now findPeaksAndValleys() returns a object of class PeaksAndValleys, # which extends data.frame. # 2010-10-06 [HB] # o Added findPeaksAndValleys() for the 'density' class, which then # findPeaksAndValleys() for 'numeric' utilizes. # 2010-04-04 [HB] # o Made findPeaksAndValleys() an internal function in Rd. # o Updated could to validate arguments with using R.utils::Arguments. # o Corrected a non-defined Rdoc tag. # 2009-11-03 [HB] # o Added Rdoc comments with an example(). # 2009-03-06 [HB] # o Created for doing quick naive genotyping of some TCGA normal samples in # order to highlight the centers of the clouds in a tumor-normal fracB # scatter plots. ############################################################################ aroma.light/R/normalizeCurveFit.R0000644000175000017500000002607214136047216016620 0ustar nileshnilesh#########################################################################/** # @RdocGeneric normalizeCurveFit # @alias normalizeLoess # @alias normalizeLowess # @alias normalizeSpline # @alias normalizeRobustSpline # @alias normalizeCurveFit.matrix # @alias normalizeLoess.matrix # @alias normalizeLowess.matrix # @alias normalizeSpline.matrix # @alias normalizeRobustSpline.matrix # # \encoding{latin1} # # @title "Weighted curve-fit normalization between a pair of channels" # # \description{ # @get "title". # # This method will estimate a smooth function of the dependency # between the log-ratios and the log-intensity of the two channels and # then correct the log-ratios (only) in order to remove the dependency. # This is method is also known as \emph{intensity-dependent} or # \emph{lowess normalization}. # # The curve-fit methods are by nature limited to paired-channel data. # There exist at least one method trying to overcome this limitation, # namely the cyclic-lowess [1], which applies the paired # curve-fit method iteratively over all pairs of channels/arrays. # Cyclic-lowess is not implemented here. # # We recommend that affine normalization [2] is used instead of curve-fit # normalization. # } # # \usage{ # @usage normalizeCurveFit,matrix # @usage normalizeLoess,matrix # @usage normalizeLowess,matrix # @usage normalizeSpline,matrix # @usage normalizeRobustSpline,matrix # } # # \arguments{ # \item{X}{An Nx2 @matrix where the columns represent the two channels # to be normalized.} # \item{weights}{If @NULL, non-weighted normalization is done. # If data-point weights are used, this should be a @vector of length # N of data point weights used when estimating the normalization # function. # } # \item{typeOfWeights}{A @character string specifying the type of # weights given in argument \code{weights}. # } # \item{method}{@character string specifying which method to use when # fitting the intensity-dependent function. # Supported methods: # \code{"loess"} (better than lowess), # \code{"lowess"} (classic; supports only zero-one weights), # \code{"spline"} (more robust than lowess at lower and upper # intensities; supports only zero-one weights), # \code{"robustSpline"} (better than spline). # } # \item{bandwidth}{A @double value specifying the bandwidth of the # estimator used. # } # \item{satSignal}{Signals equal to or above this threshold will not # be used in the fitting. # } # \item{...}{Not used.} # } # # \value{ # A Nx2 @matrix of the normalized two channels. # The fitted model is returned as attribute \code{modelFit}. # } # # \details{ # A smooth function \eqn{c(A)} is fitted through data in \eqn{(A,M)}, # where \eqn{M=log_2(y_2/y_1)} and \eqn{A=1/2*log_2(y_2*y_1)}. Data is # normalized by \eqn{M <- M - c(A)}. # # Loess is by far the slowest method of the four, then lowess, and then # robust spline, which iteratively calls the spline method. # } # # \section{Negative, non-positive, and saturated values}{ # Non-positive values are set to not-a-number (@NaN). # Data points that are saturated in one or more channels are not used # to estimate the normalization function, but they are normalized. # } # # \section{Missing values}{ # The estimation of the normalization function will only be made # based on complete non-saturated observations, i.e. observations that # contains no @NA values nor saturated values as defined by \code{satSignal}. # } # # \section{Weighted normalization}{ # Each data point, that is, each row in \code{X}, which is a # vector of length 2, can be assigned a weight in [0,1] specifying how much # it should \emph{affect the fitting of the normalization function}. # Weights are given by argument \code{weights}, which should be a @numeric # @vector of length N. Regardless of weights, all data points are # \emph{normalized} based on the fitted normalization function. # # Note that the lowess and the spline method only support zero-one # \{0,1\} weights. # For such methods, all weights that are less than a half are set to zero. # } # # \section{Details on loess}{ # For @see "stats::loess", the arguments \code{family="symmetric"}, # \code{degree=1}, \code{span=3/4}, # \code{control=loess.control(trace.hat="approximate"}, # \code{iterations=5}, \code{surface="direct")} are used. # } # # @author "HB" # # \references{ # [1] M. \enc{strand}{Astrand}, # Contrast Normalization of Oligonucleotide Arrays, # Journal Computational Biology, 2003, 10, 95-102. \cr # [2] @include "../incl/BengtssonHossjer_2006.bib.Rdoc" \cr # } # # \examples{ # @include "../incl/normalizeCurveFit.matrix.Rex" # } # # \seealso{ # @see "normalizeAffine". # } #*/######################################################################### setMethodS3("normalizeCurveFit", "matrix", function(X, weights=NULL, typeOfWeights=c("datapoint"), method=c("loess", "lowess", "spline", "robustSpline"), bandwidth=NULL, satSignal=2^16-1, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'X' if (ncol(X) != 2) stop("Curve-fit normalization requires two channels only: ", ncol(X)); if (nrow(X) < 3) stop("Curve-fit normalization requires at least three observations: ", nrow(X)); # Argument: 'satSignal' if (satSignal < 0) stop("Argument 'satSignal' is negative: ", satSignal); # Argument: 'method' method <- match.arg(method); zeroOneWeightsOnly <- (method %in% c("lowess", "spline")); # Argument: 'typeOfWeights' typeOfWeights <- match.arg(typeOfWeights); # Argument: 'weights' datapointWeights <- NULL; if (!is.null(weights)) { # If 'weights' is an object of a class with as.double(), cast it. weights <- as.double(weights); if (anyMissing(weights)) stop("Argument 'weights' must not contain NA values."); if (any(weights < 0 | weights > 1)) { stop("Argument 'weights' out of range [0,1]: ", paste(weights[weights < 0.0 | weights > 1.0], collapse=", ")); } if (zeroOneWeightsOnly && any(weights > 0 & weights < 1)) { weights <- round(weights); warning("Weights were rounded to {0,1} since '", method, "' normalization supports only zero-one weights."); } weights <- as.vector(weights); if (length(weights) == 1) { weights <- rep(weights, length.out=nrow(X)); } else if (length(weights) != nrow(X)) { stop("Argument 'weights' does not have the same length as the number of data points (rows) in the matrix: ", length(weights), " != ", nrow(X)); } datapointWeights <- weights; } # if (!is.null(weights)) # Argument: 'bandwidth' if (is.null(bandwidth)) { bandwidths <- c("loess"=0.75, "lowess"=0.3, "robustSpline"=0.75, "spline"=0.75); bandwidth <- bandwidths[method]; } else if (!is.numeric(bandwidth) || bandwidth <= 0 || bandwidth > 1) { stop("Argument 'bandwidth' must be in [0,1): ", bandwidth); } else if (length(bandwidth) != 1) { stop("Argument 'bandwidth' must be a scalar: ", paste(bandwidth, collapse=", ")); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Prepare data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Convert non-positive signals to NaN. If not done here, the transform # (R,G) -> (A,M) -> (R,G) will no it. X[X <= 0] <- NaN; # Use only positive non-saturated observations to estimate the # normalization function isValid <- (is.finite(X) & (X <= satSignal)); isValid <- (isValid[,1] & isValid[,2]); Y <- X[isValid,]; if (!is.null(datapointWeights)) datapointWeights <- datapointWeights[isValid]; M <- log(Y[,1]/Y[,2], base=2); A <- log(Y[,1]*Y[,2], base=2)/2; # Not needed anymore Y <- NULL; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. Estimate the model # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (method == "lowess") { incl <- if (!is.null(datapointWeights)) (datapointWeights > 0) else TRUE; fit <- lowess(x=A[incl], y=M[incl], f=bandwidth, ...); fit$predictM <- function(newA) approx(fit, xout=newA, ties=mean)$y; } else if (method == "loess") { fit <- loess(formula=M ~ A, weights=datapointWeights, family="symmetric", degree=1, span=bandwidth, control=loess.control(trace.hat="approximate", iterations=5, surface="direct"), ...); fit$predictM <- function(newA) predict(fit, newdata=newA); } else if (method == "spline") { incl <- if (!is.null(datapointWeights)) (datapointWeights > 0) else TRUE; fit <- smooth.spline(x=A[incl], y=M[incl], spar=bandwidth, ...); fit$predictM <- function(newA) predict(fit, x=newA)$y; } else if (method == "robustSpline") { fit <- robustSmoothSpline(x=A, y=M, w=datapointWeights, spar=bandwidth, ...); fit$predictM <- function(newA) predict(fit, x=newA)$y; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 4. Normalize # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Normalize all data M <- log(X[,1]/X[,2], base=2); A <- log(X[,1]*X[,2], base=2)/2; ok <- is.finite(A); M[ok] <- M[ok] - fit$predictM(A[ok]); # Not needed anymore ok <- NULL; X[,1] <- as.matrix(sqrt(2^(2*A+M))); X[,2] <- as.matrix(sqrt(2^(2*A-M))); # Not needed anymore A <- M <- NULL; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 5. Return the normalized data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - attr(X, "modelFit") <- fit; X; }) # normalizeCurveFit() setMethodS3("normalizeLowess", "matrix", function(X, ...) { normalizeCurveFit(X, method="lowess", ...); }) setMethodS3("normalizeLoess", "matrix", function(X, ...) { normalizeCurveFit(X, method="loess", ...); }) setMethodS3("normalizeSpline", "matrix", function(X, ...) { normalizeCurveFit(X, method="spline", ...); }) setMethodS3("normalizeRobustSpline", "matrix", function(X, ...) { normalizeCurveFit(X, method="robustSpline", ...); }) ############################################################################ # HISTORY: # 2013-09-26 # o Now utilizing anyMissing(). # 2005-06-03 # o Added argument 'typeOfWeights' to make it similar to other normalization # methods, although only "datapoint" weights are allowed. # o Removed argument '.fitOnly'. # o renamed all "robust.spline" to "robustSpline". # 2005-03-23 # o Updated normalizeCurveFit() so that approx() does not give warnings # about 'Collapsing to unique x values' when doing lowess normalization. # 2005-02-02 # o Zero-one weights are now round off by round(w). # o BUG FIX: Forgot to adjust weights vector in normalizeCurveFit() when # removing non-finite values from data. # 2005-02-01 # o Added argument '.fitOnly'. # 2005-01-24 # o Create an Rdoc example with MvsA and MvsM comparisons. # 2005-01-23 # o Added aliases normalizeLowess() and normalizeLoess(). # o Created from normalizeCurveFit() in MAData(). ############################################################################ aroma.light/R/fitPrincipalCurve.R0000644000175000017500000001116414136047216016575 0ustar nileshnilesh#########################################################################/** # @RdocGeneric fitPrincipalCurve # @alias fitPrincipalCurve.matrix # # @title "Fit a principal curve in K dimensions" # # \description{ # @get "title". # } # # \usage{ # @usage fitPrincipalCurve,matrix # } # # \arguments{ # \item{X}{An NxK @matrix (K>=2) where the columns represent the dimension.} # \item{...}{Other arguments passed to @see "princurve::principal_curve".} # \item{verbose}{A @logical or a @see "R.utils::Verbose" object.} # } # # \value{ # Returns a principal_curve object (which is a @list). # See @see "princurve::principal_curve" for more details. # } # # \section{Missing values}{ # The estimation of the normalization function will only be made # based on complete observations, i.e. observations that contains no @NA # values in any of the channels. # } # # @author "HB" # # \references{ # [1] Hastie, T. and Stuetzle, W, \emph{Principal Curves}, JASA, 1989.\cr # [2] @include "../incl/BengtssonH_etal_2009.bib.Rdoc" \cr # } # # @examples "../incl/fitPrincipalCurve.matrix.Rex" # # \seealso{ # @see "backtransformPrincipalCurve". # @see "princurve::principal_curve". # } #*/######################################################################### setMethodS3("fitPrincipalCurve", "matrix", function(X, ..., verbose=FALSE) { # princurve v1.1-9 and before contains bugs. /HB 2008-05-26 # princurve v2.0.0 replaced princurve.curve with princurve_curve. /HB 2018-09-04 use("princurve (>= 2.1.2)") principal_curve <- princurve::principal_curve # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - n <- nrow(X); p <- ncol(X); # Argument 'verbose': verbose <- Arguments$getVerbose(verbose); if (verbose) { pushState(verbose); on.exit(popState(verbose)); } verbose && enter(verbose, "Fitting principal curve"); verbose && cat(verbose, "Data size: ", n, "x", p); verbose && enter(verbose, "Identifying missing values"); # princurve::principal_curve() does not handle missing values. keep <- rep(TRUE, times=n); for (cc in seq_len(p)) { keep <- keep & is.finite(X[,cc]); } anyMissing <- (!all(keep)); if (anyMissing) { X <- X[keep,, drop=FALSE]; } verbose && exit(verbose); verbose && cat(verbose, "Data size after removing non-finite data points: ", nrow(X), "x", p); verbose && enter(verbose, "Calling principal_curve()"); trace <- as.logical(verbose); t <- system.time({ fit <- principal_curve(X, ..., trace=trace); }); attr(fit, "processingTime") <- t; verbose && printf(verbose, "Converged: %s\n", fit$converged); verbose && printf(verbose, "Number of iterations: %d\n", fit$num_iterations); verbose && printf(verbose, "Processing time/iteration: %.1fs (%.1fs/iteration)\n", t[3], t[3]/fit$num_iterations); verbose && exit(verbose); # Expand, iff missing values were dropped if (anyMissing) { values <- matrix(NA_real_, nrow=n, ncol=p); values[keep,] <- fit$s; dimnames(values) <- dimnames(fit$s); fit$s <- values; values <- rep(NA_real_, times=n); for (ff in c("ord", "lambda")) { values[keep] <- fit[[ff]]; fit[[ff]] <- values; } } verbose && exit(verbose); class(fit) <- c("PrincipalCurve", class(fit)); fit; }) # fitPrincipalCurve() ########################################################################### # HISTORY: # 2013-04-18 # o BUG FIX: fitPrincipalCurve() would not preserve dimension names # if data contain missing values. # 2011-04-12 # o CLEANUP: Removed internal patch of principal.curve(). If an older # version than princurve v1.1-10 is used, an informative error is # thrown requesting an update. The internal patch is part of the # offical princurve v1.1-10 release (since 2009-10-04). # 2009-11-01 # o Now fitPrincipalCurve() bug-fixed princurve v1.1-10. If earlier # version are available, it used the internal patch. # 2009-07-15 # o Added attribute 'processingTime' to the fit object returned by # fitPrincipalCurve(). # 2009-01-12 # o Updated code such that R.utils::Verbose is optional. # 2008-10-08 # o Removed argument 'fixDimension'. That constrain is taken care of # by backtransformPrincipalCurve(). # o Now the fitted object is of class PrincipalCurve that extends the # princurve::principal.curve class. # 2008-10-07 # o Added Rdoc comments and an example. # o Removed implementation for data.frame:s. # 2008-10-03 # o Added argument 'fixDimension'. # 2008-05-27 # o Added fitPrincipalCurve(). # o Created. ########################################################################### aroma.light/R/999.package.R0000644000175000017500000000776414136047216015103 0ustar nileshnilesh#########################################################################/** # @RdocPackage aroma.light # # \encoding{latin1} # # \description{ # @eval "getDescription(aroma.light)" # } # # \section{Installation}{ # To install this package, see # \url{https://bioconductor.org/packages/release/bioc/html/aroma.light.html}. # } # # \section{To get started}{ # For scanner calibration: # \enumerate{ # \item see @see "calibrateMultiscan" - scan the same array two or more times to calibrate for scanner effects and extended dynamical range. # } # # To normalize multiple single-channel arrays all with the same number of probes/spots: # \enumerate{ # \item @see "normalizeAffine" - normalizes, on the intensity scale, for differences in offset and scale between channels. # \item @see "normalizeQuantileRank", @see "normalizeQuantileSpline" - normalizes, on the intensity scale, for differences in empirical distribution between channels. # } # # To normalize multiple single-channel arrays with varying number probes/spots: # \enumerate{ # \item @see "normalizeQuantileRank", @see "normalizeQuantileSpline" - normalizes, on the intensity scale, for differences in empirical distribution between channels. # } # # To normalize two-channel arrays: # \enumerate{ # \item @see "normalizeAffine" - normalizes, on the intensity scale, for differences in offset and scale between channels. This will also correct for intensity-dependent affects on the log scale. # \item @see "normalizeCurveFit" - Classical intensity-dependent normalization, on the log scale, e.g. lowess normalization. # } # # To normalize three or more channels: # \enumerate{ # \item @see "normalizeAffine" - normalizes, on the intensity scale, for differences in offset and scale between channels. This will minimize the curvature on the log scale between any two channels. # } # } # # \section{Further readings}{ # Several of the normalization methods proposed in [1]-[7] are # available in this package. # } # # \section{How to cite this package}{ # Whenever using this package, please cite one or more of [1]-[7]. # } # # \section{Wishlist}{ # Here is a list of features that would be useful, but which I have # too little time to add myself. Contributions are appreciated. # \itemize{ # \item At the moment, nothing. # } # # If you consider to contribute, make sure it is not already # implemented by downloading the latest "devel" version! # } # # @author "*" # # \section{License}{ # The releases of this package is licensed under # GPL version 2 or newer. # # NB: Except for the \code{robustSmoothSpline()} method, # it is alright to distribute the rest of the package under # LGPL version 2.1 or newer. # # The development code of the packages is under a private licence # (where applicable) and patches sent to the author fall under the # latter license, but will be, if incorporated, released under the # "release" license above. # } # # \references{ # Some of the reference below can be found at # \url{https://www.aroma-project.org/publications/}.\cr # # [1] H. Bengtsson, \emph{Identification and normalization of plate effects # in cDNA microarray data}, Preprints in Mathematical Sciences, # 2002:28, Mathematical Statistics, Centre for Mathematical Sciences, # Lund University, 2002.\cr # # [2] @include "../incl/BengtssonH_2003.bib.Rdoc" \cr # # [3] H. Bengtsson, \emph{aroma - An R Object-oriented Microarray # Analysis environment}, Preprints in Mathematical Sciences (manuscript # in preparation), Mathematical Statistics, Centre for Mathematical # Sciences, Lund University, 2004.\cr # # [4] @include "../incl/BengtssonH_etal_2004.bib.Rdoc" \cr # # [5] @include "../incl/BengtssonHossjer_2006.bib.Rdoc" \cr # # [6] @include "../incl/BengtssonH_etal_2008.bib.Rdoc" \cr # # [7] @include "../incl/BengtssonH_etal_2009.bib.Rdoc" \cr # # [8] @include "../incl/BengtssonNeuvial_2010.bib.Rdoc" \cr # } #*/######################################################################### aroma.light/R/999.NonDocumentedObjects.R0000644000175000017500000000226614136047216017554 0ustar nileshnilesh###########################################################################/** # @RdocDocumentation "Non-documented objects" # # % Plot functions # @alias lines.XYCurveFit # # % Matrix operations # @alias rowAverages # @alias rowAverages.matrix # # % Simple linear-algebra # @alias projectUontoV # @alias scalarProduct # @alias tr # # % Miscellaneous statistical functions # @alias likelihood # @alias predict.lowess # # \description{ # This page contains aliases for all "non-documented" objects that # \code{R CMD check} detects in this package. # # Almost all of them are \emph{generic} functions that have specific # document for the corresponding method coupled to a specific class. # Other functions are re-defined by \code{setMethodS3()} to # \emph{default} methods. Neither of these two classes are non-documented # in reality. # The rest are deprecated methods. # } # # @keyword internal #*/########################################################################### ############################################################################ # HISTORY: # 2005-02-10 # o Created to please R CMD check. ############################################################################ aroma.light/R/wpca.R0000644000175000017500000002367414136047216014107 0ustar nileshnilesh#########################################################################/** # @RdocGeneric wpca # @alias wpca.matrix # # @title "Light-weight Weighted Principal Component Analysis" # # \usage{ # @usage wpca,matrix # } # # \description{ # Calculates the (weighted) principal components of a matrix, that is, # finds a new coordinate system (not unique) for representing the given # multivariate data such that # i) all dimensions are orthogonal to each other, and # ii) all dimensions have maximal variances. # } # # \arguments{ # \item{x}{An NxK @matrix.} # \item{w}{An N @vector of weights for each row (observation) in # the data matrix. If @NULL, all observations get the same weight, # that is, standard PCA is used.} # \item{center}{If @TRUE, the (weighted) sample mean column @vector is # subtracted from each column in \code{mat}, first. # If data is not centered, the effect will be that a linear subspace # that goes through the origin is fitted.} # \item{scale}{If @TRUE, each column in \code{mat} is # divided by its (weighted) root-mean-square of the # centered column, first.} # \item{method}{If \code{"dgesdd"} LAPACK's divide-and-conquer # based SVD routine is used (faster [1]). # If \code{"dgesvd"}, LAPACK's QR-decomposition-based routine is used. # } # \item{swapDirections}{If @TRUE, the signs of eigenvectors # that have more negative than positive components are inverted. # The signs of corresponding principal components are also inverted. # This is only of interest when for instance visualizing or comparing # with other PCA estimates from other methods, because the # PCA (SVD) decomposition of a matrix is not unique. # } # \item{...}{Not used.} # } # # \value{ # Returns a @list with elements: # \item{pc}{An NxK @matrix where the column @vectors are the # principal components (a.k.a. loading vectors, # spectral loadings or factors etc).} # \item{d}{An K @vector containing the eigenvalues of the # principal components.} # \item{vt}{An KxK @matrix containing the eigenvector of the # principal components.} # \item{xMean}{The center coordinate.} # # It holds that \code{x == t(t(fit$pc \%*\% fit$vt) + fit$xMean)}. # } # # \section{Method}{ # A singular value decomposition (SVD) is carried out. # Let X=\code{mat}, then the SVD of the matrix is \eqn{X = U D V'}, where # \eqn{U} and \eqn{V} are orthogonal, and \eqn{D} is a diagonal matrix # with singular values. The principal returned by this method are \eqn{U D}. # # Internally \code{La.svd()} (or \code{svd()}) of the \pkg{base} # package is used. # For a popular and well written introduction to SVD see for instance [2]. # } # # \examples{ # @include "../incl/wpca.matrix.Rex" # # if (dev.cur() > 1) dev.off() # # @include "../incl/wpca2.matrix.Rex" # } # # @author # # \references{ # [1] J. Demmel and J. Dongarra, \emph{DOE2000 Progress Report}, 2004. # \url{https://people.eecs.berkeley.edu/~demmel/DOE2000/Report0100.html} \cr # [2] Todd Will, \emph{Introduction to the Singular Value Decomposition}, # UW-La Crosse, 2004. \url{http://websites.uwlax.edu/twill/svd/} \cr # } # # \seealso{ # For a iterative re-weighted PCA method, see @see "iwpca". # For Singular Value Decomposition, see @see "base::svd". # For other implementations of Principal Component Analysis functions see # (if they are installed): # @see "stats::prcomp" in package \pkg{stats} and \code{pca()} in package # \pkg{pcurve}. # } # # @keyword "algebra" #*/######################################################################### setMethodS3("wpca", "matrix", function(x, w=NULL, center=TRUE, scale=FALSE, method=c("dgesdd", "dgesvd"), swapDirections=FALSE, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'x' x <- as.matrix(x); # The dimensions of 'x' N <- nrow(x); K <- ncol(x); # Standardizes the weights to [0,1] such that they sum to 1. if (!is.null(w)) { w <- rep(w, length.out=N); w <- w/sum(w); if (anyMissing(w)) stop("Argument 'w' has missing values."); } ## Argument 'method': method <- match.arg(method, choices = c("dgesdd", "dgesvd")) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Weighted or non-weighted centering and rescaling of the data # # Note: The following split of (center == TRUE) and (center == FALSE) # is to minimize memory usage. In other words, the codes is longer, # but more memory efficient. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (center || scale) { if (is.null(w)) { # Calculates the standard column means xMean <- colMeans(x, na.rm=TRUE); # a K vector } else { # Calculates the weighted column means (recall that sum(w) == 1) xMean <- as.vector(w %*% x); # a K vector } if (center) { # Centers the data directly by subtracting the column means for (kk in 1:ncol(x)) x[,kk] <- x[,kk] - xMean[kk]; } else { # ...or calculates the centered data for rescaling xc <- x; for (kk in 1:ncol(x)) xc[,kk] <- x[,kk] - xMean[kk]; } if (scale) { if (is.null(w)) { # Non-weighted root-mean-squares rms <- function(v) { # v - column vector of length N v <- v[!is.na(v)]; sqrt(sum(v^2)/max(1, length(v)-1)); } } else { # Weighted root-mean-squares rms <- function(v) { # v - column vector of length N ok <- !is.na(v); v <- w[ok]*v[ok]; sqrt(sum(v^2)/max(1, length(v)-1)); } } if (center) { xRMS <- apply(x, MARGIN=2, FUN=rms); } else { xRMS <- apply(xc, MARGIN=2, FUN=rms); # Not needed anymore xc <- NULL; } for (kk in 1:ncol(x)) x[,kk] <- x[,kk] / xRMS[kk]; # Not needed anymore xRMS <- rms <- NULL; } } else { xMean <- rep(0, length=K); } # Weight the observations? if (!is.null(w)) { x <- sqrt(w)*x; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. Singular Value Decomposition, i.e. X = U D V' # # "We compare DGESVD, the original QR-based routines from # LAPACK 1.0, with DGESDD, the new divide-and-conquer based # routine from LAPACK 3.0. The table below shows the speeds # on several machines. The new routine is 5.7 to 16.8 times # faster than the old routine. Part of the speed results # from doing many fewer operations, and the rest comes from # doing them faster (a high Mflop rate)." [1] # [1] J. Demmel and J. Dongarra, DOE2000 Progress Report, # http://www.cs.berkeley.edu/~demmel/DOE2000/Report0100.html # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (method == "dgesdd" || method == "dgesvd") { duvt <- La.svd(x); } else { stop(sprintf("Unknown LAPACK or LINPACK routine to solve SVD: %s", method)); } # 'duvt' is a list with the follwing components: # # u - a NxK matrix whose columns contain the left singular # vectors (eigenvectors) of 'x'. # It holds that t(u) %*% u == I # d - a K vector containing the singular value of # each principal component on its diagonal. # It holds that d[1] >= d[2] >= ... d[K] >= 0. # vt - a KxK transposed matrix whose columns contain the right # singular vectors (eigenvector) of 'x'. # It holds that t(v) %*% v == I # Not need anymore, in case a local copy has been created! x <- NULL; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 4. The PCA principal components # # (a.k.a. loading vectors, spectral loadings or factors). # # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d <- duvt$d; vt <- duvt$vt; pc <- duvt$u; # Not need anymore duvt <- NULL; # Note: D == diag(duvt$d) is memory expensive since the dimensions of D # is the same as the dimensions of 'x'. Thus, it unwise to do: # pc <- duvt$u %*% diag(duvt$d); for (kk in seq_len(N)) pc[kk,] <- pc[kk,] * d; if (!is.null(w)) { # Rescale the principal components pc <- pc / sqrt(w); # Not need anymore w <- NULL; } if (swapDirections) { swap <- apply(vt, MARGIN=1, FUN=function(z) sum(sign(z)) < 0); # Which eigenvectors should swap signs? swap <- which(swap); for (kk in swap) { vt[kk,] <- -vt[kk,]; pc[,kk] <- -pc[,kk]; } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 4. Return the parameter estimates # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - res <- list(pc=pc, d=d, vt=vt, xMean=xMean); class(res) <- "WPCAFit"; res; }) # wpca() ############################################################################ # HISTORY: # 2015-05-24 # o Removed obsolete method="dsvdc"; only needed in R (< 1.7.0). # 2013-09-26 # o Now utilizing anyMissing(). # 2006-06-26 # o Function would not work in R v2.4.0 devel, because argument 'method' was # removed from La.svd(). # 2006-04-25 # o Updated the URL to Todd Will's webpage. # 2005-02-20 # o Added '...' to please R CMD check. # 2005-02-20 # o Now using setMethodS3() and added '...' to please R CMD check. # 2005-01-24 # o Added a check for missing values of argument 'w'. # 2004-05-14 # o Made into a method of class matrix instead of a stand-alone function. # 2003-03-09 # o Created! Verified that it gives similar results as acp(). ############################################################################ aroma.light/R/averageQuantile.R0000644000175000017500000001167214136047216016265 0ustar nileshnilesh###########################################################################/** # @RdocGeneric averageQuantile # @alias averageQuantile.list # @alias averageQuantile.matrix # # @title "Gets the average empirical distribution" # # \usage{ # @usage averageQuantile,list # @usage averageQuantile,matrix # } # # \description{ # @get "title" for a set of samples. # } # # \arguments{ # \item{X}{A @list with K @numeric @vectors, or a @numeric NxK @matrix. # If a @list, the @vectors may be of different lengths.} # \item{...}{Not used.} # } # # \value{ # Returns a @numeric @vector of length equal to the longest @vector # in argument \code{X}. # } # # \section{Missing values}{ # Missing values are excluded. # } # # \seealso{ # @see "normalizeQuantileRank". # @see "normalizeQuantileSpline". # @see "stats::quantile". # } # # \author{ # Parts adopted from Gordon Smyth (\url{http://www.statsci.org/}) in 2002 # \& 2006. Original code by Ben Bolstad at Statistics Department, # University of California. # } # # @keyword "nonparametric" # @keyword "multivariate" # @keyword "robust" #*/########################################################################### setMethodS3("averageQuantile", "list", function(X, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X': nbrOfChannels <- length(X); # Nothing to do? if(nbrOfChannels == 1L) return(X); nbrOfObservations <- unlist(lapply(X, FUN=length), use.names=FALSE); maxNbrOfObservations <- max(nbrOfObservations); # Nothing to do? if(maxNbrOfObservations == 1L) return(X); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Get the sample quantile for all channels (columns) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Construct the sample quantiles quantiles <- (0:(maxNbrOfObservations-1L))/(maxNbrOfObservations-1L); # Create a vector to hold the target distribution xTarget <- vector("double", length=maxNbrOfObservations); for (cc in 1:nbrOfChannels) { Xcc <- X[[cc]]; # Order and sort the values Scc <- sort(Xcc, na.last=NA); # The number of non-NA observations nobs <- length(Scc); # Too few data points? if(nobs < maxNbrOfObservations) { # Get the sample quantiles for those values bins <- (0:(nobs-1L))/(nobs-1L); # Interpolate to get the values at positions specified by # 'quantile' using data points given by 'bins' and 'Scc'. Scc <- approx(x=bins, y=Scc, xout=quantiles, ties="ordered")$y; bins <- NULL; # Not needed anymore } # Incremental mean xTarget <- xTarget + Scc; Scc <- NULL; # Not needed anymore } Xcc <- NULL; # Not needed anymore xTarget <- xTarget/nbrOfChannels; xTarget; }) # averageQuantile.list() setMethodS3("averageQuantile", "matrix", function(X, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nbrOfChannels <- ncol(X); # Nothing to do? if(nbrOfChannels == 1L) return(X); nbrOfObservations <- nrow(X); # Nothing to do? if(nbrOfObservations == 1L) return(X); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Get the sample quantile for all channels (columns) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Construct the sample quantiles quantiles <- (0:(nbrOfObservations-1L))/(nbrOfObservations-1L); # Create a vector to hold the target distribution xTarget <- vector("double", length=nbrOfObservations); for (cc in 1:nbrOfChannels) { Xcc <- X[,cc,drop=TRUE]; # Order and sort the values Scc <- sort(Xcc, na.last=NA); # The number of non-NA observations nobs <- length(Scc); # Too few data points? if(nobs < nbrOfObservations) { # Get the sample quantiles for those values bins <- (0:(nobs-1L))/(nobs-1L); # Interpolate to get the values at positions specified by # 'quantile' using data points given by 'bins' and 'Scc'. Scc <- approx(x=bins, y=Scc, xout=quantiles, ties="ordered")$y; bins <- NULL; # Not needed anymore } # Incremental mean xTarget <- xTarget + Scc; Scc <- NULL; # Not needed anymore } Xcc <- NULL; # Not needed anymore xTarget <- xTarget/nbrOfChannels; xTarget; }) # averageQuantile.matrix() ############################################################################## # HISTORY: # 2013-10-08 # o Added averageQuantile() for matrices. # 2007-01-22 # o BUG FIX: averageQuantile.list() did not deal with vectors of different # length correctly. Thanks Alicia Oshlack, WEHI. # 2006-05-12 # o Created from normalizeQuantile.matrix.R. It has been optimized for # memory. Hence, the normalization is done using a two-pass procedure. ############################################################################## aroma.light/R/backtransformXYCurve.matrix.R0000644000175000017500000000216314136047216020570 0ustar nileshnileshsetMethodS3("backtransformXYCurve", "matrix", function(X, fit, targetChannel=1, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'X' if (ncol(X) != 2) { stop("Curve-fit normalization requires two channels only: ", ncol(X)); } # Argument 'targetChannel': # targetChannel <- Arguments$getIndex(targetChannel, range=c(1,ncol(X))); # Allocate result XN <- X; # Predict using only finite covariates (otherwise an error) keep <- which(is.finite(X[,targetChannel])); # Nothing to do? if (length(keep) > 0) { X <- X[keep,,drop=FALSE]; xN <- fit$predictY(X[,targetChannel]); delta <- xN - X[,targetChannel]; # Not needed anymore xN <- NULL; XN[keep,-targetChannel] <- X[,-targetChannel] - delta; # Not needed anymore keep <- delta <- NULL; } XN; }) ############################################################################ # HISTORY: # 2009-07-15 # o Created. ############################################################################ aroma.light/R/predict.lowess.R0000644000175000017500000000054214136047216016107 0ustar nileshnileshsetMethodS3("predict", "lowess", function(object, newdata=NULL, ties=mean, ...) { approx(object, xout=newdata, ties=ties, ...)$y; }, private=TRUE) # predict() ############################################################################ # HISTORY: # 2006-11-28 # o Created. ############################################################################ aroma.light/R/normalizeTumorBoost.R0000644000175000017500000002616614136047216017212 0ustar nileshnilesh###########################################################################/** # @RdocGeneric normalizeTumorBoost # @alias normalizeTumorBoost.numeric # # @title "Normalizes allele B fractions for a tumor given a match normal" # # \description{ # TumorBoost [1] is a normalization method that normalizes the allele B # fractions of a tumor sample given the allele B fractions and genotypes # of a matched normal. # The method is a single-sample (single-pair) method. # It does not require total copy-number estimates. # The normalization is done such that the total copy number is # unchanged afterwards. # } # # \usage{ # @usage normalizeTumorBoost,numeric # } # # \arguments{ # \item{betaT, betaN}{Two @numeric @vectors each of length J with # tumor and normal allele B fractions, respectively.} # \item{muN}{An optional @vector of length J containing # normal genotypes calls in (0,1/2,1,@NA) for (AA,AB,BB).} # \item{preserveScale}{If @TRUE, SNPs that are heterozygous in the # matched normal are corrected for signal compression using an estimate # of signal compression based on the amount of correction performed # by TumorBoost on SNPs that are homozygous in the matched normal.} # \item{flavor}{A @character string specifying the type of # correction applied.} # \item{...}{Not used.} # } # # \value{ # Returns a @numeric @vector of length J containing the normalized # allele B fractions for the tumor. # Attribute \code{modelFit} is a @list containing model fit parameters. # } # # \details{ # Allele B fractions are defined as the ratio between the allele B signal # and the sum of both (all) allele signals at the same locus. # Allele B fractions are typically within [0,1], but may have a slightly # wider support due to for instance negative noise. # This is typically also the case for the returned normalized # allele B fractions. # } # # \section{Flavors}{ # This method provides a few different "flavors" for normalizing the # data. The following values of argument \code{flavor} are accepted: # \itemize{ # \item{v4: (default) The TumorBoost method, i.e. Eqns. (8)-(9) in [1].} # \item{v3: Eqn (9) in [1] is applied to both heterozygous and homozygous # SNPs, which effectively is v4 where the normalized allele B # fractions for homozygous SNPs becomes 0 and 1.} # \item{v2: ...} # \item{v1: TumorBoost where correction factor is forced to one, i.e. # \eqn{\eta_j=1}. As explained in [1], this is a suboptimal # normalization method. See also the discussion in the # paragraph following Eqn (12) in [1].} # } # } # # \section{Preserving scale}{ # \emph{As of \pkg{aroma.light} v1.33.3 (March 30, 2014), # argument \code{preserveScale} no longer has a default value and has # to be specified explicitly. This is done in order to change the # default to @FALSE in a future version, while minimizing the risk # for surprises.} # # Allele B fractions are more or less compressed toward a half, e.g. # the signals for homozygous SNPs are slightly away from zero and one. # The TumorBoost method decreases the correlation in allele B fractions # between the tumor and the normal \emph{conditioned on the genotype}. # What it does not control for is the mean level of the allele B fraction # \emph{conditioned on the genotype}. # # By design, most flavors of the method will correct the homozygous SNPs # such that their mean levels get close to the expected zero and # one levels. However, the heterozygous SNPs will typically keep the # same mean levels as before. # One possibility is to adjust the signals such as the mean levels of # the heterozygous SNPs relative to that of the homozygous SNPs is # the same after as before the normalization. # # If argument \code{preserveScale=TRUE}, then SNPs that are heterozygous # (in the matched normal) are corrected for signal compression using # an estimate of signal compression based on the amount of correction # performed by TumorBoost on SNPs that are homozygous # (in the matched normal). # # The option of preserving the scale is \emph{not} discussed in the # TumorBoost paper [1], which presents the \code{preserveScale=FALSE} # version. # } # # @examples "../incl/normalizeTumorBoost.Rex" # # @author "HB, PN" # # \references{ # [1] @include "../incl/BengtssonNeuvial_2010.bib.Rdoc" \cr # } #*/########################################################################### setMethodS3("normalizeTumorBoost", "numeric", function(betaT, betaN, muN=callNaiveGenotypes(betaN), preserveScale=FALSE, flavor=c("v4", "v3", "v2", "v1"), ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'betaT' & 'betaN': betaT <- as.numeric(betaT); betaN <- as.numeric(betaN); J <- length(betaT); if (length(betaN) != J) { stop("The length of arguments 'betaT' and 'betaN' differ: ", length(betaN), " != ", J); } # Argument: 'muN': if (length(muN) != J) { stop("Argument 'muN' does not match the number of loci: ", length(muN), " != ", J); } knownGenotypes <- c(0, 1/2, 1, NA); unknown <- which(!is.element(muN, knownGenotypes)); n <- length(unknown); if (n > 0) { unknown <- unique(muN[unknown]); stop("Argument 'muN' contains unknown values: ", hpaste(unknown)); } # Argument: 'preserveScale': preserveScale <- as.logical(preserveScale); # Argument: 'flavor': flavor <- match.arg(flavor); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Extract data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Identify set to be updated toUpdate <- which(is.finite(betaT) & is.finite(betaN) & is.finite(muN)); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Estimate delta # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - delta <- (betaN - muN); if (flavor == "v1") { b <- 1; } else if (flavor == "v2") { b <- rep(1, times=length(delta)); isDown <- (betaT < betaN); isBetaNZero <- (betaN == 0); isBetaNOne <- (betaN == 1); idxs <- which(isDown & !isBetaNZero); b[idxs] <- betaT[idxs]/betaN[idxs]; idxs <- which(!isDown & !isBetaNOne); b[idxs] <- (1-betaT[idxs])/(1-betaN[idxs]); # Not needed anymore isDown <- idxs <- NULL; # Treat the case when the estimated SNP effect is zero # Then we want the normalized value to be exactly zero or one. idxs <- which(delta == 0); } else if (flavor == "v3") { b <- rep(1, times=length(delta)); isHomA <- (muN == 0); isHomB <- (muN == 1); isHet <- (!isHomA & !isHomB); isDown <- (betaT < betaN); isBetaNZero <- (betaN == 0); isBetaNOne <- (betaN == 1); idxs <- which((isHet & isDown & !isBetaNZero) | (isHomA & !isBetaNZero)); b[idxs] <- betaT[idxs]/betaN[idxs]; idxs <- which((isHet & !isDown & !isBetaNOne) | (isHomB & !isBetaNOne)); b[idxs] <- (1-betaT[idxs])/(1-betaN[idxs]); # Not needed anymore isDown <- isHet <- isHomA <- isHomB <- idxs <- NULL; } else if (flavor == "v4") { # This is the published TumorBoost normalization method b <- rep(1, times=length(delta)); isHet <- (muN != 0 & muN != 1); isDown <- (betaT < betaN); idxs <- which(isHet & isDown); b[idxs] <- betaT[idxs]/betaN[idxs]; idxs <- which(isHet & !isDown); b[idxs] <- (1-betaT[idxs])/(1-betaN[idxs]); # Not needed anymore isDown <- isHet <- idxs <- NULL; } delta <- b * delta; # Sanity check stopifnot(length(delta) == J); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Normalize # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # In very rare cases delta can be non-finite while betaT is. # This can happen whenever muN or betaN is non-finite. Then: # ok <- is.finite(delta); # ok <- which(ok); # betaTN[ok] <- betaT[ok] - delta[ok]; # It can be debated whether one should correct a SNP in this case, for # which betaTN then become non-finite too. If not correcting, we will # end up with betaTN == betaT value which is not from the same mixture # distribution as the other corrected values. # For now, we ignore this. /HB 2010-08-19 [on the flight to SFO] betaTN <- betaT - delta; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Preserve scale of heterozygotes relative to homozygotes # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (preserveScale) { isHom <- (muN == 0 | muN == 1); idxs <- which(isHom); # Signal compression in homozygous SNPs before TBN eta <- median(abs(betaT[idxs]-1/2), na.rm=TRUE); # Signal compression in homozygous SNPs after TBN etaC <- median(abs(betaTN[idxs]-1/2), na.rm=TRUE); # Correction factor sf <- etaC/eta; # Correct isHet <- !isHom; isDown <- (betaTN < 1/2); idxs <- which(isHet & isDown); betaTN[idxs] <- 1/2 - sf * (1/2 - betaTN[idxs]); idxs <- which(isHet & !isDown); betaTN[idxs] <- 1/2 + sf * (betaTN[idxs] - 1/2); # Not needed anymore isDown <- isHom <- isHet <- idxs <- eta <- etaC <- NULL; } else { sf <- NA_real_; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Return normalized data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - modelFit <- list( method = "normalizeTumorBoost", flavor = flavor, delta = delta, preserveScale = preserveScale, scaleFactor = sf ); attr(betaTN, "modelFit") <- modelFit; # Sanity check stopifnot(length(betaTN) == J); betaTN; }) # normalizeTumorBoost() ############################################################################ # HISTORY: # 2014-03-30 # o Argument 'preserveScale' for normalizeTumorBoost() is now required. # o Swapped the order of argument 'flavor' and 'preserveScale'. # 2010-09-23 # o CLEANUP: normalizeTumorBoost() now uses which() instead of # whichVector() of 'R.utils'. The former used to be significantly # slower than the latter, but that is no longer the case. # 2010-08-04 # o Added argument 'preserveScale' to normalizeTumorBoost(). # 2010-03-18 # o BUG FIX: For flavors "v2" and "v3" NaN:s could be introduced if betaN # was exactly zero or exactly one. # 2009-07-08 # o Now the arguments are 'betaT', 'betaN' and 'muN'. # o Added an example() with real data. # 2009-07-06 # o Created from process() of TumorBoostNormalization in aroma.cn. # o Added model 'flavor' "v4" which corrects heterozygots according to "v2" # and homozygotes according to "v1". # o Added model 'flavor' "v3". Suggested by PN last night over a Guinness # at the pub after a long day of hard work. # 2009-06-22 # o Added model 'flavor' "v2". # 2009-06-08 # o The constructor of TumorBoostNormalization now only takes an # AromaUnitGenotypeCallSet for argument 'gcN'. It no longer takes an # AromaUnitFracBCnBinarySet object. # 2009-05-17 # o Now the constructor of TumorBoostNormalization asserts that there are # no stray arguments. # 2009-04-29 # o Created. ############################################################################ aroma.light/R/plotMvsA.R0000644000175000017500000000447714136047216014722 0ustar nileshnilesh#########################################################################/** # @RdocGeneric plotMvsA # @alias plotMvsA.matrix # # @title "Plot log-ratios vs log-intensities" # # \description{ # @get "title". # } # # \usage{ # @usage plotMvsA,matrix # } # # \arguments{ # \item{X}{Nx2 @matrix with two channels and N observations.} # \item{Alab,Mlab}{Labels on the x and y axes.} # \item{Alim,Mlim}{Plot range on the A and M axes.} # \item{aspectRatio}{Aspect ratio between \code{Mlim} and \code{Alim}.} # \item{pch}{Plot symbol used.} # \item{...}{Additional arguments accepted by @see "graphics::points".} # \item{add}{If @TRUE, data points are plotted in the current plot, # otherwise a new plot is created.} # } # # \details{ # Red channel is assumed to be in column one and green in column two. # Log-ratio are calculated taking channel one over channel two. # } # # \value{ # Returns nothing. # } # # @author "HB" #*/######################################################################### setMethodS3("plotMvsA", "matrix", function(X, Alab="A", Mlab="M", Alim=c(0,16), Mlim=c(-1,1)*diff(Alim)*aspectRatio, aspectRatio=1, pch=".", ..., add=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X': if (ncol(X) != 2) { throw("Argument 'X' must have exactly two columns: ", ncol(X)); } if (!add) { plot(NA, xlab=Alab, ylab=Mlab, xlim=Alim, ylim=Mlim); } # Do not plot (or generate false) M vs A for non-positive signals. X[X <= 0] <- NA; R <- as.double(X[,1]); G <- as.double(X[,2]); M <- log(R/G, base=2); A <- log(R*G, base=2)/2; points(A,M, pch=pch, ...); }) ############################################################################ # HISTORY: # 2011-06-26 # o Added argument 'aspectRatio' to plotMvsA(). It can be used to adjust # the range of the 'Mlim' argument relative to the 'Alim' argument. # 2005-09-06 # o Coercing to doubles to avoid overflow when multiplying to integers. # o Now non-positive signals are excluded. # 2005-06-11 # o BUG FIX: Used 'rg' instead of 'X' in R <- rg[,1] and G <- rg[,2]. # 2005-06-03 # o Created from the normalizeQuantile.matrix.Rex example. ############################################################################ aroma.light/R/distanceBetweenLines.R0000644000175000017500000001001114136047216017231 0ustar nileshnilesh#########################################################################/** # @RdocDefault distanceBetweenLines # # @title "Finds the shortest distance between two lines" # # \description{ # @get "title". # # Consider the two lines # # \eqn{x(s) = a_x + b_x*s} and \eqn{y(t) = a_y + b_y*t} # # in an K-space where the offset and direction @vectors are \eqn{a_x} # and \eqn{b_x} (in \eqn{R^K}) that define the line \eqn{x(s)} # (\eqn{s} is a scalar). Similar for the line \eqn{y(t)}. # This function finds the point \eqn{(s,t)} for which \eqn{|x(s)-x(t)|} # is minimal. # } # # @synopsis # # \arguments{ # \item{ax,bx}{Offset and direction @vector of length K for line \eqn{z_x}.} # \item{ay,by}{Offset and direction @vector of length K for line \eqn{z_y}.} # \item{...}{Not used.} # } # # \value{ # Returns the a @list containing # \item{ax,bx}{The given line \eqn{x(s)}.} # \item{ay,by}{The given line \eqn{y(t)}.} # \item{s,t}{The values of \eqn{s} and \eqn{t} such that # \eqn{|x(s)-y(t)|} is minimal.} # \item{xs,yt}{The values of \eqn{x(s)} and \eqn{y(t)} # at the optimal point \eqn{(s,t)}.} # \item{distance}{The distance between the lines, i.e. \eqn{|x(s)-y(t)|} # at the optimal point \eqn{(s,t)}.} # } # # @author "HB" # # @examples "../incl/distanceBetweenLines.Rex" # # \references{ # [1] M. Bard and D. Himel, \emph{The Minimum Distance Between Two # Lines in n-Space}, September 2001, Advisor Dennis Merino.\cr # [2] Dan Sunday, \emph{Distance between 3D Lines and Segments}, # Jan 2016, \url{https://www.geomalgorithms.com/algorithms.html}.\cr # } # # @keyword "algebra" #*/######################################################################### setMethodS3("distanceBetweenLines", "default", function(ax, bx, ay, by, ...) { if (length(ax) != length(bx)) { stop(sprintf("The length of the offset vector 'ax' (%d) and direction vector 'bx' (%d) are not equal.", length(ax), length(bx))); } if (length(ay) != length(by)) { stop(sprintf("The length of the offset vector 'ay' (%d) and direction vector 'by' (%d) are not equal.", length(ay), length(by))); } if (length(ax) != length(ay)) { stop(sprintf("The line x(s) and y(t) are of different dimensions: %d vs %d", length(ax), length(ay))); } if (length(ax) <= 1) stop(sprintf("The lines must be in two or more dimensions: %d", length(ax))); ax <- as.vector(ax); bx <- as.vector(bx); ay <- as.vector(ay); by <- as.vector(by); if (length(ax) == 2) { # Find (s,t) such that x(s) == y(t) where # x(s) = a_x + b_x*s # y(t) = a_y + b_y*t e <- (ax-ay); f <- e/by; g <- bx/by; s <- (f[2]-f[1])/(g[1]-g[2]); t <- f[1] + g[1]*s; d <- 0; } else { # Consider the two lines in an K-space # x(s) = a_x + b_x*t (line 1) # y(t) = a_y + b_y*s (line 2) # where s and t are scalars and the other vectors in R^K. # Some auxillary calculations A <- sum(bx*bx); B <- 2*(sum(bx*ax)-sum(bx*ay)); C <- 2*sum(bx*by); D <- 2*(sum(by*ay)-sum(by*ax)); E <- sum(by*by); F <- sum(ax*ax) + sum(ay*ay); # Shortest distance between the two lines (points) G <- C^2-4*A*E; d2 <- (B*C*D+B^2*E+C^2*F+A*(D^2-4*E*F))/G; d <- sqrt(d2); # The points that are closest to each other. t <- (2*A*D+B*C)/G; # t is on y(t) s <- (C*t-B)/(2*A); # s is on x(s) } # Get the coordinates of the two points on x(s) and y(t) that # are closest to each other. xs <- ax + bx*s; yt <- ay + by*t; list(ax=ax, bx=bx, ay=ay, by=by, s=s, t=t, xs=xs, yt=yt, distance=d); }) # distanceBetweenLines() ############################################################################ # HISTORY: # 2005-06-03 # o Made into a default method. # 2003-12-29 # o Added Rdoc comments. # o Created by generalizing from formet RGData$fitIWPCA() in com.braju.smax. ############################################################################ aroma.light/R/plotMvsMPairs.R0000644000175000017500000000416014136047216015722 0ustar nileshnilesh#########################################################################/** # @RdocGeneric plotMvsMPairs # @alias plotMvsMPairs.matrix # # @title "Plot log-ratios vs log-ratios for all pairs of columns" # # \description{ # @get "title". # } # # \usage{ # @usage plotMvsMPairs,matrix # } # # \arguments{ # \item{X}{Nx2K @matrix where N is the number of observations and # 2K is an even number of channels.} # \item{xlab,ylab}{Labels on the x and y axes.} # \item{xlim,ylim}{Plot range on the x and y axes.} # \item{pch}{Plot symbol used.} # \item{...}{Additional arguments accepted by @see "graphics::points".} # \item{add}{If @TRUE, data points are plotted in the current plot, # otherwise a new plot is created.} # } # # \details{ # Log-ratio are calculated by over paired columns, e.g. column 1 and 2, # column 3 and 4, and so on. # } # # \value{ # Returns nothing. # } # # @author "HB" #*/######################################################################### setMethodS3("plotMvsMPairs", "matrix", function(X, xlab="M", ylab="M", xlim=c(-1,1)*6, ylim=xlim, pch=".", ..., add=FALSE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument 'X': if (ncol(X)/2 != round(ncol(X)/2)) throw("Argument 'X' must have an even number of columns: ", ncol(X)); if (!add) { plot(NA, xlab=xlab, ylab=ylab, xlim=xlim, ylim=ylim); } # Do not plot (or generate false) M vs A for non-positive signals. X[X <= 0] <- NA; npairs <- ncol(X)/2; for (kk in npairs-1) { R <- X[,2*kk-1]; G <- X[,2*kk]; M1 <- log(R/G, base=2); R <- X[,2*(kk+1)-1]; G <- X[,2*(kk+1)]; M2 <- log(R/G, base=2); points(M1,M2, pch=pch, ...); } }) ############################################################################ # HISTORY: # 2005-09-06 # o Now non-positive signals are excluded. # 2005-06-11 # o BUG FIX: Used 'rg' instead of 'X'. # 2005-06-03 # o Created from the normalizeQuantile.matrix.Rex example. ############################################################################ aroma.light/R/fitXYCurve.R0000644000175000017500000001631514136047216015217 0ustar nileshnilesh#########################################################################/** # @RdocGeneric fitXYCurve # @alias fitXYCurve.matrix # @alias backtransformXYCurve # @alias backtransformXYCurve.matrix # # @title "Fitting a smooth curve through paired (x,y) data" # # \description{ # @get "title". # } # # \usage{ # @usage fitXYCurve,matrix # } # # \arguments{ # \item{X}{An Nx2 @matrix where the columns represent the two channels # to be normalized.} # \item{weights}{If @NULL, non-weighted normalization is done. # If data-point weights are used, this should be a @vector of length # N of data point weights used when estimating the normalization # function. # } # \item{typeOfWeights}{A @character string specifying the type of # weights given in argument \code{weights}. # } # \item{method}{@character string specifying which method to use when # fitting the intensity-dependent function. # Supported methods: # \code{"loess"} (better than lowess), # \code{"lowess"} (classic; supports only zero-one weights), # \code{"spline"} (more robust than lowess at lower and upper # intensities; supports only zero-one weights), # \code{"robustSpline"} (better than spline). # } # \item{bandwidth}{A @double value specifying the bandwidth of the # estimator used. # } # \item{satSignal}{Signals equal to or above this threshold will not # be used in the fitting. # } # \item{...}{Not used.} # } # # \value{ # A named @list structure of class \code{XYCurve}. # } # # \section{Missing values}{ # The estimation of the function will only be made based on complete # non-saturated observations, i.e. observations that contains no @NA # values nor saturated values as defined by \code{satSignal}. # } # # \section{Weighted normalization}{ # Each data point, that is, each row in \code{X}, which is a # vector of length 2, can be assigned a weight in [0,1] specifying how much # it should \emph{affect the fitting of the normalization function}. # Weights are given by argument \code{weights}, which should be a @numeric # @vector of length N. # # Note that the lowess and the spline method only support zero-one # \{0,1\} weights. # For such methods, all weights that are less than a half are set to zero. # } # # \section{Details on loess}{ # For @see "stats::loess", the arguments \code{family="symmetric"}, # \code{degree=1}, \code{span=3/4}, # \code{control=loess.control(trace.hat="approximate"}, # \code{iterations=5}, \code{surface="direct")} are used. # } # # @author "HB" # # \examples{ # @include "../incl/fitXYCurve.matrix.Rex" # } #*/######################################################################### setMethodS3("fitXYCurve", "matrix", function(X, weights=NULL, typeOfWeights=c("datapoint"), method=c("loess", "lowess", "spline", "robustSpline"), bandwidth=NULL, satSignal=2^16-1, ...) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Verify the arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Argument: 'X' if (ncol(X) != 2) { stop("Curve-fit normalization requires two channels only: ", ncol(X)); } if (nrow(X) < 3) { stop("Curve-fit normalization requires at least three observations: ", nrow(X)); } # Argument: 'satSignal' if (satSignal < 0) { stop("Argument 'satSignal' is negative: ", satSignal); } # Argument: 'method' method <- match.arg(method); zeroOneWeightsOnly <- (method %in% c("lowess", "spline")); # Argument: 'typeOfWeights' typeOfWeights <- match.arg(typeOfWeights); # Argument: 'weights' datapointWeights <- NULL; if (!is.null(weights)) { # If 'weights' is an object of a class with as.double(), cast it. weights <- as.double(weights); if (anyMissing(weights)) stop("Argument 'weights' must not contain NA values."); if (any(weights < 0 | weights > 1)) { stop("Argument 'weights' out of range [0,1]: ", paste(weights[weights < 0.0 | weights > 1.0], collapse=", ")); } if (zeroOneWeightsOnly && any(weights > 0 & weights < 1)) { weights <- round(weights); warning("Weights were rounded to {0,1} since '", method, "' normalization supports only zero-one weights."); } weights <- as.vector(weights); if (length(weights) == 1) { weights <- rep(weights, length.out=nrow(X)); } else if (length(weights) != nrow(X)) { stop("Argument 'weights' does not have the same length as the number of data points (rows) in the matrix: ", length(weights), " != ", nrow(X)); } datapointWeights <- weights; } # if (!is.null(weights)) # Argument: 'bandwidth' if (is.null(bandwidth)) { bandwidths <- c("loess"=0.75, "lowess"=0.3, "robustSpline"=0.75, "spline"=0.75); bandwidth <- bandwidths[method]; } else if (!is.numeric(bandwidth) || bandwidth <= 0 || bandwidth > 1) { stop("Argument 'bandwidth' must be in [0,1): ", bandwidth); } else if (length(bandwidth) != 1) { stop("Argument 'bandwidth' must be a scalar: ", paste(bandwidth, collapse=", ")); } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Prepare data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Use only positive non-saturated observations to estimate the # normalization function isValid <- (is.finite(X) & (X <= satSignal)); isValid <- (isValid[,1] & isValid[,2]); X <- X[isValid,]; x <- X[,1,drop=TRUE]; y <- X[,2,drop=TRUE]; if (!is.null(datapointWeights)) { datapointWeights <- datapointWeights[isValid]; } # Not needed anymore X <- isValid <- NULL; # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. Fit the curve # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (method == "lowess") { keep <- if (!is.null(datapointWeights)) (datapointWeights > 0) else TRUE; x <- x[keep]; y <- y[keep]; # Not needed anymore keep <- NULL; fit <- lowess(x=x, y=y, f=bandwidth, ...); fit$predictY <- function(x) approx(fit, xout=x, ties=mean)$y; } else if (method == "loess") { fit <- loess(formula=y ~ x, weights=datapointWeights, family="symmetric", degree=1, span=bandwidth, control=loess.control(trace.hat="approximate", iterations=5, surface="direct"), ...); fit$predictY <- function(x) predict(fit, newdata=x); } else if (method == "spline") { keep <- if (!is.null(datapointWeights)) (datapointWeights > 0) else TRUE; x <- x[keep]; y <- y[keep]; # Not needed anymore keep <- NULL; fit <- smooth.spline(x=x, y=y, spar=bandwidth, ...); fit$predictY <- function(x) predict(fit, x=x)$y; } else if (method == "robustSpline") { fit <- robustSmoothSpline(x=x, y=y, w=datapointWeights, spar=bandwidth, ...); fit$predictY <- function(x) predict(fit, x=x)$y; } class(fit) <- c("XYCurveFit", class(fit)); fit; }) # fitXYCurve() ############################################################################ # HISTORY: # 2013-10-08 # o DOCUMENTATION: Added backtransformXYCurve() alias to this help page. # 2013-09-26 # o Now utilizing anyMissing(). # 2009-07-15 # o Created from normalizeCurveFit.R. ############################################################################ aroma.light/R/backtransformAffine.R0000644000175000017500000001446114136047216017114 0ustar nileshnilesh#########################################################################/** # @RdocGeneric backtransformAffine # @alias backtransformAffine.matrix # # @title "Reverse affine transformation" # # \description{ # @get "title". # } # # \usage{ # @usage backtransformAffine,matrix # } # # \arguments{ # \item{X}{An NxK @matrix containing data to be backtransformed.} # \item{a}{A scalar, @vector, a @matrix, or a @list. # First, if a @list, it is assumed to contained the elements \code{a} # and \code{b}, which are the used as if they were passed as separate # arguments. # If a @vector, a matrix of size NxK is created which is then filled # \emph{row by row} with the values in the vector. Commonly, the # vector is of length K, which means that the matrix will consist of # copies of this vector stacked on top of each other. # If a @matrix, a matrix of size NxK is created which is then filled # \emph{column by column} with the values in the matrix (collected # column by column. Commonly, the matrix is of size NxK, or NxL with # L < K and then the resulting matrix consists of copies sitting # next to each other. # The resulting NxK matrix is subtracted from the NxK matrix \code{X}. # } # \item{b}{A scalar, @vector, a @matrix. # A NxK matrix is created from this argument. For details see # argument \code{a}. # The NxK matrix \code{X-a} is divided by the resulting NxK matrix. # } # \item{project}{ # returned (K values per data point are returned). # If @TRUE, the backtransformed values "\code{(X-a)/b}" are projected # onto the line L(a,b) so that all columns # will be identical. # } # \item{...}{Not used.} # } # # \value{ # The "\code{(X-a)/b}" backtransformed NxK @matrix is returned. # If \code{project} is @TRUE, an Nx1 @matrix is returned, because # all columns are identical anyway. # } # # \section{Missing values}{ # Missing values remain missing values. If projected, data points that # contain missing values are projected without these. # } # # @examples "../incl/backtransformAffine.matrix.Rex" # #*/######################################################################### setMethodS3("backtransformAffine", "matrix", function(X, a=NULL, b=NULL, project=FALSE, ...) { # Dimensions of 'X' nobs <- nrow(X); ndims <- ncol(X); if (ndims == 1L) { stop("Can not fit affine multiscan model. Matrix must contain at least two columns (scans): ", ndims); } # If argument 'a' is a list assume it contains the elements 'a' and 'b'. if (is.list(a)) { b <- a$b; a <- a$a; } # If 'a' and/or 'b' are vector convert them to row matrices. if (is.vector(a)) { # Create a full matrix and filled row by row with 'a' a <- matrix(a, nrow=nobs, ncol=ndims, byrow=TRUE); } else if (is.matrix(a)) { # Create a full matrix and filled column by column by the columns in 'a' t <- a; a <- matrix(NA_real_, nrow=nobs, ncol=ndims); for (cc in 1:ndims) { # Loop over the columns in a0 too. col <- ((cc-1) %% ncol(t)) + 1L; value <- rep(t[,col], length.out=nobs); a[,cc] <- value; } # Not needed anymore t <- NULL; } else if (!is.null(a)) { stop(paste("Unknown data type of argument 'a':", class(a)[1])); } if (!project) { if (is.vector(b)) { # Create a full matrix and filled row by row with 'b' b <- matrix(b, nrow=nobs, ncol=ndims, byrow=TRUE); } else if (is.matrix(b)) { # Create a full matrix and filled column by column by the columns in 'b' t <- b; b <- matrix(NA_real_, nrow=nobs, ncol=ndims); for (cc in 1:ndims) { # Loop over the columns in a0 too. col <- ((cc-1) %% ncol(t)) + 1L; value <- rep(t[,col], length.out=nobs); b[,cc] <- value; } } else if (!is.null(b)) { stop(paste("Unknown data type of argument 'b':", class(b)[1])); } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Subtract the bias and rescale # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (!is.null(a)) X <- X - a; ######################################################################## # Alternative 2 # # i) Translate the fitted line L to L' such that L' goes through # (a,a,...,a) and project the data y onto L' to obtain ytilde # ii) from which we can calculate xtilde = (ytilde - a) / b # iii) Since all xtilde are the same take the first component to be our # estimate xhat in y = a + b*xhat. ######################################################################## if (project) { # In theory: # ytilde <- projectUontoV(y-a,b) + a; # xtilde <- (ytilde-a)/b; # In practice: X <- t(X); # 'b' standardized to a unit vector such that == 1. v <- b / sqrt(sum(b^2)); # projectUontoV(): U should be an NxK matrix and v an N vector. X <- projectUontoV(X,v, na.rm=TRUE); X <- X[1,] / b[1]; # Note that here 'b' is a vector! } else { if (!is.null(b)) X <- X / b; # Note that here 'b' is a matrix! } as.matrix(X); }) # backtransformAffine() ############################################################################ # HISTORY: # 2011-04-12 # o Now using as.double(NA) instead of NA. # 2006-06-03 # o Minor to merge two different threads of this code. # o Method passes the tests in the example code (again). # 2005-01-24 # o Now missing values are excluded before projection. # 2005-01-08 # o Now, if project is TRUE, only one column is returned. # o Now the method is guaranteed to return a matrix by calling as.matrix(). # o The average of projected data is now no the same scale as the average on # non-projected data. Before the data was max(b) times too large. # o Added argument 'project' to the Rdoc comments. # o Added test in example to assert that the same matrix is returned if # projection on an identity transformation is applied. # 2004-06-28 # o BUG FIX: Applied projection when project was FALSE and vice versa. # Projection did not work because 'b' was expanded into a full matrix. # Now this is only done if project == FALSE. # 2004-05-14 # o Created. Extracted and generalize code from calibrateMultiscan(), # normalizeAffine() and calibrateMultiscanSpatial(). ############################################################################ aroma.light/R/medianPolish.R0000644000175000017500000001261314136047216015560 0ustar nileshnilesh#########################################################################/** # @RdocGeneric medianPolish # @alias medianPolish.matrix # # @title "Median polish" # # \description{ # @get "title". # } # # \usage{ # @usage medianPolish,matrix # } # # \arguments{ # \item{X}{N-times-K @matrix} # \item{tol}{A @numeric value greater than zero used as a threshold # to identify when the algorithm has converged.} # \item{maxIter}{Maximum number of iterations.} # \item{na.rm}{If @TRUE (@FALSE), @NAs are exclude (not exclude). # If @NA, it is assumed that \code{X} contains no @NA values.} # \item{.addExtra}{If @TRUE, the name of argument \code{X} is returned # and the returned structure is assigned a class. This will make the # result compatible what @see "stats::medpolish" returns.} # \item{...}{Not used.} # } # # \value{ # Returns a named @list structure with elements: # \item{overall}{The fitted constant term.} # \item{row}{The fitted row effect.} # \item{col}{The fitted column effect.} # \item{residuals}{The residuals.} # \item{converged}{If @TRUE, the algorithm converged, otherwise not.} # } # # \details{ # The implementation of this method give identical estimates as # @see "stats::medpolish", but is about 3-5 times more efficient when # there are no @NA values. # } # # @author "HB" # # @examples "../incl/medianPolish.matrix.Rex" # # \seealso{ # @see "stats::medpolish". # } # # @keyword algebra #*/######################################################################### setMethodS3("medianPolish", "matrix", function(X, tol=0.01, maxIter=10L, na.rm=NA, ..., .addExtra=TRUE) { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Local functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ns <- getNamespace("matrixStats") .psortKM <- get(".psortKM", mode="function", envir=ns); dim <- dim(X); nrow <- dim[1L]; ncol <- dim[2L]; if (.addExtra) { name <- deparse(substitute(X)); } # Overall effects t <- 0; # Row effects r <- vector("double", length=nrow); # Column effects c <- vector("double", length=ncol); hasNa <- (!is.na(na.rm) && anyMissing(X)); if (hasNa) { oldSum <- 0; for (ii in 1:maxIter) { # Fit the row effects rdelta <- rowMedians(X, na.rm=na.rm); X <- X - rdelta; r <- r + rdelta; # Fit the overall effects delta <- median(c, na.rm=na.rm); c <- c - delta; t <- t + delta; # Fit the column effects cdelta <- colMedians(X, na.rm=na.rm); X <- X - matrix(cdelta, nrow=nrow, ncol=ncol, byrow=TRUE); c <- c + cdelta; # Fit the overall effects delta <- median(r, na.rm=na.rm); r <- r - delta; t <- t + delta; # Fit the overall effects newSum <- sum(abs(X), na.rm=na.rm); converged <- (newSum == 0 || abs(newSum - oldSum) < tol * newSum); if (converged) break; oldSum <- newSum; } # for (ii ...) } else { # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Optimized code for the case where there are no NAs # # Compared to medpolish(..., na.rm=FALSE), this version is about # 3-4 times faster. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rhalf <- (nrow+1)/2; if (nrow %% 2 == 1) { # Get x(rhalf), where x(k) is k:th sorted value in x. rMedian <- function(x) .psortKM(x, k=rhalf); } else { # Average x(rhalf) and x(rhalf+1). rMedian <- function(x) sum(.psortKM(x, k=rhalf+1L, m=2L))/2; } chalf <- (ncol+1)/2; if (ncol %% 2 == 1) { # Get x(chalf), where x(k) is k:th sorted value in x. cMedian <- function(x) .psortKM(x, k=chalf); } else { # Average x(chalf) and x(chalf+1). cMedian <- function(x) sum(.psortKM(x, k=chalf+1L, m=2L))/2; } oldSum <- 0; for (ii in 1:maxIter) { # Fit the row effects rdelta <- apply(X, MARGIN=1L, FUN=cMedian); X <- X - rdelta; r <- r + rdelta; # Fit the overall effects delta <- cMedian(c); c <- c - delta; t <- t + delta; # Fit the column effects cdelta <- apply(X, MARGIN=2L, FUN=rMedian); X <- X - matrix(cdelta, nrow=nrow, ncol=ncol, byrow=TRUE); c <- c + cdelta; # Fit the overall effects delta <- rMedian(r); r <- r - delta; t <- t + delta; # Fit the overall effects newSum <- sum(abs(X), na.rm=FALSE); converged <- (newSum == 0 || abs(newSum - oldSum) < tol * newSum); if (converged) break; oldSum <- newSum; } # for (ii ...) } res <- list(overall=t, row=r, col=c, residuals=X, converged=converged); if (.addExtra) { res$name <- name; class(res) <- c("medianPolish", "medpolish"); } res; }) # medianPolish() ############################################################################ # HISTORY: # 2013-09-26 # o CLEANUP: No longer utilizes ':::'. # o SPEEDUP: Now utilizing anyMissing() and (col|row)Medians() of the # 'matrixStats' package. # o TWEAKS: Using integer (e.g. 1L) where possible # 2012-09-12 # o ROBUSTNESS: Replaced an .Internal(psort(...)) call with a call to # matrixStats:::.psortKM() in medianPolish(). # 2012-04-16 # o Added local function psortGet() to medianPolish(). # 2006-05-16 # o Created from stats::medpolish(). ############################################################################ aroma.light/R/sampleTuples.R0000644000175000017500000000331514136047216015621 0ustar nileshnilesh#########################################################################/** # @RdocDefault sampleTuples # # @title "Sample tuples of elements from a set" # # \description{ # @get "title". # The elements within a sampled tuple are unique, i.e. no two elements # are the same. # } # # @synopsis # # \arguments{ # \item{x}{A set of elements to sample from.} # \item{size}{The number of tuples to sample.} # \item{length}{The length of each tuple.} # \item{...}{Additional arguments passed to @see "base::sample".} # } # # \value{ # Returns a NxK @matrix where N = \code{size} and K = \code{length}. # } # # @author "HB" # # @examples "../incl/sampleTuples.Rex" # # \seealso{ # @see "base::sample". # } # # @keyword utilities #*/######################################################################### setMethodS3("sampleTuples", "default", function(x, size, length, ...) { # Argument 'x': if (length(x) < 1L) throw("Argument 'x' must be a vector of length one or greater."); # Argument 'size': if (size < 0) throw("Argument 'size' must be a non-negative integer: ", size); # Argument 'length': if (length < 1) throw("Argument 'length' must be one or greater: ", length); # Sample tuples naValue <- NA; storage.mode(naValue) <- storage.mode(x); tuples <- matrix(naValue, nrow=size, ncol=length); for (kk in seq_len(size)) { tuples[kk,] <- sample(x, size=length, ...); } tuples; }) ############################################################################ # HISTORY: # 2011-04-12 # o Now using NAs of the correct storage type. # 2005-07-25 # o Created generic sampleTuples(). # 2005-04-07 # o Created. ############################################################################ aroma.light/R/lines.XYCurveFit.R0000644000175000017500000000072714136047216016270 0ustar nileshnileshsetMethodS3("lines", "XYCurveFit", function(x, xNew=NULL, ...) { # To please R CMD check fit <- x; if (is.null(xNew)) { xNew <- fit$x; xNew <- sort(xNew); xNew <- xNew[!duplicated(xNew)]; } y <- fit$predictY(xNew); lines(x=xNew, y=y, ...); }) # lines() ############################################################################ # HISTORY: # 2009-07-15 # o Created. ############################################################################ aroma.light/R/normalizeQuantileRank.matrix.R0000644000175000017500000002374614136047216020777 0ustar nileshnilesh###########################################################################/** # @set "class=matrix" # @RdocMethod normalizeQuantileRank # # @title "Normalizes the empirical distribution of a set of samples to a common target distribution" # # \usage{ # @usage normalizeQuantileRank,matrix # } # # \description{ # @get "title". # # The average sample distribution is calculated either robustly or not # by utilizing either \code{weightedMedian()} or \code{weighted.mean()}. # A weighted method is used if any of the weights are different from one. # } # # \arguments{ # \item{X}{a numerical NxK @matrix with the K columns representing the # channels and the N rows representing the data points.} # \item{robust}{If @TRUE, the (weighted) median function is used for # calculating the average sample distribution, otherwise the # (weighted) mean function is used.} # \item{ties}{Should ties in \code{x} be treated with care or not? # For more details, see "limma:normalizeQuantiles".} # \item{weights}{If @NULL, non-weighted normalization is done. # If channel weights, this should be a @vector of length K specifying # the weights for each channel. # If signal weights, it should be an NxK @matrix specifying the # weights for each signal. # } # \item{typeOfWeights}{A @character string specifying the type of # weights given in argument \code{weights}.} # \item{...}{Not used.} # } # # \value{ # Returns an object of the same shape as the input argument. # } # # \section{Missing values}{ # Missing values are excluded when estimating the "common" (the baseline). # Values that are @NA remain @NA after normalization. # No new @NAs are introduced. # } # # \section{Weights}{ # Currently only channel weights are support due to the way quantile # normalization is done. # If signal weights are given, channel weights are calculated from these # by taking the mean of the signal weights in each channel. # } # # @examples "../incl/normalizeQuantileRank.matrix.Rex" # # \author{ # Adopted from Gordon Smyth (\url{http://www.statsci.org/}) in 2002 \& 2006. # Original code by Ben Bolstad at Statistics Department, University of # California. # Support for calculating the average sample distribution using (weighted) # mean or median was added by Henrik Bengtsson. # } # # \seealso{ # @see "stats::median", @see "matrixStats::weightedMedian", # @see "base::mean" and @see "stats::weighted.mean". # @see "normalizeQuantileSpline". # } # # @keyword "nonparametric" # @keyword "multivariate" # @keyword "robust" #*/########################################################################### setMethodS3("normalizeQuantileRank", "matrix", function(X, ties=FALSE, robust=FALSE, weights=NULL, typeOfWeights=c("channel", "signal"), ...) { zeroOneWeightsOnly <- TRUE; # Until supported otherwise. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Validate arguments # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nbrOfChannels <- ncol(X); if(nbrOfChannels == 1L) return(X); nbrOfObservations <- nrow(X); if(nbrOfObservations == 1L) return(X); # Argument 'typeOfWeights': typeOfWeights <- match.arg(typeOfWeights); # Argument 'weights': channelWeights <- NULL; signalWeights <- NULL; if (!is.null(weights)) { # If 'weights' is an object of a class with as.double(), cast it. dim <- dim(weights); weights <- as.double(weights); dim(weights) <- dim; if (anyMissing(weights)) stop("Argument 'weights' must not contain NA values."); if (any(weights < 0 | weights > 1)) { stop("Argument 'weights' out of range [0,1]: ", paste(weights[weights < 0.0 | weights > 1.0], collapse=", ")); } if (typeOfWeights == "channel") { if (length(weights) == 1L) { weights <- rep(weights, length.out=nbrOfObservations); } else if (length(weights) != nbrOfObservations) { stop("Argument 'weights' (channel weights) does not have the same length as the number of rows in the matrix: ", length(weights), " != ", nbrOfChannels); } channelWeights <- weights; } else if (typeOfWeights == "signal") { if (!identical(dim(weights), dim(X))) { stop("Dimension of argument 'weights' (signal weights) does not match dimension of argument 'X': (", paste(dim(weights), collapse=","), ") != (", paste(dim(X), collapse=","), ")"); } # Calculate channel weights channelWeights <- colMeans(weights); if (zeroOneWeightsOnly && any(weights > 0 & weights < 1)) { weights <- round(weights); warning("Weights were rounded to {0,1} since quantile normalization supports only zero-one weights."); } signalWeights <- weights; } } # if (!is.null(weights)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 0. Setup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - maxNbrOfObservations <- nbrOfObservations; # Create a list S to hold the sorted values for each channels S <- matrix(NA_real_, nrow=maxNbrOfObservations, ncol=nbrOfChannels); # Create a list O to hold the ordered indices for each channels O <- vector("list", length=nbrOfChannels); # A vector specifying the number of observations in each column nbrOfFiniteObservations <- rep(maxNbrOfObservations, times=nbrOfChannels); # Construct the sample quantiles quantiles <- (0:(maxNbrOfObservations-1L))/(maxNbrOfObservations-1L); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 1. Get the sample quantile for all channels (columns) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (cc in seq_len(nbrOfChannels)) { values <- X[,cc,drop=TRUE]; if (!is.null(signalWeights)) { values[signalWeights[,cc] == 0] <- NA; } # Order and sort the values Scc <- sort(values, index.return=TRUE); # The number of non-NA observations nobs <- length(Scc$x); # Has NAs? if(nobs < nbrOfObservations) { nbrOfFiniteObservations[cc] <- nobs; isOk <- !is.na(values); # Get the sample quantiles for those values bins <- (0:(nobs-1L))/(nobs-1L); # Record the order position for these values. O[[cc]] <- ((1:nbrOfObservations)[isOk])[Scc$ix]; # Interpolate to get the values at positions specified by # 'quantile' using data points given by 'bins' and 'Scc$x'. Scc <- approx(x=bins, y=Scc$x, xout=quantiles, ties="ordered")$y; } else { O[[cc]] <- Scc$ix; Scc <- Scc$x; } S[,cc] <- Scc; } # for (cc ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 2. Calculate the average sample distribution, of each quantile # across all columns. This can be done robustly or not and # with weights or not. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - useWeighted <- (!is.null(channelWeights) & any(channelWeights != 1)); if (robust) { if (useWeighted) { xTarget <- rowWeightedMedians(S, w=channelWeights, na.rm=TRUE); } else { xTarget <- rowMedians(S, na.rm=TRUE); } } else { if (useWeighted) { xTarget <- rowWeightedMeans(S, w=channelWeights, na.rm=TRUE); } else { xTarget <- rowMeans(S, na.rm=TRUE); } } # Assert that xTarget is of then same length as number of observations stopifnot(length(xTarget) == maxNbrOfObservations); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # 3. For all columns, get for each sample quantile the value of # average sample distribution at that quantile. # # Input: X[r,c], xTarget[r], O[[c]][r], nbrOfFiniteObservations[c]. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (cc in seq_len(nbrOfChannels)) { # Get the number of non-NA observations nobs <- nbrOfFiniteObservations[cc]; # Has NAs? if(nobs < nbrOfObservations) { # Get the NAs isOk <- !is.na(X[,cc]); # Get the sample quantiles for those values if (ties) { r <- rank(X[isOk,cc]); bins <- (r-1)/(nobs-1L); } else { bins <- (0:(nobs-1L))/(nobs-1L); } # Interpolate to get the m's at positions specified by # 'quantile' using data points given by 'bins' and 'xTarget'. if (ties) { idx <- isOk; } else { idx <- O[[cc]]; } X[idx,cc] <- approx(x=quantiles, y=xTarget, xout=bins, ties="ordered")$y; } else { if (ties) { r <- rank(X[,cc]); bins <- (r-1L)/(nobs-1L); X[,cc] <- approx(x=quantiles, y=xTarget, xout=bins, ties="ordered")$y; } else { X[O[[cc]],cc] <- xTarget; } } } # for (cc ...) X; }) ############################################################################## # HISTORY: # 2013-09-26 # o Now utilizing anyMissing(), rowMedians(), rowWeightedMedians(), and # rowWeightedMeans(). # 2011-04-12 # o Now using as.double(NA) instead of NA. # 2008-04-14 # o Renamed normalizeQuantile() to normalizeQuantileRank(). Keeping the old # name for backward compatibility. # 2006-05-12 # o Updated according to Gordon Smyth's package. # 2006-02-08 # o Rd bug fix: Fixed broken links to help for median() and weighted.mean(). # 2005-06-03 # o Replaced arguments 'channelWeights' and 'signalWeights' with 'weights' # and 'typeOfWeights'. # o Added Rdoc help on weights. # 2005-03-23 # o Updated normalizeQuantile() so that approx() does not give warnings # about 'Collapsing to unique x values' when doing lowess normalization. # 2005-02-02 # o Zero-one weights are now round off by round(w). # 2005-02-01 # o Added argument 'signalWeights'. # o Added validation of argument 'channelWeights'. # 2005-01-27 # o Renamed argument 'A' to 'X'. # o Renamed argument 'weights' to 'channelWeights'. # o Making use of setMethodS3(). Added some more Rdoc comments. # o Moved from R.basic to aroma. # 2003-04-13 # o Updated the Rdoc comments. # 2002-10-24 # o Adapted from source code by Gordon Smyth's smagks package. ############################################################################## aroma.light/NEWS0000644000175000017500000007263114136047216013325 0ustar nileshnileshPackage: aroma.light ==================== Version: 3.23.1 [2021-08-19] DOCUMENTATION: * Update several citation URLs that were either broken or redirects elsewhere. Version: 3.22.0 [2021-05-19] * The version number was bumped for the Bioconductor release version, which is now BioC 3.13 for R (>= 4.0.3). Version: 3.20.0 [2020-10-27] * The version number was bumped for the Bioconductor release version, which is now BioC 3.12 for R (>= 4.0.0). Version: 3.18.0 [2020-04-27] * The version number was bumped for the Bioconductor release version, which is now BioC 3.11 for R (>= 3.6.1). Version: 3.17.1 [2019-12-09] CODE REFACTORING: * Now importing throw() from R.oo instead of R.methodsS3. Version: 3.17.0 [2019-10-30] * The version number was bumped for the Bioconductor devel version, which is now BioC 3.11 for R (>= 3.6.1). Version: 3.16.0 [2019-10-30] * The version number was bumped for the Bioconductor release version, which is now BioC 3.10 for R (>= 3.6.1). Version: 3.15.1 [2019-08-28] BUG FIXES: * wpca() for matrices had a 'length > 1 in coercion to logical' bug. Version: 3.15.0 [2019-05-02] * The version number was bumped for the Bioconductor devel version, which is now BioC 3.10 for R (>= 3.6.0). Version: 3.14.0 [2019-05-02] * The version number was bumped for the Bioconductor release version, which is now BioC 3.9 for R (>= 3.6.0). Version: 3.13.0 [2018-10-30] * The version number was bumped for the Bioconductor devel version, which is now BioC 3.9 for R (>= 3.6.0). Version: 3.12.0 [2018-10-30] * The version number was bumped for the Bioconductor release version, which is now BioC 3.8 for R (>= 3.5.0). Version: 3.11.2 [2018-09-04] CODE REFACTORING: * fitPrincipalCurve() now requires princurve (>= 2.1.2) and was updated to make use of new principcal_curve class instead of deprecated principcal.curve class. This update "should not" affect the results, but see https://github.com/dynverse/princurve/issues/8 for information of what has changed in the princurve package in this respect. Version: 3.11.1 [2018-08-28] * Updated installation instructions in README.md. Version: 3.11.0 [2018-04-30] * The version number was bumped for the Bioconductor devel version, which is now BioC 3.8 for R (>= 3.6.0). Version: 3.10.0 [2018-04-30] * The version number was bumped for the Bioconductor release version, which is now BioC 3.7 for R (>= 3.5.0). Version: 3.9.1 [2017-12-19] NEW FEATURES: * robustSmoothSpline() now supports using Tukey's biweight (in addition to already exising L1) estimators. See argument 'method'. Thanks to Aaron Lun at the Cancer Research UK Cambridge Institute for adding this feature. Version: 3.9.0 [2017-10-30] * The version number was bumped for the Bioconductor devel version, which is now BioC 3.7 for R (>= 3.5.0). Version: 3.8.0 [2017-10-30] * The version number was bumped for the Bioconductor release version, which is now BioC 3.6 for R (>= 3.4.0). Version: 3.7.0 [2017-04-23] * The version number was bumped for the Bioconductor devel version, which is now BioC 3.6 for R (>= 3.4.0). Version: 3.6.0 [2017-04-23] * The version number was bumped for the Bioconductor release version, which is now BioC 3.5 for R (>= 3.4.0). Version: 3.5.1 [2017-04-14] SIGNIFICANT CHANGES: * robustSmoothSpline() uses a re-weighted re-iterative algorithm that fits a smooth spline using stats::smooth.spline(), calculates the residuals and which are used to fit a re-weighted smooth spline and so on until converence. Due to updates to stats::smooth.spline() in R (>= 3.4.0) it is no longer feasible to maintain a highly optimized version of the algorithm, because it was based on internal stats::smooth.spline() code that has no completely changed. Instead the re-iterative algorithm calls stats::smooth.spline() as is, which slows it down. More importantly, it will now give slightly different estimates. SOFTWARE QUALITY: * In addition to continous integration (CI) tests and nightly Bioconductor tests, the package is now also tested regularly against all reverse package depencies available on CRAN and Bioconductor. Version: 3.5.0 [2016-10-18] * The version number was bumped for the Bioconductor devel version, which is now BioC v3.5 for R (>= 3.4.0). Version: 3.4.0 [2016-10-18] * The version number was bumped for the Bioconductor release version, which is now BioC v3.4 for R (>= 3.3.1). Version: 3.3.2 [2016-09-16] CODE REFACTORING: * Using NA_real_ (not just NA) everywhere applicable. BUG FIXES: * robustSmoothSpline() gave an error since R-devel (>= 3.4.0 r70682). Version: 3.3.1 [2016-08-10] CODE REFACTORING: * CLEANUP: Using seq_len() and seq_along() everywhere (Issue #8) Version: 3.3.0 [2016-05-03] * The version number was bumped for the Bioconductor devel version, which is now BioC v3.4 for R (>= 3.3.0). Version: 3.2.0 [2016-05-03] * The version number was bumped for the Bioconductor release version, which is now BioC v3.3 for R (>= 3.3.0). Version: 3.1.1 [2016-01-06] * Package requires R (>= 2.15.2). CODE REFACTORING: * CLEANUP: robustSmoothSpline() no longer generates messages that ".nknots.smspl() is now exported; use it instead of n.knots()" for R (>= 3.1.1). Version: 3.1.0 [2015-10-23] * The version number was bumped for the Bioconductor devel version, which is now BioC v3.3 for R (>= 3.3.0). Version: 3.0.0 [2015-10-13] * The version number was bumped for the Bioconductor release version, which is now BioC v3.2 for R (>= 3.2.2). Version: 2.99.0 [2015-10-06] * No changes. Version: 2.9.0 [2015-09-17] SIGNIFICANT CHANGES: * Argument 'preserveScale' for normalizeTumorBoost() now defaults to FALSE. Since 1.33.3 (2014-04-30) it had no default and prior to that it was TRUE. Version: 2.5.3 [2015-09-13] SOFTWARE QUALITY: * ROBUSTNESS: Explicitly importing core R functions. BUG FIXES: * rowAverages() and normalizeAverages() would give an error if some of the argument default functions are overridden by non-functions of the same name in the calling environment. Version: 2.5.2 [2015-06-16] SOFTWARE QUALITY: * Relaxed package test for backtransformPrincipalCurve(). Version: 2.5.1 [2015-05-24] * Bumped package dependencies. DEPRECATED AND DEFUNCT: * CLEANUP: Removed obsolete wpca(..., method = "dsvdc"); was only needed for backward compatibility with R (< 1.7.0). Version: 2.5.0 [2015-04-16] * The version number was bumped for the Bioconductor devel version, which is now BioC v3.2 for R (>= 3.3.0). Version: 2.4.0 [2015-04-16] * The version number was bumped for the Bioconductor release version, which is now BioC v3.1 for R (>= 3.2.0). Version: 2.3.3 [2015-02-18] NEW FEATURES: * If a value of argument 'xlim' or 'ylim' for plotDensity() is NA, then it defaults to the corresponding extreme value of the data, e.g. plotDensity(x, xlim = c(0, NA)). Version: 2.3.2 [2015-02-17] SOFTWARE QUALITY: * ROBUSTNESS: Added package tests. Code coverage is 76%. CODE REFACTORING: * CLEANUP: Using requestNamespace() instead of request(). Version: 2.3.1 [2014-12-08] * Same updates as in 2.2.1. Version: 2.3.0 [2014-10-13] * The version number was bumped for the Bioconductor devel version, which is now BioC v3.1 for R (>= 3.2.0). Version: 2.2.1 [2014-12-08] CODE REFACTORING: * Minor code cleanup. Version: 2.2.0 [2014-10-13] * The version number was bumped for the Bioconductor release version, which is now BioC v3.0 for R (>= 3.1.1). Version: 2.1.2 [2014-09-23] * Minor tweaks due to the move to GitHub. Version: 2.1.1 [2014-09-16] SOFTWARE QUALITY: * Fixed some new R CMD check NOTEs. CODE REFACTORING: * CLEANUP: Now importing R.utils (instead of only suggesting it). * IMPORTANT/CLEANUP: The matrixStats package is no longer attached with this package. In other words, you now might have to add library('matrixStats') to your scripts. Version: 2.1.0 [2014-04-11] * The version number was bumped for the Bioconductor devel version, which is now BioC v2.15 for R (>= 3.1.0). Version: 2.0.0 [2014-04-11] * The version number was bumped for the Bioconductor release version, which is now BioC v2.14 for R (>= 3.1.0). Version: 1.99.3 [2014-03-31] * Bumped the version such that the next release will be 2.0.0. Version: 1.33.3 [2014-03-30] SIGNIFICANT CHANGES: * Argument 'preserveScale' for normalizeTumorBoost() is now required. The goal with this is to in a future version migrate to use preserveScale = FALSE as the default (was preserveScale = TRUE) in order to avoid introducing a a global bias in the tumor allele B fraction of heterozygous SNPs. The examples use preserveScale = FALSE now. NEW FEATURES: * Added pairedAlleleSpecificCopyNumbers(). Version: 1.33.2 [2014-03-25] NEW FEATURES: * Now plotDensity() supports weights via argument 'W'. Version: 1.33.1 [2014-03-25] NEW FEATURES: * Now plotDensity() also supports density() objects. CODE REFACTORING: * CLEANUP: robustSmoothSpline() no longer uses DUP = FALSE in an internal .Fortran() call. * Bumped up package dependencies. Version: 1.33.0 [2013-10-14] * The version number was bumped for the Bioc devel version. Version: 1.32.0 [2012-10-14] * The version number was bumped for the Bioconductor release version, which is now Bioc v2.13 for R (>= 3.0.0). Version: 1.31.10 [2013-10-08] NEW FEATURES: * Added averageQuantile() for matrices in addition to lists. PERFORMANCE: * SPEEDUP: Now normalizeQuantileSpline(..., sortTarget = TRUE) sorts the target only once for lists of vectors just as done for matrices. DOCUMENTATION: * Merged the documentation for normalizeQuantileSpline() for all data types into one help page. Same for plotXYCurve(). CODE REFACTORING: * Bumped up package dependencies. BUG FIXES: * Argument 'lwd' of plotXYCurve(X, ...) was ignored if 'X' was a matrix. Version: 1.31.9 [2013-10-07] NEW FEATURES: * Now library(aroma.light, quietly = TRUE) attaches the package completely silently without any messages. * Now the 'aroma.light' Package object is also available when the package is only loaded (but not attached). DOCUMENTATION: * Merged the documentation for normalizeQuantileRank() for numeric vectors and lists. * Now documention S3 methods under their corresponding generic function. Version: 1.31.8 [2013-10-02] DOCUMENTATION: * More generic functions are now "aliased" under relevant corresponding methods. Version: 1.31.7 [2013-09-27] PERFORMANCE: * SPEEDUP: Now all package functions utilizes 'matrixStats' functions where possible, e.g. anyMissing(), colMins(), and rowWeightedMedians(). CODE REFACTORING: * Bumped up package dependencies. Version: 1.31.6 [2013-09-25] CODE REFACTORING: * CLEANUP: Package no longer use a fallback attachment of the 'R.oo' package upon attachment. Version: 1.31.5 [2013-09-23] SOFTWARE QUALITY: * ROBUSTNESS: Now properly declaring all S3 methods in the NAMESPACE file. PERFORMANCE: * SPEEDUP/CLEANUP: normalizeTumorBoost() now uses which() instead of whichVector() of 'R.utils'. Before R (< 2.11.0), which() used to be 10x slower than whichVector(), but now it's 3x faster. CODE REFACTORING: * CLEANUP: Now only using 'Authors@R' in DESCRIPTION, which is possible since R (>= 2.14.0). Hence the new requirement on the version of R. * Bumped up package dependencies. Version: 1.31.4 [2013-09-10] SOFTWARE QUALITY: * CLEANUP: Now package explicitly imports what it needs from matrixStats. CODE REFACTORING: * Bumped up package dependencies. Version: 1.31.3 [2013-05-25] PERFORMANCE: * SPEEDUP: Removed all remaining gc() calls, which were in normalizeQuantileSpline(). * SPEEDUP: Replaced all rm() calls with NULL assignments. CODE REFACTORING: * Updated the package dependencies. Version: 1.31.2 [2013-05-20] * Same updates as in v1.30.2. Version: 1.31.1 [2011-04-18] * Same updates as in v1.30.1. Version: 1.31.0 [2013-04-03] * The version number was bumped for the Bioc devel version. Version: 1.30.5 [2013-09-25] SOFTWARE QUALITY: * Backport from v1.31.5: Declaring all S3 methods in NAMESPACE. CODE REFACTORING: * Backport from v1.31.5: normalizeTumorBoost() now uses which(), which also removes one dependency on 'R.utils'. Version: 1.30.4 [2013-09-25] SOFTWARE QUALITY: * Backport from v1.31.4: Now package explicitly imports what it needs from matrixStats. Version: 1.30.3 [2013-09-25] PERFORMANCE: * Backport from v1.31.3: Removal of all gc() calls and removal of variables is now faster. BUG FIX: * Removed one stray str() debug output in robustSmoothSpline(). Version: 1.30.2 [2013-05-20] * CRAN POLICY: Now all Rd \usage{} lines are at most 90 characters long. Version: 1.30.1 [2013-04-18] NEW FEATURES: * Now backtransformPrincipalCurve() preserves dimension names. BUG FIXES: * backtransformPrincipalCurve() gave an error if the pricipal curve was fitted using data with missing values. * fitPrincipalCurve() would not preserve dimension names if data contain missing values. Version: 1.30.0 [2012-04-03] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.12 for R (>= 3.0.0). Version: 1.29.0 [2012-10-01] * The version number was bumped for the Bioc devel version. Version: 1.28.0 [2012-10-01] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.11 for R (>= 2.15.1). Version: 1.27.1 [2012-09-12] SOFTWARE QUALITY: * ROBUSTNESS: Replaced an .Internal(psort(...)) call in medianPolish() with a call to matrixStats:::.psortKM(). Version: 1.27.0 [2012-08-30] CODE REFACTORING: * CLEANUP: Removed weightedMedian(), which has been moved to the matrixStats package. * BACKWARD COMPATIBILITY: Now package depends on the matrixStats (>= 0.5.2) package, so that weightedMedian() is still available when loading this package. In future releases, matrixStats will be downgraded to only be a suggested package. Version: 1.26.1 [2012-08-30] CODE REFACTORING: * Updated the package dependencies. BUG FIXES: * robustSmoothSpline() would not work with most recent R devel versions. Version: 1.26.0 [2012-08-19] SIGNIFICANT CHANGES: * Changed the license of aroma.light to GPL (>= 2) from LGPL (>= 2), because some of the implementation was adopted from GPL (>= 2) code, i.e. robustSmoothSpline() uses code from stats::smooth.spline(). SOFTWARE QUALITY: * R CMD check no longer warns about some examples depending on the R.basic package. Version: 1.25.4 [2012-08-19] SOFTWARE QUALITY: * WORKAROUND: Now robustSmoothSpline() robustly locates the proper native R fit function for smooth splines, which vary with different releases of R. Version: 1.25.3 [2012-04-16] CODE REFACTORING: * Package no longer depends on R.methodsS3, only imports. Version: 1.25.2 [2012-04-16] SOFTWARE QUALITY: * 'R CMD check' no longer complaints about .Internal() calls. Version: 1.25.1 [2012-04-16] NEW FEATURES: * Added support for fitNaiveGenotypes(..., flavor = "fixed"). * GENERALIZATION: Now fitNaiveGenotypes() returns also 'flavor' and 'tau'. The latter are the genotype threshholds used by the caller. CODE REFACTORING: * CLEANUP: Dropped argument 'flavor' of callNaiveGenotypes(); it is instead passed to fitNaiveGenotypes() via '...'. Version: 1.25.0 [2012-03-30] * The version number was bumped for the Bioconductor devel version. Version: 1.24.0 [2012-03-30] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.10 for R (>= 2.15.0). Version: 1.23.0 [2011-10-31] * The version number was bumped for the Bioconductor devel version. Version: 1.22.0 [2011-10-31] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.9 for R (>= 2.14.0). Version: 1.21.2 [2011-10-10] CODE REFACTORING: * Updated robustSmoothSpline() such that it works with the new "uniqueness" scheme of smooth.spline() in R v2.14.0 and newer. It is tricky, because robustSmoothSpline() is a reiterative algorithm which requires that the choosen "unique" x:s does not change in each iteration. Previously, 'signif(x, 6)' was used to identify unique x:s, which gives the same set of values when called twice, whereas this is not true for the new choice with 'round((x - mean(x))/tol)'. Version: 1.21.1 [2011-06-26] NEW FEATURES: * Added argument 'aspectRatio' to plotMvsA(). It can be used to adjust the range of the 'Mlim' argument relative to the 'Alim' argument. Version: 1.21.0 [2011-04-13] * The version number was bumped for the Bioconductor devel version. Version: 1.20.0 [2010-04-13] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.8 for R (>= 2.13.0). Version: 1.19.6 [2011-04-12] CODE REFACTORING: * CLEANUP: Removed internal patch of principal.curve(). If an older version than princurve v1.1-10 is used, an informative error is thrown requesting an update. The internal patch is part of the offical princurve v1.1-10 release (since 2009-10-04). * Now all methods allocate objects with NAs of the appropriate mode. KNOWN ISSUES: * Recent updates to smooth.spline() in R v2.14.0 causes robustSmoothSpline() to break in some cases. Version: 1.19.5 [2011-04-08] NEW FEATURES: * Now weightedMedian() returns NA:s of the same mode as argument 'x'. Version: 1.19.4 [2011-03-03] * Same updates as in v1.18.4. Version: 1.19.3 [2011-02-05] * Same updates as in v1.18.3. Version: 1.19.2 [2010-10-22] * Same updates as in v1.18.2. Version: 1.19.1 [2010-10-18] * Same updates as in v1.18.1. Version: 1.19.0 [2010-10-18] * The version number was bumped for the Bioconductor devel version. Version: 1.18.4 [2011-03-03] BUG FIXES: * findPeaksAndValleys(x, to) were 'x' is numeric would use partial match and interpret 'to' as argument 'tol' and not part of '...' passed to density(). This problem was solved by placing '...' before argument 'tol'. Thanks Oscar Rueda at the Cancer Reasearch UK for reporting on and identifying this bug. Version: 1.18.3 [2011-02-05] DOCUMENTATION: * Added paragraphs on how to do affine normalization when channel offsets are known/zero. Same for multiscan calibration when scanner offsets are known/zero. * Fixed broken links to help for iwpca(). Version: 1.18.2 [2010-10-22] DOCUMENTATION: * Minor clarifications to the help page on "1. Calibration and Normalization". This page is now also referenced in help("calibrateMultiscan"). Version: 1.18.1 [2010-10-18] NEW FEATURES: * Argument 'censorAt' for fitNaiveGenotypes() has new default. * These updates were supposed to be in v1.17.7, but we forgot to commit them to the BioC repository before the new BioC release. BUG FIXES: * fitNaiveGenotypes(..., subsetToFit = ) would throw an exception reporting "Some elements of argument 'subsetToFit' is out of range ...". Version: 1.18.0 [2010-10-18] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.7 for R (>= 2.12.0). Version: 1.17.6 [2010-10-08] NEW FEATURES: * Now findPeaksAndValleys() returns a object of class PeaksAndValleys, which extends data.frame. Version: 1.17.5 [2010-10-07] NEW FEATURES: * Added optional argument 'fit' to callNaiveGenotypes() for passing a model fit returned by fitNaiveGenotypes(). If not specified, callNaiveGenotypes() will call fitNaiveGenotypes() internally. * Added fitNaiveGenotypes(), which previously was only internal of callNaiveGenotypes(). Version: 1.17.4 [2010-10-06] NEW FEATURES: * Added findPeaksAndValleys() for the 'density' class, which then findPeaksAndValleys() for 'numeric' utilizes. Version: 1.17.3 [2010-09-18] SOFTWARE QUALITY: * ROBUSTNESS: Now normalizeFragmentLength() asserts that arguments 'fragmentLengths' and 'y' contain at least some finite values and specifies the same number of units. In addition, the method also gives more informative error messages in case it cannot fit the normalization function due to non-finite values. Version: 1.17.2 [2010-08-04] NEW FEATURES: * Added argument 'preserveScale' to normalizeTumorBoost() to rescale the calibrated allele B fractions for heterozygous SNPs such that the compression relative to the homozgygotes is preserved. Version: 1.17.1 [2010-07-23] * Same updates as in release version v1.16.1. Version: 1.17.0 [2010-04-22] * The version number was bumped for the Bioconductor devel version. Version: 1.16.1 [2010-07-23] NEW FEATURES: * Now callNaiveGenotypes() returns the model estimates as attribute 'modelFit'. This feature was supposed to be in v1.16.0. Version: 1.16.0 [2010-04-22] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.6 for R (>= 2.11.0). Version: 1.15.4 [2010-04-08] SOFTWARE QUALITY: * R devel assumes ASCII encoding unless specified. Added explicit Latin-1 encoding to the DESCRIPTION file to R CMD check to pass. Version: 1.15.3 [2010-04-04] NEW FEATURES: * Added normalizeDifferencesToAverage(), normalizeTumorBoost(), callNaiveGenotypes() and internal findPeaksAndValleys(), which all were moved from the aroma.cn package. Version: 1.15.2 [2010-03-12] BUG FIXES: * The example of fitPrincipalCurve() used a non-existing argument name in the calls to substitute(). Thanks to Brian Ripley at University of Oxford for reporting this. Version: 1.15.1 [2009-11-01] CODE REFACTORING: * Now fitPrincipalCurve() only uses the internal bug-fix patch if a version earlier than princurve v1.1-10 is installed. Version: 1.15.0 [2009-10-27] * The version number was bumped for the Bioconductor devel version. Version: 1.14.0 [2009-10-27] * The version number was bumped for the Bioconductor release version, which now is Bioc v2.5 for R (>= 2.10.0). Version: 1.13.6 [2009-10-20] DOCUMENTATION: * FIX: CITATION file reverted to that of v1.13.4. Version: 1.13.5 [2009-10-08] DOCUMENTATION: * CITATION file [incorrectly] updated by BioC maintainers. Version: 1.13.4 [2009-09-23] DOCUMENTATION: * Fixed a few broken Rd links. Version: 1.13.3 [2009-07-15] NEW FEATURES: * ADDED: fit- and backtransformXYCurve(). * Added attribute 'processingTime' to the fit object returned by fitPrincipalCurve(). Version: 1.13.2 [2009-05-29] * Incorporating the same updates as in release v1.12.2. Version: 1.13.1 [2009-05-13] * Incorporating the same updates as in release v1.12.1. Version: 1.13.0 [2009-04-20] * The version number was bumped for the Bioconductor devel version. Version: 1.12.2 [2009-05-29] CODE REFACTORING: * Replacing old HOWTOCITE with a standard CITATION file. BUG FIXES: * Previous bug fix in backtransformPrincipalCurve() regarding argument 'dimension' broke the initial purpose of this argument. Since both use cases are still of interest, how the subsetting is done is now based on whether the number of dimensions of the input data and the model fit match or not. See help and example code for 'backtransformPrincipalCurve.matrix'. Version: 1.12.1 [2009-05-13] BUG FIXES: * backtransformPrincipalCurve(..., dimensions) did not subset the 'X' matrix. Also, the method now returns a matrix of the same number of columns requested. The Rd example now illustrates this. Thanks to Pierre Neuvial, UC Berkeley for the troublshooting and fix. Version: 1.12.0 [2009-04-20] * The version number was bumped for the Bioconductor release version. Version: 1.11.2 [2009-02-08] BUG FIXES: * An error was thrown in backtransformPrincipalCurve() when argument 'dimensions' was specified. Version: 1.11.1 [2009-01-12] NEW FEATURES: * Added fit- & backtransformPrincipalCurve(). Version: 1.11.0 [2008-10-21] * The version number was bumped for the Bioconductor devel version. Version: 1.10.0 [2008-10-21] * The version number was bumped for the Bioconductor release version. Version: 1.9.2 [2008-09-11] NEW FEATURES: * Added argument 'onMissing' to normalizeFragmentLength() for specifying how to normalize (if at all) data points for which the fragment lengths are unknown. For backward compatibility, we start off by having it "ignore" by default. CODE REFACTORING: * MEMORY OPTIMIZATION: robustSmoothSpline() is now cleaning out more variables when no longer needed. Version: 1.9.1 [2008-05-10] * Incorporating the same updates as in release v1.8.1. Version: 1.9.0 [2008-04-29] * The version number was bumped for the Bioconductor devel version. Version: 1.8.1 [2008-05-10] BUG FIXES: * If the 'subsetToFit' of normalizeFragmentLength() was shorter than the number of data points, an exception was thrown. The test was supposed to assert that the subset was not greater than the number of data points. Version: 1.8.0 [2008-04-29] * The version number was bumped for the Bioconductor release version. Version: 1.7.2 [2008-04-14] NEW FEATURES: * Added normalizeFragmentLength(). * Added normalizeQuantileSpline(). * Renamed normalizeQuantile() to normalizeQuantileRank(). * Added plotXYCurve(). * Added predict() for the 'lowess' class. Version: 1.7.1 [2007-11-28] NEW FEATURES: * The startup message when loading the package is generated with packageStartupMessage() so that it can be suppressed. DOCUMENTATION: * TYPO: Corrected a spelling error in the help pages. SOFTWARE QUALITY: * Package passes R CMD check R v2.6.1. CODE REFACTORING: * Package now only suggest the R.oo package, and instead depends on the new R.methodsS3. Version: 1.7.0 [2007-10-08] * The version number was bumped for the Bioconductor devel version. Version: 1.6.0 [2007-10-08] * The version number was bumped for the Bioconductor release version. Version: 1.5.2 [2007-08-10] SOFTWARE QUALITY: * Package pass R CMD check R v2.6.0. Version: 1.5.1 [2007-06-08] (this was mistakenly versioned 1.4.1) NEW FEATURES: * Added normalizeAverage(). SOFTWARE QUALITY: * Package pass R CMD check R v2.6.0 with Rd encoding errors. Version: 1.5.0 [2007-05-09] * The version number was bumped for the Bioconductor devel version. Version: 1.4.0 [2007-05-09] * The version number was bumped up with the Bioconductor release. Version: 1.3.1 [2007-01-15] CODE REFACTORING: * Removed code to use 'modreg' for backward compatibility with R < 1.9.0. * Added R.utils to Suggests field of DESCRIPTION. Version: 1.3.0 [2006-10-??] * The devel version number was bumped up with the Bioconductor release. Version: 1.2.0 [2006-10-03] * The version number was bumped up with the Bioconductor release. Version: 1.1.0 [2006-07-20] SIGNIFICANT CHANGES: * Added to Bioconductor v1.9. NEW FEATURES: * Added some trial RSP pages. Try browseRsp() in the R.rsp package. Version: 0.1.7 [2006-06-27] CODE REFACTORING: * Made the package truely standalone except from R.oo. Previously package R.basic was used in some of the examples. Version: 0.1.6 [2006-05-22] NEW FEATURES: * Added medianPolish() which is much faster than stats::medpolish() when there are no NA. * Added plotDensity() for list of vectors as well as for matrices. * Added normalizeQuantile() for lists of vectors as well as for a single vector of numerics. To calculate the target quantile there is a new function averageQuantile(), which is also for lists of vectors. It latter does not support robust estimatation of the average, because it safes memory. * Updated normalizeQuantile() for matrices according to the updates in the limma package. CODE REFACTORING: * Added a namespace for the package. * Added 'biocViews' since the package will eventually be added to the Bioconductor project. Version: 0.1.5 [2006-04-21] PERFORMANCE: * Minor speedup to weightedMedian(), e.g. negative weights do no longer give and error, but are treated as zero instead. This removes some overhead of the function. Also, if it is known that there are no NAs that can be specified by na.rm = NA, which will skip NA checks. Version: 0.1.4 [2006-03-28] DOCUMENTATION: * Updated broken Rd links. * Updated the references to publications. Version: 0.1.3 [2006-01-22] NEW FEATURES: * Now fitIWPCA() does not return the data matrix. This is to save memory. The calling algorithm can equally well add the data if it is needed. DOCUMENTATION: * Added help on the returned parameters of fitIWPCA(). Version: 0.1.2 [2005-09-06] NEW FEATURES: * All plot methods displaying log-ratios now assures that no fake log-ratios are calculated due to two negative raw signals. Similarily, methods display log-intensities now assures that the log-intensities are calculated as doubles to avoid possible overflow warnings for too large integers. Version: 0.1.1 [2005-07-26] NEW FEATURES: * Added sampleCorrelations() and sampleTuples(). * Now argument 'interpolate' of weightedMedian() defaults to TRUE only if 'ties' is NULL. Version: 0.1.0 [2005-06-03] SIGNIFICANT CHANGES: * Created. Most of the matrix methods were copied from the R.basic and the aroma packages. The purpose of this package is to provide a standalone package, which does not require any of the aroma classes. This will allow the methods to be used by end users as is, or be utilized in other packages. aroma.light/inst/0000755000175000017500000000000014136047216013572 5ustar nileshnilesharoma.light/inst/CITATION0000644000175000017500000001607314136047216014736 0ustar nileshnileshcitHeader("Please cite aroma.light one or more of approprite reference below"); citEntry( # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BibTeX entry: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - entry = "Article", author = "H. Bengtsson and Pierre Neuvial and Terence P Speed", title = "TumorBoost: Normalization of allele-specific tumor copy numbers from a single pair of tumor-normal genotyping microarrays", journal = "BMC Bioinformatics", year = "2010", month = "May", volume = "11", number = "245", doi = "10.1186/1471-2105-11-245", url = "https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-11-245", # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plain-text citation: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - textVersion = paste(sep="", "H. Bengtsson, P. Neuvial and T.P. Speed. ", "TumorBoost: Normalization of allele-specific tumor copy numbers from a single pair of tumor-normal genotyping microarrays, ", "BMC Bioinformatics, ", "2010" ) ); citEntry( # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BibTeX entry: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - entry = "Article", author = "Henrik Bengtsson and Amrita Ray and Paul Spellman and Terence P Speed", title = "A single-sample method for normalizing and combining full-resolutioncopy numbers from multiple platforms, labs and analysis methods", journal = "Bioinformatics", year = "2009", volume = "25", number = "7", doi = "10.1093/bioinformatics/btp074", url = "https://bioinformatics.oxfordjournals.org/cgi/content/full/25/7/861", # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plain-text citation: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - textVersion = paste(sep="", "H. Bengtsson, A. Ray, P. Spellman and T.P. Speed. ", "A single-sample method for normalizing and combining full-resolutioncopy numbers from multiple platforms, labs and analysis methods, ", "Bioinformatics, ", "2009" ) ); citEntry( # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BibTeX entry: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - entry="TechReport", author = "H. Bengtsson and K. Simpson and J. Bullard and K. Hansen", title = "{aroma.affymetrix}: A generic framework in {R} for analyzing small to very large {Affymetrix} data sets in bounded memory", institution = "Department of Statistics, University of California, Berkeley", year = "2008", month = "February", number = "745", # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plain-text citation: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - textVersion = paste(sep="", "H. Bengtsson; K. Simpson; J. Bullard; K. Hansen. ", "aroma.affymetrix: A generic framework in R for analyzing small to very large Affymetrix data sets in bounded memory, ", "Tech Report 745, ", "Department of Statistics, University of California, Berkeley, ", "February 2008" ) ); citEntry( # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BibTeX entry: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - entry="Article", author = "Henrik Bengtsson and R. Irizarry and B. Carvalho and T.P. Speed", title = "Estimation and assessment of raw copy numbers at the single locus level", journal = "Bioinformatics", year = "2008", volume = "24", number = "6", url = "https://bioinformatics.oxfordjournals.org/cgi/content/full/24/6/759", # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plain-text citation: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - textVersion = paste(sep="", "H. Bengtsson, R. Irizarry, B. Carvalho, & T.P. Speed. ", "Estimation and assessment of raw copy numbers at the single locus level, ", "Bioinformatics, ", "2008" ) ); citEntry( # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BibTeX entry: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - entry="Article", author = "H. Bengtsson and O. H{\"o}ssjer", title = "Methodological study of affine transformations of gene expressiondata with proposed robust non-parametric multi-dimensional normalization method", journal = "BMC Bioinformatics", year = "2006", volume = "7", number = "100", doi = "10.1186/1471-2105-7-100", url = "https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-7-100", # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plain-text citation: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - textVersion = paste(sep="", "H. Bengtsson & O. Hssjer. ", "Methodological study of affine transformations of gene expressiondata with proposed robust non-parametric multi-dimensional normalization method, ", "BMC Bioinformatics, ", "2006" ) ); citEntry( # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BibTeX entry: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - entry="Article", author = "H. Bengtsson and G. J\"{o}nsson and J. Vallon-Christersson", title = "Calibration and assessment of channel-specific biases in microarray data with extended dynamical range", journal = "BMC Bioinformatics", year = "2004", volume = "5", number = "177", doi = "10.1186/1471-2105-5-177", url = "https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-5-177", # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plain-text citation: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - textVersion = paste(sep="", "H. Bengtsson, G. Jnsson & J. Vallon-Christersson. ", "Calibration and assessment of channel-specific biases in microarray data with extended dynamical range, ", "BMC Bioinformatics, ", "2004" ) ); citEntry( # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # BibTeX entry: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - entry="TechReport", author = "H. Bengtsson", title = "{aroma} - {A}n {R} {O}bject-oriented {M}icroarray {A}nalysis environment", type = "Preprint in Mathematical Sciences", institution = "Mathematical Statistics, Centre for Mathematical Sciences, Lund University, Sweden", year = "2004", number = "18", url = "https://lup.lub.lu.se/search/publication/929031", # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Plain-text citation: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - textVersion = paste(sep="", "H. Bengtsson. ", "aroma - An R Object-oriented Microarray Analysis environment, ", "Preprint 2004:18, ", "Centre for Mathematical Sciences, Lund University, ", "2004" ) ); aroma.light/inst/WORDLIST0000644000175000017500000000116714136047216014771 0ustar nileshnileshAchim affine Affine affinely al AppVeyor ASCN backtransform backtransformed BAFs Bergh Bioinformatics BMC Bolstad Carvalho cDNA Centre CMD Crosse Demmel Dongarra downweight DSC Eqn Eqns et Friedrich Hastie heterozygous Himel homozygous Hornik Irizarry iteratively IWPCA KxE KxK LAPACK's Leisch licence limma loadings loess Loess Lund Lx macOS multiscan Multiscan multiscanned MxL normalizeQuantiles Nx NxD NxK NxL oo Pawitan PeaksAndValleys Ploner PMID PMT pre Pre Preprints rescale Rescales resolutioncopy robustified robustify SmoothSplineLikelihood Smyth Spellman Stuetzle suboptimal tricube TumorBoost UW Wishlist WPCA Zeileis aroma.light/inst/rsp/0000755000175000017500000000000014136047216014376 5ustar nileshnilesharoma.light/inst/rsp/style.css0000644000175000017500000000753014136047216016255 0ustar nileshnilesh/********************************************************************* This HTML style sheet makes your webpage more conforming to braju.com's graphical profile. To include this style sheet in our HTML web page add the following line *between* and : URL : http://www.braju.com/R/style.css Author: Henrik Bengtsson, henrikb@braju.com *********************************************************************/ /* ----------- M a i n - b o d y ----------- */ body { font-family: Arial, Verdana, Geneva, sans-serif; background: #ffffff; position: absolute; margin-top: 0; top:8; left:8; } center, p, b, i, em, small, big { font-family: Arial, Verdana, Geneva, sans-serif; } /* ------------- H e a d e r s ------------- */ h1 { font-family: Arial, Verdana, Geneva, sans-serif; color: #3366cc; } h2, h3, h4, h5, h6 { font-family: Arial, Verdana, Geneva, sans-serif; } /* --------------- L i n k s --------------- */ a { font-family: Arial, Verdana, Geneva, sans-serif; color: #3366cc; } a:visited { color: #3366cc; } /* a:link { color: #0C2577; } a:active { color: #0C2577; } */ /* --------------- L i s t s --------------- */ ol, ul, li { font-family: Arial, Verdana, Geneva, sans-serif; } /* ------------ V e r b a t i m ------------ */ pre, tt, code { font-family: 'Courier New', monospace; } /* --------------- F o r m s --------------- */ .BrajuButton { font-family: Arial, Verdana, Geneva, sans-serif; background-color: #3366cc; color: white; font-weight: bold; font-size: 8pt; } /* -------------- T a b l e s -------------- */ table, tr, th, td { font-family: Arial, Verdana, Geneva, sans-serif; } .TableHeader { font-family: Arial, Verdana, Geneva, sans-serif; background-color: #3366cc; color: white; font-weight: bold; } .Table { font-family: Arial, Verdana, Geneva, sans-serif; border-width: thin; border-color: #3366cc; border-style: solid; background-color: white; } /* --------- C o d e - S t y l e s --------- */ .Code { font-family: 'Courier New', monospace; color: #3366cc; } .RCode { font-family: 'Courier New', monospace; color: #3366cc; } .TeXCode { font-family: 'Courier New', monospace; color: #3366cc; } .CCode { font-family: 'Courier New', monospace; color: #3366cc; } .JavaCode { font-family: 'Courier New', monospace; color: #3366cc; } .PerlCode { font-family: 'Courier New', monospace; color: #3366cc; } .HTMLCode { font-family: 'Courier New', monospace; color: #3366cc; } .RCode { font-family: 'Courier New', monospace; color: #3366cc; } .RSource { font-family: 'Courier New', monospace; color: #3366cc; } /* ----------------- U M L ----------------- */ .UMLClass { background: #000000; color: #ffffff; border-color: #000000; border-width: 0px; border-style: solid; } .UMLDivider { background: #000000; color: #ffffff; height: 2px; } .UMLClassName { background: #ffffff; color: #000000; font-weight: bold; font-size: x-small; } .UMLAttribute { background: #ffffff; color: #000000; font-size: x-small; } .UMLMethod { background: #ffffff; color: #000000; font-size: x-small; } /* ----------- F o o t n o t e s ----------- */ .Footnote { color: gray; font-size: x-small; } .FootnoteInverse { color: white; } .FootnoteTable { font-size: x-small; color: gray; } /* ------- M i s c e l l a n e o u s ------- */ .RError { color: red; font-family: monospace; } .RPrompt { color: #3366cc; font-family: monospace; } .Dates { font-size: x-small; } .Filesize { color: gray; } .HorizontalBar { background-color: #3366cc; } .Footer { font-size: x-small; color: #6f6f6f; } /* HISTORY: 2001-10-28 * Cleaned up the code and added a few comments. */ aroma.light/inst/rsp/preprocessing.html.rsp0000644000175000017500000000460114136047216020753 0ustar nileshnilesh

Pre-processing of signals

Although the below discussion applies to a pair of single-channel arrays, for simplicity consider a two-color experiment (C=2) where each array has I features (spots). Let xc,i the (unknown) true biological signal for feature i=1,2,...,I in sample/channel c=1,2,...,C. This is the quantity that we wish to estimate.

With microarrays, we obtain estimates of xc,i called feature signals. Denote these by yc,i. These are not direct measurements, but rather transformed signals due to additive background, scale effects, non-linear effects, and other systematic effects, which we all summarize in a function fc(xc,i). With random errors ec,i, we measure:

yc,i = fc(xc,i) + ec,i.

The most general objective in microarray analysis is to obtain an estimate x*c,i of the true signal, or at least an estimate y*c,i which is close to the true signal up to a less important scale factor (d). If we can estimate fc(), then we can back transform the data to get:

y*c,i = d * fc-1(yc,i)

If we manage to do this, we know that y*c,i is proportional to xc,i, which is often sufficent since we only need to know the relative signal, e.g. when the true signals doubles, our estimate doubles too. Note that this is typically not the case for yc,i. This is why we pre-process measure signals. Simply speaking, background subtraction, scanner calibration, and normalization is about estimating fc() and back-transforming signals to obtain y*c,i.

For the definitions and the difference between calibration and normalization, see the introduction of H. Bengtsson (2004).

aroma.light/inst/rsp/src/0000755000175000017500000000000014136047216015165 5ustar nileshnilesharoma.light/inst/rsp/src/simpleHeader.html.rsp0000644000175000017500000000125314136047216021261 0ustar nileshnilesh<%-- H e a d e r --%> <% uri <- getRequestUri(request); uriPath <- strsplit(uri, split="/")[[1]][-1]; if (regexpr("./$", uri) != -1) { upPath <- "../"; } else if (regexpr("./index.html.rsp$", uri) != -1) { upPath <- "../"; uriPath <- uriPath[-length(uriPath)]; } else { upPath <- "index.html.rsp"; uriPath <- uriPath[-length(uriPath)]; } %> aroma.light/inst/rsp/src/simpleFooter.html.rsp0000644000175000017500000000145514136047216021333 0ustar nileshnilesh<%-- F o o t e r --%> <% pd <- packageDescription(pkg); isLoaded <- (pkg %in% gsub("^package:", "", search())); %>
<%=pd$Package%> v<%=pd$Version%> (<%=pd$Date%>) (details, help pages) <% if (!isLoaded) { %> [load package] <% } %>

aroma.light/inst/rsp/src/simpleHead.html.rsp0000644000175000017500000000062614136047216020735 0ustar nileshnilesh <%=title%> aroma.light/inst/rsp/references.html.rsp0000644000175000017500000000366614136047216020223 0ustar nileshnilesh

References

H. Bengtsson, J. Vallon-Christersson & G. Jnsson, Calibration and assessment of channel-specific biases in microarray data with extended dynamical range, BMC Bioinformatics, 2004, 5:177. [PMID: 15541170]

H. Bengtsson, Low-level Analysis of Microarray Data, Doctoral Thesis in Mathematical Sciences 2004:6, Mathematical Statistics, Lund University, 2004.

A. Bengtsson & H. Bengtsson, Microarray image analysis: background estimation using quantile and morphological filters, BMC Bioinformatics, 2006, 7:96. [PMID: 16504173]

H. Bengtsson & O. Hssjer, Methodological study of affine transformations of gene expression data with proposed robust non-parametric multi-dimensional normalization method, BMC Bioinformatics, 2006, 7:100. [PMID: 16509971]

H. Lyng, A. Badiee, D.H. Svendsrud, E. Hovig, O. Myklebost, T. Stokke. Profound influence of microarray scanner characteristics on gene expression ratios: analysis and procedure for correction, BMC Genomics, 2004, 5:10. [PMID: 15018648]

P. Rydn, H. Andersson, M. Landfors, L. Nslund,B. Hartmanov, L. Noppa, & A. Sjstedt, Evaluation of microarray data normalization procedures using spike-in experiments, BMC Bioinformatics, 2006, 7:300. [PMID: 16774679]

aroma.light/inst/rsp/.rspPlugins0000644000175000017500000000004714136047216016546 0ustar nileshnilesharoma.light::rsp/index.rsp aroma.light aroma.light/inst/rsp/MultiscanCalibration/0000755000175000017500000000000014136047216020505 5ustar nileshnilesharoma.light/inst/rsp/MultiscanCalibration/MultiscanCalibration.html.rsp0000644000175000017500000001565714136047216026323 0ustar nileshnilesh

Multiscan calibration

In this section we give recommendation on how to calibrate data for scanner biases. It applies to any type of microarray platform and scanner.

In Bengtsson et al. (2004) we give evidence that microarray scanners can introduce a significant bias in data. This bias, which is about 15-25 out of 65535, will introduce intensity dependency in the log-ratios, as explained in Bengtsson & Hssjer (2006). We found the bias to rather stable across arrays and time (Bengtsson et al. 2004), but further research is needed to extrapolate this to be true over a longer period of time. An example of multiscan calibration where the same two-channel array has been scanned at four different PMT voltages is illustrated in the below figure.

Between-scan (A,M) plot Between-scan (A,M) plot
Figure: Multiscan calibration where the same array has been scanned at four different PMT voltages (800V, 700V, 600V, and 500V). Data shown is for the red channel. Left: Between-scan (A,M) plot, that is, between-scan log-ratio versus log-intensity plot before calibration of the six different PMT-pairs. Scanner bias was estimated to be aR=15.7. Minimum observed log-intensity is Amin = log2(aR)=3.97, which is confirmed by the graph. Right: Between-scan (A,M) plot after calibration, that is, subtracting scanner biases and rescaling. Except for noise and some scanner saturation, all (A,M) pairs overlap quite well. Some saturated signals (seen at high intensities) and other outliers (a few) can be seen. The calibration is robustified against these.

Scan protocol

To calibrate signals for scanner biases, scan the same array at multiple PMT settings (in decreasing order) at three or more PMT settings, e.g. 800V, 700V, 600V and 500V. Do not worry that you get too weak or too strong signals at the extreme PMT gains; together, all scans will extend the dynamical range and saturated signals will be ignored. It is important that you do this without washing, cleaning or by other means changing the array between subsequent scans. Although not necessary, it is prefered that the array remains in the scanner between subsequent scans. This will simplify the image analysis since spot identification can be made once, preferably using the strongest scan, if the images align perfectly.

Tips for Windows users

It may be helpful to use a script language for automating the user's interaction with the scanner software. For Windows users, we recommend the free AutoIt software which easily can send keystrokes, mouse clicks etc. to any Windows application. If you write a script for your scanner software, we are happy to included it here for everybodies convenience.

In <%=pkg%>

After image analysis, for each array and for each channel, read the signals from scans k=1,2,...,K with features n=1,2,...,N into an NxK matrix, say, X. It is enough to use foreground signals. Then calibrate it by:

Xc <- calibrateMultiscan(X)
<%topic <- "calibrateMultiscan.matrix"%> [help] [example]

By default, this will return an Nx1 matrix. Repeat this for each channel.

Extended dynamical range

Because the same array is scanned at several different sensitivity settings, the effect will be an extended dynamical range and decreased measurement noise. In Bengtsson et al. (2004), we extended the effective range on the Axon GenePix 4000A scanner 40 times, that is, the range of signals incresed from [0,65535] to more than [0,2600000].

Decreased scanner noise and increased sensitivity

The standard deviation of the scanner noise, decrease roughly by the square root of the number of scans, e.g. with four scans the standard deviation halves.

A comparison study of different scan and normalization strategies by Rydn et al. (2006) show that the multiscan calibration method has a much higher sensitivity (88%) compared to most other methods (68-85%). In this particular study sensitivity refers to the ability to detect differentially expressed (DE) genes.

Robustness

Saturated signals (due to scanner saturation) are identified to be those with signal above a certain level (argument satSignal). Saturated signals are excluded when estimating the calibration function. Moreover, the estimate of the calibration parameters is robust (the estimate is done in L1 instead of L2) making it even less sensitive to outliers, which can be signals from semi-saturated spots that are not identified as saturated because not all pixels in the spot are saturated. Finally, when calculating the average calibrated scan, the median is used (by default), which further robustify against saturated signals and other outliers.

Is multiscan calibration really necessary?

In Bengtsson et al. (2004) we give evidence that the scanner may introduce channel biases and from experience we have found that much of the intensity dependent effects (between channels) are removed by the multiscan calibration. However, if affine normalization is applied as a first normalization step, multiscan calibration may be skipped, although it is always better to do it.

Other researchers have reported scanner bias (on the same range) too. For this reason we strongly recommend that you test your scanner at least once according to the above protocol. Please feel free to forward the estimates of your scanner's channel biases to us. This will help us to reach a strong concensus of the exact reason for the bias and to see if the biases are stable in time and between labs. The results will be shared here.

Use multiscan calibration when you cannot normalize by other means

Moreover, due to the experimental design, but also the layout of the array, some researches find it hard or even impossible to normalize data in a sound way. We see that much of the intensity dependent effects are due to scanner biases. Since multiscan calibration does not rely on assumptions such as "the majority of the genes are non-differentially expressed" and so on, it can be applied safely to any microarrays.

aroma.light/inst/rsp/R/0000755000175000017500000000000014136047216014577 5ustar nileshnilesharoma.light/inst/rsp/R/weightedCurveFitNormalization.Rex0000644000175000017500000000446614136047216023310 0ustar nileshnileshlibrary(aroma) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plotMvsA <- function(rg, xlab="A", ylab="M", Alim=c(0,16), main="", ..., add=FALSE) { if (!add) { plot(NA, xlab=xlab, ylab=ylab, xlim=Alim, ylim=c(-1,1)*diff(Alim)) title(main=main) } R <- rg[,"R"] G <- rg[,"G"] M <- log(R/G, base=2) A <- log(R*G, base=2)/2 points(A,M, pch=".", ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Load data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # One array was scanned four times at four different PMT settings. rg0 <- RGData$read("PMT-RGData.dat", path=aroma$dataPath); setLayout(rg0, Layout(4,4,17,17)); # Not really necessary! setSlideName(rg0, c("500V","600V","700V","800V")); keepSlides(rg0, slide="600V") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # "Add" some outliers # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - outliers <- 1:500 rg0$G[outliers,] <- runif(n=length(outliers), min=40000, max=55000) Alim <- c(-2,15) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Raw data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - png("../figures/NormalizeCurveFit-raw.png", width=210, height=210) opar <- par(cex=0.6) plot(as.MAData(rg0), xlim=Alim) dev.off() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Non-weighted curve-fit normalization # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgNW <- clone(rg0) normalizeCurveFit(rgNW) png("../figures/NormalizeCurveFit-nonweighted.png", width=210, height=210) opar <- par(cex=0.6) plot(as.MAData(rgNW), xlim=Alim) dev.off() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Weighted curve-fit normalization # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgW <- clone(rg0); # Down-weight outliers weights <- rep(1, nbrOfSpots(rg0)) weights[outliers] <- 1/1000 setProbeWeights(rgW, weights=weights) normalizeCurveFit(rgW) png("../figures/NormalizeCurveFit-weighted.png", width=210, height=210) opar <- par(cex=0.6) plot(as.MAData(rgW), xlim=Alim) dev.off() aroma.light/inst/rsp/R/weightedAffineNormalization.Rex0000644000175000017500000000444614136047216022747 0ustar nileshnileshlibrary(aroma) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Functions # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - plotMvsA <- function(rg, xlab="A", ylab="M", Alim=c(0,16), main="", ..., add=FALSE) { if (!add) { plot(NA, xlab=xlab, ylab=ylab, xlim=Alim, ylim=c(-1,1)*diff(Alim)) title(main=main) } R <- rg[,"R"] G <- rg[,"G"] M <- log(R/G, base=2) A <- log(R*G, base=2)/2 points(A,M, pch=".", ...) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Load data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # One array was scanned four times at four different PMT settings. rg0 <- RGData$read("PMT-RGData.dat", path=aroma$dataPath); setLayout(rg0, Layout(4,4,17,17)); # Not really necessary! setSlideName(rg0, c("500V","600V","700V","800V")); keepSlides(rg0, slide="600V") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # "Add" some outliers # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - outliers <- 1:50 rg0$G[outliers,] <- runif(n=length(outliers), min=40000, max=55000) Alim <- c(-2,15) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Raw data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - png("../figures/NormalizeAffine-raw.png", width=210, height=210) opar <- par(cex=0.6) plot(as.MAData(rg0), xlim=Alim) dev.off() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Non-weighted affine normalization # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgNW <- clone(rg0) normalizeAffine(rgNW) png("../figures/NormalizeAffine-nonweighted.png", width=210, height=210) opar <- par(cex=0.6) plot(as.MAData(rgNW), xlim=Alim) dev.off() # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Weighted affine normalization # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rgW <- clone(rg0); # Down-weight outliers weights <- rep(1, nbrOfSpots(rg0)) weights[outliers] <- 1/200 setProbeWeights(rgW, weights=weights) normalizeAffine(rgW) png("../figures/NormalizeAffine-weighted.png", width=210, height=210) opar <- par(cex=0.6) plot(as.MAData(rgW), xlim=Alim) dev.off() aroma.light/inst/rsp/README0000644000175000017500000000032314136047216015254 0ustar nileshnileshMethods for microarray analysis that take basic data types such as matrices and lists of vectors. These methods can be used standalone, be utilized in other packages, or be wrapped up in higher-level classes. aroma.light/inst/rsp/bgcorrection.html.rsp0000644000175000017500000000520114136047216020545 0ustar nileshnilesh

Additive background correction

By background correction we mean subtraction of additive background signals from the foreground signals on the intensity (non-log) scale. The foreground signal is defined to be the mean pixel intensity of the interior of the feature. However, what we mean by background signal is not very well defined, only that it is assumed to be added to the foreground signal.

The most common definition originates from the spotted arrays where the background is taken to be the mean pixel intensity in a region near the spot. This signal estimated using various image analysis methods. For Affymetrix arrays the background signal is instead defined to be the signal of a mismatch probe, which contains probe sequences identical to perfect-match probe except for the middle 13:th nucleotide. In both cases, the background signal is assumed to contaminate the foreground signal in some way, which typically, although not necessarily correct, means that the background signal ac,i is assumed to be added on top of the true signal such that:

yc,i = xc,i + ac,i + ec,i.

Background correction, also known as background subtraction, is then:

y*c,i = yc,i - ac,i.

Author's comments

It is important to understand that still has not been settled if the mean intensity of the pixels in the proximity of a spot is also added to the pixel intensities within the spot. Even if this can be shown, it is still not clear how to optimally estimate such background signal, cf. Bengtsson & Bengtsson (2004). Similarily, it still to be established that the signal of the mismatch probe on an Affymetrix array is added to the signal of the corresponding perfect-match probe.

I believe that the relationship between foreground and background signals as estimated by most image analysis methods is more complicated than just being additive. For instance, it is not rare to see that the spot itself is darker than the surrounding regions. Same for Affymetrix probe signals. If the mismatch probes measures the amount of cross-hybridization as intended, the relationship is rather multiplicative than additive. For this reason, I try to avoid background subtraction in the classical way. Instead I typically work with foreground signals, or perfect-match signals only, and try to estimate the background ac,i by other means.

aroma.light/inst/rsp/NormalizationWithWeights/0000755000175000017500000000000014136047216021413 5ustar nileshnilesharoma.light/inst/rsp/NormalizationWithWeights/NormalizationWithWeights.html.rsp0000644000175000017500000002132414136047216030123 0ustar nileshnilesh

Normalization with weights

Introduction

In this section we explain how to do weighted normalization. This will make it possible to specify how much each data point will affect the estimate of the normalization function. We will cover:

  1. Introduction to robustness
  2. Weights
  3. Weighted affine normalization
  4. Weighted curve-fit normalization

Introduction to robustness

Normalization of data takes place in two steps. First, a normalization function is estimated, and, second, data is normalized (transformed) using this estimated function.

Robust normalization is when the normalization function is estimated such that the estimation is affects as little as possible or not at all by outliers. Very simplied, this can be done by using a distance measure that penalizes outliers less, that is, outliers have less to say about the estimated function. For instance, in least-square regressing fitting, the distance measure is in L2, that is, (xi-m)2. When fitting in L1, that is, |xi-m|, the estimate is made more robust. Other measures, or weight functions, are also available. For details, see Bengtsson & Hssjer (2006). The default in aroma is Tukey's biweight, which gives data points close to the fitted line a high weight and data points beyond a few standard deviations zero weight.

Weights

Closely related to robustness is weighted estimation of the normalization function. This may for instance be the case when a quality measure has been assigned to each of the data points, for instance, by the amount of saturated pixels in a spot, by the shape of the spot, by visual inspection of images and so. The higher quality of a signal, the more it should have a say, that is, the more weight it should have in the estimation of the normalization function, and vice versa.

In aroma, all weights must be between zero and one, i.e. in [0,1]. Not-a-number (NA) values are not allowed. The most common form of weights is data-point weights, which define the weight of a data point. A data point can be a single value or a vector of values depending on context. For instance, in curve-fit normalization, a data point i is the log-ratio log-intensity pair (Ai,Mi). In within-array affine normalization of two-channel data, the red-green pair (Gi,Ri) is a data point, and in affine normalization with J channels, the vector (Xi,1,...,Xi,j) constitutes a data point.

Probe weights

Typically, it is much easier to assign a weight to each probe, that is spot, than to, say, a the set of identical spots across several arrays. A probe weights is a weight assigned to a specific probe. For instance, in two-channel microarrays, the red-green pair signals share the same probe weight.

Given probe weights, the data point weight is the square root of the average squared probe weight. Formally, given spots (i,j) for gene i on arrays j=1,...,J and corresponding probe weights wprobei,j, the data point weight for gene i is wi=sqrt(sumj(wprobei,j2)/J). For example, for the data point (Ai,Mi), the data point weight is simply the same as the probe weight. Similar for the pair (Gi,Ri).

Signal weights

Signals weights are similar to probe weights, but can be assigned to each channel seperately. For instance, for red-green microarrays, the red signals can be assigned a set of weights and the green signals another set of weights. This is useful when for instance the signals in one of the channels are more or less saturated. Saturation may bias data already at signal levels of around 50000 out of 65535, because a subset of pixels may be saturated (Lyng et al, 2004).

Analogously to the above, red and green signals weights can be united into probe weights by the square root of the average squared signal weight.

Signal weights are also used when doing a multiscan calibration. The resulting average scan for each channel gets a new set of signal weights calculated from the ones used to calibrate the scans.

Assign weights in aroma

In aroma, probe weights w are assigned to an RGData object rg using the setProbeWeights(rg, weights=w) method. Signal weights w are assigned to channel ch using setSignalWeights(rg, channel=ch, weights=w).

The methods will assure that the weights are valid. Data-point weights are automatically calculated out of signal or probe weights, if they exist.

Weighted normalization

In aroma, when normalizing, data point weights are automatically calculated from probe weights, if assigned. In this section we illustrate the effect of weighted normalization for both affine and curve-fit normalization.

Weighted affine normalization

Affine normalization (of a single array) with and without weights is illustrated in the below figure. To a real data set, we have "added" 50 outliers in the green channel. In the (A,M) scatter plot, these outliers can be seen at A > 10 and M < -5. As seen by the middle plot, the outliers affect the normalization although it is using Tukey's biweight. By downweighting the outliers thousand times, the result is a much better estimate and normalization.

(A,M) plot (A,M) plot (A,M) plot
Figure: Non-weighted and weighted affine normalization with a distinct set of 50 outliers. Left: (A,M) plot before normalization. The outliers can be seen at negative log-ratios and high intensities. Mid: (A,M) plot after non-weighted normalization. Although the estimate is robustified by Tukey's biweight function, it is affected quite a bit by the outliers. Right: (A,M) plot after weighted normalization where the outliers o have been downweighted (woutliers=1/1000).

Weighted curve-fit normalization

By default, curve-fit normalization in aroma is utilizing (extra robustified) loess. Loess (as robustified in aroma) is a bit more robust against outliers than affine normalization. [We hope to implement a similar level of robustness to the affine model.] For this reason, to illustrate the effect of weighted normalization, we "add" 500 (instead of 50) outliers in the green channel. See figure below. The outliers will affect the normalization as seen in the middle plot. By downweighting the outliers thousand times, the result is a much better estimate and normalization.

(A,M) plot (A,M) plot (A,M) plot
Figure: Non-weighted and weighted loess normalization with a distinct set of 500 outliers. Left: (A,M) plot before normalization. The outliers can be seen at negative log-ratios and high intensities. Mid: (A,M) plot after non-weighted normalization. Although the estimate is robustified by Tukey's biweight function, it is affected quite a bit by the outliers. Right: (A,M) plot after weighted normalization where the outliers o have been downweighted (woutliers=1/1000). aroma.light/inst/rsp/NormalizationWithWeights/TypesOfWeights.html0000644000175000017500000002060714136047216025232 0ustar nileshnilesh aroma - Types of Weights

Types of Weights

Author: Henrik Bengtsson
Created: 2005-02-01
Last updated: 2005-02-05
Phase: very alpha
Comments: Feedback is appreciated.

Back...

Introduction

For several normalization and calibration methods the estimation of the normalization (or calibration) function can be done with weights. Commonly, weights are proportional to a quality measure, that is, the less quality we assign to a signal, the less influence (weight) it should have on the estimation of calibration and normalization functions.

General about weights

The definition of a weight is a single value in [0,1]. Weights outside this range and missing values (NA) are not allowed.

Below, we will define different entities such as signals, probes/spots, probesets, channels, arrays, and data-points. To any of these entities weights may be assigned.

Signals and signal weights

A signal is a single value. A signal weight is a weight assigned to a signal. Thus, it is for entities within an array and never across/between arrays.

Example: In two-color microarray data, there are two signals for each spot, i.e. the red or the green signals, and each of them can be assigned a different signal weight. Typically, such signal weights are represented by an Nx2 matrix, where N is the number of probes/spots on the array.

Example: In Affymetrix microarray data, which is single-channel data, there is one signal per probe (in turn part of a probe set). Each such probe can be assigned a signal weight. Typically, such signal weights are represented by an Nx1 matrix, where N is the number of probes/spots on the array.

Probes and probe weights

A probe is the smallest entity (not considering image pixels) on the array that measures the amount of hybridized samples in one or several channels.

Example: For two-color microarrays, a probe is a spot.

Example: For Affymetrix arrays, a probe can be either a perfect match probe (PM) or a mismatch probe (MM).

A probe weight is a weight assigned to a probe/spot (not a probe set).

Example: For two-color data, the signals in the two channels for a given spot share the same probe weight.

Example: For four-color data, the signals in the four channels for a given spot share the same probe weight.

Example: For single-channel data such as Affymetrix data, the probe weight is identical to a signal weight.

Typically, above signal weights are represented by an Nx1 matrix, where N is the number of probes/spots on the array.

The probe weight of probe i must be equal to the mean of its signal weights.

Probesets and probeset weights

A probeset consists of a set of probes.

Example: For two-color microarrays, probesets are not defined.

Example: For Affymetrix arrays, a probeset is the set of perfect match (PM) and mismatch (MM) probes corresponding to the same gene.

A probeset weight is a weight assigned to a probeset.

Since Affymetrix is single-channel arrays, typically the above probeset weights are represented by an Nx1 matrix, where N is the number of probesets.

The probeset weight for probeset j must be equal to the mean of its probe weights (which in this case are identical the signal weights) by averaging the probe weights for each probeset.

Data points and data-point weights

The definition of a data point depends on the context. It may be assigned to entities within an array, but also across/between arrays.

Example: (Paired data-point weight). In paired-channel normalization, such as curve-fit normalization (a.k.a. lowess intensity normalization), two and only two channels are normalized together at the same time, e.g. red and the green channels in two-color data, or two two single-channel data set obtained from two different Affymetrix arrays. Here a data point is constituted by two signals, e.g. X[i] = (G[i],R[i]). A data-point weight is assigned to the pair of signals corresponding to the same spot or gene, e.g. for lowess normalization a data-point weight is assigned to a log-ratio and a log-intensity.

Example: (Multi-channel data point weight). In multi-channel normalization, such as affine normalization or quantile normalization (within a singel array and/or across multiple arrays), each data point is consituted by multiple signals, e.g. for J two-color arrays it is X[i] = (R[i,1],G[i,1],...,R[i,J],G[i,J]). To this data point, a data-point weight can be assigned.

Typically, above signal weights are represented by an Nx1 matrix, where N is the number of data points.

Data-points weights can be generated from signal or probe weights, by averaging them for each data point.

If not stated elsewise, arguments named weights are assumed to take data-point weights.

Arrays and array weights

An array weight is a weight assigned to an array, that is, to the complete set of signals in all channels constituting an array.

By definition, a channel weight can never apply across/between arrays.

Constraints: The array weight should be equal to the average of the channel (and signal/probe/probeset) weights. Hence, for single-channel arrays, the array weight should be identical to the channel weight.

Channels and channel weights

A channel weight is a weight assigned to a channel, that is, to the set of signals constituting a channel.

By definition, a channel weight can never apply across/between arrays.

Example: In two-color data, two channel weights can exist.

Example: In Affymetrix (single-channel) data, only one channel weights can exists and is therefore identical to an array weight.

Constraints: The channel weight should be equal to the average of all signal/probe/probeset weights in the channel.

Combining signal weights into spot weights

Spot weights can be generated from signal weights.

For a given spot, the spot weight is calculated as the arithmetical mean of the signal weights.

Combining signal weights into data-point weights

Data-point weights can be generated from signal weights.

For a given data point, the data point weight is calculated as the arithmetical mean of the signal weights.

Combining spot weights into data-point weights

Data-point weights can be generated from spot weights.

For a given data point, the data point weight is calculated as the arithmetical mean of the spot weights.

Restrictions

Note, currently weights are only supported by the RGData class. [The plan is to make this class the "main" class.]

Currently, it is only methods that explicitly say they support weights which use weights. For all other methods, weights are ignored.


[Package aroma Index]
aroma.light/inst/rsp/AffineNormalization/0000755000175000017500000000000014136047216020335 5ustar nileshnilesharoma.light/inst/rsp/AffineNormalization/AffineNormalization.html.rsp0000644000175000017500000002302214136047216025764 0ustar nileshnilesh

Affine normalization

Introduction

Affine normalization applies to all types of microarray platforms, both single-channel arrays such as Affymetrix, two-channel spotted microarrays, as well as multi-channel microarrays. It normalize both within and between-arrays at the same time.

In Bengtsson & Hssjer (2006) we carry out a very detailed study on how biases in each channel introduce so called intensity-dependent log-ratios among other systematic artifacts. This type of bias must be corrected for before any other normalization methods should be applied. Thus, do always apply affine normalization.

(A,M) plot (A,M) plot
Figure: Affine normalization. Left: (A,M) plot before normalization. Right: (A,M) plot after normalization. Due to the lower signal-to-noise ratios for log-ratios at lower intensities, we do expect to get a strong fan-out effect at lower intensities. The "inbalance" between postive and negative log-ratios at low intensities is due to fact that the sensitivity was higher in the green compared to the red channel (although both were scanned with PMT 600V).

Model

Data with (additive) bias in each channel is said to be affinely transformed. Data without such bias, is said to be linearly (proportionally) transformed. Ideally, observed signals (data) is a linear (proportional) function of true gene expression levels, but this is rarely the case. The affine model is

yc,i = ac + bc*xc,i + ec,i

where yc,i is the observed expression level in channel c for gene i, xc,i is the true expression level, and ec,i is noise. Scale effects, such as PMT settings and labelling efficiency, has a multiplicative effect (bc) on the signal, and scanner background has an additive effect (ac). Here we assume the same scale and offset for all signals across the array.

Assumptions

We do not assume proportional observations. The scanner bias is real evidence that assuming linearity is not correct. Affine normalization corrects for affine transformation in data. Without control spots it is not possible to estimate the bias in each of the channels but only the relative bias such that after normalization the effective bias are the same in all channels. This is why we call it normalization and not calibration. For instance, for two-color data, the normalization will assure that aR = bR/bG*aG will be true afterward. For details, see Bengtsson & Hssjer (2006).

But if the channel biases are small, what is the problem?

What we mean by small is a matter of definition and because of the logarithmic transform when calculating log-ratios, a small bias has a large impact at low intensities. Consider all non-differentially expressed genes in a two-color experiment, i.e. xR,i == xG,i == xi where i is any non-differentially expressed gene. Assuming zero-noise, the log-ratio for these genes are then Mi = log_2(aR+bR*xi)/(aG+bG*xi). To start, set bR=bG=1 and calculate Mi for genes at low and high intensities for, say, (aG,aR)=(0,0), (aG,aR)=(10,20), and (aG,aR)=(200,20). Then try the same, but with different values on bR and bG.

In <%=pkg%>

In its simplest form, affine normalization is done by:

Xn <- normalizeAffine(X)
<%topic <- "normalizeAffine.matrix"%> [help] [example]

Symmetric log-ratios afterward

Equal effective bias in all channels is much better. First of all, any intensity-dependent bias in the log-ratios is removed for all non-differentially expressed genes. There is still an intensity-dependent bias in the log-ratios for differentially expressed genes, but this is now symmetric around log-ratio zero.

Normalization of multiple channels?

The affine normalization can be applied to multiple single-channel arrays, as well as single or multiple two- or multi-colour arrays. We recommend that all channels and all arrays are normalized together.

Why is between-array scale normalization not needed?

Affine normalization will (by default and recommended) normalize all arrays together and at once. This will guarantee that all arrays are "on the same scale". Thus, it not recommended to apply a classical between-array scale normalization afterward. Moreover, the average log-ratio will be zero after an affine normalization.

Why a fan-out effect?

Note that for a perfect affine normalization you should expect much higher noise levels in the log-ratios at lower intensities than at higher. It should also be approximately symmetric around zero log-ratio. In other words, a strong fan-out effect is a good sign.

Why asymmetric tails at low intensities?

Due to different noise levels in red and green channels, different PMT settings in different channels, plus the fact that the minimum signal is zero, "odd shapes" may be seen in the log-ratio vs log-intensity graphs at lower intensities. Typically, these show themselves as non-symmetric in positive and negative log-ratios. Note that you should not see this at higher intensities.

What about curvature at high intensities?

Note that an affine normalization will only remove curvature in the log-ratios at lower intensities. If a strong intensity-dependent bias at high intensities remains, this is most likely due to saturation effects, such as too high PMT settings or quenching. If there is a strong intensity-dependent effect left after the affine normalization, we recommend, for now, that a subsequent curve-fit or quantile normalization is done. Which one, we do not know.

Why negative signals?

By default, 5% of the normalized signals will have a non-positive signal in one or both channels. This is on purpose, although the exact number 5% is chosen by experience. The reason for introducing negative signals is that they are indeed expected. For instance, when measure a zero gene expression level, there is a chance that the observed value is (should be) negative due to measurement noise. (For this reason it is possible that the scanner manufacturers have introduced scanner bias on purpose to avoid negative signals, which then all would be truncated to zero.) To adjust the ratio (or number) of negative signals allowed, use for example normalizeAffine(X, constraint=0.01) for 1% negative signals. If set to zero (or "max") only as much bias is removed such that no negative signals exist afterward. Note that this is also true if there were negative signals on beforehand. Do not apply curve-fit normalization to "correct" for this.

Alternatives to affine normalization

Curve-fit normalization

Curve-fit normalization methods such as lowess normalization are basically designed based on linearity assumptions and will for this reason not correct for channel biases. Curve-fit normalization methods can by definition only be applied to one pair of channels at the time and do therefore require a subsequent between-array scale normalization. We believe that between-array scale normalization is rather ad hoc. Moreover, curve-fit normalization is not capable of adjusting for channel biases with the effect that if there are channel biases log-ratios will be compressed at low intensities. Example:

Xn <- normalizeCurveFit(X)
<%topic <- "normalizeCurveFit.matrix"%> [help] [example]

Compare this with the result from normalizeAffine(X). Recall that the fan-out effect is expected.

Quantile normalization

Affine normalization can be though of a special case of quantile normalization that is more robust than the latter. See Bengtsson & Hssjer (2006) for details. Quantile normalization is better than curve-fit normalization methods, but less robust than affine normalization, especially at extreme (low and high) intensities. For this reason, we do recommend to use affine normalization first, and if this is not satisfactory, quantile normalization may be applied.

aroma.light/inst/rsp/figures/0000755000175000017500000000000014136047216016042 5ustar nileshnilesharoma.light/inst/rsp/figures/NormalizeCurveFit-raw.png0000644000175000017500000001370514136047216022755 0ustar nileshnileshPNG  IHDR IDATx}T\^3!!D}j&hBQ3Yj;p=vuD[6=mw˜=eq%&Y=XItًFF1 < Bx'^f < ~?r{/>syssU dnd,F;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH;Se.7G̞}=LKI# (vDbG$ (vDbG$ (vD_J]EX FH@#P;"ŎH@#P;"ŎH@#P/WPj9GB6̙_Y",>|Gfp&kSJɂD$3PEa~h'`vvr%=,E# WYM)6;vʹN&ӌs3?(@!b7 H$ ֐WI#c(W+%ɖ!D^%]_%A] 2sRrUQpj^ID^^X?]BԠZWA#?+()`\fg,y;BwγH*Y ,%&y;d1Mf=Fya&fekۊNeR ;˭ ̓Q3s~x~,AMRb);P%JXYKDdᘴ'^'dd)$r O4DP,`]ݦ6;`Edt]́cl3S (Bؔmύ^Tjz ';UYXd#f~nWI.¼f`.9/Q[Yx X @,rƿLQ@=_1we;k(,Xpl ڇy:/_W>Z^W|X;^u]b+oS갖VYQ}d,guk .8=Z6=t-Ot @ILK3,sH5 ʚ//GS1)iv硸=7xZGdtmUt@O/BcCo 'HR JuF=jҾzÄf _y* =AKF`텸tK zw/ H{FAaE7v}|Jr5[NKUէzd *Vz\ߍdVRoYoU-դߥENԾS. t-0tz<#zx>-yӭ|S#&5e o.[o=D}@{m"ДXx$WaӴ{T[?Z]ݵxjDjƮˑ`,Ok{I.9ԕ+~rc=P]).ua Їpi5wg>zɿ6[_R C: )`7jRn2]: Cvm%Vh 쩫.ɵ,û.\hdNrm[lEq4zآ33T(@chL0'-JnTzfK> cL|Γ7wkV܏PuQ=͛^~Ǻ-Iݝi72ެAUJ;9%I: F@ ;`KRF;cZqvTXe4_elЊ-xUcb2~rbVb}qO^JL5%Yx}1Įㆽ(|> ;hvUtrFOwm̮ӴTmE`˵R>C%Pg${ez1M+ScΗ_g4F@)eX7mJ5c{,l^404d1B 7:Ob5k8q݊c e=v%sv+paI89 d`Vvi/{T[4Ŗj)7-Ѵ%,{0)ۍ3/?񣓍FodM8ť&"{ -]ZFA?y2~˚-tژkpԽ뗘 8s>W KKݴ,aM|#Gk1,KeejZ&nԴٸ6,M+E:g5m#! uԚTvxj={j=Wp֭Y,0[l>dvpm3!vb]ԍUӏZzakQpZp}:ɪNYa+X ֭·f91?h8NLqpdxM3cھDG'o>_WqhPW }vnz؝v'77i?q)#ZuzA@dߗcf[CEӶ 2n`^Qu)=|R\oQm(1{G@#o٧meg^LtY՞Ibn gz:m:G5ut9(Cr9b#74&A #%k@ݽ\+)g RҴ3_dfSY!3Yqtr]vv%~7ڮ܎ٮ'F?'5;i.?}f`J^% ;>M勇Oó<ѲxRӖL~$A]bY)ޱ&ը[r:O؝E596itw\wF ]WRLnftAsh]`k,x ?~׼zk~qϼFw!LIksVY?D'ޠ~=-jd)qk9Eڣlt%EL) 2]!{:tqŪ3e 5Uje?xMJ3}]>;v~zP7u0&jܹQаqRl<ߧ{Bvd%#CVyf٨uH;mi+k:FY=C7Q=i@|5J3-1>(8EhiNrf.Ej˓G.ƘH@hB#P;",cGU$3AU$:vXE2}&k)J,Q] M$ t1{  $WuOZﴠaJah6=O5 :o}Ԃ Q;XvWd* 5%8+(5+(ys1 e'"Avd (vDbG$;K;"n|ciW "4ƆM3@Till$۸lA}YNJs>0vJGQ>ECFˋQ#2GL TTx32}'i.-bGΝS]h+͗ti7_U]N[ ʰjf@m B0(ۉ|x'p 5+yBHQsGSnOHNME>1@ybD1@ Q (H$bD1@ Q (H$bD1@ Q (H$bD1@ Q (H{'"7,0Sid75_\9Z{u;@g~iOwwㅽI&j~[;ٱ?t"kyaDC=UØi8ϻ5-d&MߪθD^@"V~׬ ԁ]^!Xۉ8~"*L]KZxv[_+f?n7Q1@WFa*z Ѭua/{V֗*JF[_V؏zc_E|5FCla(#B+,2^.IhaӁ' poAou3e=IeE~cs? 7+h:^W8zh| VPtN*Vki|Q  $hXCz~,d䨹Ul0yX.`ak+Jjh?p؎(ej+s*&jG*ghm uY;o"X@\:v $z_HZ.JW[kCk*9{/$wldLPi Z_h Fʱ^ {[aG JE|c*Q;@KK:-mmj%( s$G^ͺv~[hsNs …+SiJ|} ï'\;[>=5)]uQ?b3 CnM PζZNJI4Iu } ~I%x)a#lU~ܠYX?Sn'-ٓ؉۪HԪb'Z-MukR;0.,x{<"_;KOsB^7mcvU-kzZg,43#!"zA-qw.V)n{mqk-'O_u+@%p5@aڋROMQ4)hA6@o[@q4U"3tCfUԚ>dPN+ L6~ҙq_e B*qp<-lYQ`n_l]!nnckAmhTqwl%kS P [ 6em;NS+nst55ӜkO@0%̑.F{\Ŋo,o@nfBGiL@Wb,s O 75ڔq U=nCF,PŃQ} L4y\u׮xN-ExCr{ zA*Z(UX#nzUk@[Ϲ5`4VaH ГEJԮ56η/3[ jIvk"SJʴ5 x`ͼ~M\W7~R9ڍM3Kt9![#e1)ʡdEw\hbZ጑BA9(}tCuW)q3V?Xj(Mq5ΑH nK)" v &h/5ĔR ])vuZmuBh)*ZWqiw$ΑLD:%># )њnƃh ]Xvs.zZҭ "> 35^䶛ʐO<"\_e-&Gzoq3yO|xUOzÙOy.}P;G?n`)}`ILaڙ~Q;q.'7@pR??w!}R2lCj8Gxc'?E;?w  铒a}~}"탎 GEvr"[?ҍ4oT3 ,Ƥ n@x76|d?Fu;Gm$wV]%> @♉劰,X `X5x/%|Ldc)G5x79mLdGCM7x79A`&!Ff",/m A*7)9-hCDKg"iUp'H(Ud",}ɯ`N*TU%t*W@*nSzK$F+ v*wS9,ʥUJjT.T6d*n骐S9S9ݦrQUp'\TD#ؾN2ˏUGFmԩdT@D#ؖTS ώ`[S)`[S)jtJI`Sidw*uDFܩg"Dq&Bn;-TnN rML:JQU^*'S)T;:qRGN%P2[Siy"yw*rw*m7[sfr w*m;W.[K6rUZஆm;[3WCo 7Bq&53G$g" ~#|&k\7Z>|x'޹IUS)ox& P$VDtU:nN[g"X垶p=U{T _T!Ӟ{@)I\爐bē $H+v8Ui0: ϲJG!|Yn[Co"n=vЇ.,[ηݞlu jV֞텡xO7[<|!uāǔD.)RՉbD1@ QU<۹9T3@?g46sYU P;of촧櫫^:){ԿJ^evNƈU9@'2|i'='Jn޾_̖'ld/-pޗT {`_037*huw"H$bD1@ Q (H$bD1@WIENDB`aroma.light/inst/rsp/figures/NormalizeAffine-raw.png0000644000175000017500000001341414136047216022413 0ustar nileshnileshPNG  IHDR IDATx{pT}ォ!Ȏm#ajwhIjn7# h4 Q(j&R $5Bqe cm$ޠJ{:cZ@]=~?lݫ{^}{=!@Re,G;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH@#P;"ŎH3;Se>wG澞a$ Ӭ#T (vDbG$ (vDbG$ (vDwQ?,( ?d;"ŎH@#P;"ŎH@#P;"ŎH0 MK(Y;^SyΈ,]T 82gm,yJ'%7Ǝ@YJeaD9^9DvgDFTNRlq;9,Lk(vK̬tHݸ4<#ѤW;!GGЪr%1%B*_%QAM 2{skR M*p^IT( w*w !(ڕD :0`% ,YTU0f +*@d9PXK7Lr7l (jɒ٣1ySrs0SaVb߭V1w{zd>Y6[QD(yKD^eTn(aZf~cʖH4ZԒ]b"ߒ|Qq#h0YZ:Ӯi^久`EdY/Fk, S (B8ޗ//rDG-%]@* W}t)zBS]Me .qy/6_4XT,|b` hG:rzqqc9 ˋ0(<38o}oyi,fg 5-oj?><5p=}m=[{{/eNR*Ɵ6oaR8'"?X?w EM#0s^xUT y_kDɜǷo)3۱0}qK\Yr?e몹1V$aH'3o&T߈  L/I:ESrmv|X!/io'Okz޺)?K{Vquִ+Yf.Er_G_|U}C@?0hZ1$ >a mC0a_ax6׎ mE$ o_]#VG5ԡgvD;@ayKq#l?²&8<yfYa _v~nVhi~#w+15eu.8{f(PS-+ x) Fa 4+^cPm\ݗ{[LpW~ɎvGn~ā^8J` C#.Wt+Fv@hS+pSAf&`[e݀g\F9Oo0zbI3nx:N$C#Ơw0yv^{*]گ 4վ)ʾ^sϽY{vM,՞S"ᲇ76k/AnZv? 7o~daGxj{#*TC*`DAL *T(000L *L1PGň*Q )&>`VctyHʤM'FhN5UsƀiS^ڹ|@7/iо}ݘY%I9II{9&WBք3 m?fGڮnI.Ŧk⳶* 0(` wE`}C *| `W`p]]7=F{_6<ٜgk{~aI1.ߨ7==ИPgE{kQ?q {WWmāhu_4`M rK,WoxzF+~2at"cS@. ͊9O [V%'nܺ/|shV{_JKT]jjJ[JIz%t>2zk=kZ5i?"Ǻ"_4W.FnKqIQlqeo ,I~%[S F1s9%f)yuiCm=wZc ۟[l[aVqs=W ѻ޳s]gЪOy ͫ\ے͈϶VJPݒ%/ԯ+D0[bNo16vsb dWM?̿Nd11fsYD]1W;qe(<ЇkP4uV}+P?<~ɛuuwhzJ`_aKoI*DlNںcmj @̬I{6cGj9Ɯ"-k╁F_dƶZj&4c4W{Wޝ5~?pmEps)ٖ$tcz[4»0[+X䏗c<=ʓ^Ͼl=Zl6@%`"w)"v)ql֍>~~[5Gs^*9pƉw:1gǪq 2{ܩ? ?s,S3v5T4]O 2x"3-[{=1Ku8-umٜ?(F۷O{)q&IW]^lJ;oc#c'yOvZVcדgvnJixXM!v4{Ưkq[V glWgrºv {J?u's3ڞ{e+xMλ]43#?j ^8~qt!~(3V^V^\]Wom-lB^ٛgVq-Y)bn aU{c`ׅol Kf[ʶl \74oz W"F~L+ oK&{,ehJuס,tl1~̻N]FQpt\K!AcO(y1]M\ݑ٣?mldGOE`~Q:8f<嚮|Q!Y(ho-nָv5۞ ڣYAGX_[E հf82nrI֤^[TJ1HO6+@O?orŌ>]Dvy/cn{sqaf4e6=2{Y㗴d/.^G-|s,ݢ/i?'ɓF,]`K1Q7w,5)ʻ$d6)9.Mjڛdf]4텫[|-N+`5tnCʯl2RmEb1#'q=r3GE\gMnI*E׭!'K$X7PbG$ (vD9ƎU$A* ;V{)%Bn(aZf~.&pI"ВlQ4̓LZiW-JFd @$d1ډt#е=# ŎH@#P,u.%n .0="JH@#,J,t#P;"ŎH@#P(vB`ڼ]$/B ~h a ,9K+Br!#r+}=raĎ7 /^';'r,<1{AX6n8[rBF2UTrNg1p!USM6)&RL0Ha 0`"1D c)&RL0Ha 0J`; KXSI al^iɑL KTS(}H3e˛WZ[(DiJNtRE-]WzI_^h]*JQjwo"*4MAתּ@Էҫ(DR)|0/8@vy:e-":LY<$[ / xBATJ  Q _8( c҆jiRJBTnxH4ZRrnn<݂hmc@[7` EI<褌nGB1oˉCuŽy&)_R4LL`RBN2a k a_4~Gts QFdfyºtVMg]J\iK {W/ehl4n^h }y] CDjﴇ=R;K\&"# 4GX#`tE"RfD}$^PǁI :ù)b;`SYM&P9<-!8Hazȡj=pJID&RL0Ha< 9seSHCx'!:y&tL29=!&:!yG&yB_OYNub WNwH!cꅶ#s&k}#? 9;Q!gc7hԎ4#q ց(r;!щRJ3̍U<P+f3oz<3xbG*rD=LD'f \`wD@Zڛ@A7%*gcIuFK\^h_xk^W L3KDeW#)&R ,VvSSrp*x"1.eCDBׅvm9Ǘʅؖ;WFaP&DA8j4Ol0s,ϊgv!j۞'04F*.i`'քh0~7ĚPvng@ 9`Rc'G-?_|i\o<0R^l^yV㯍;b{/h۶ckkEDWWPʯpg܊8)fwV%y7PG<37nj\8;c]BOHwܔV0:SJ)\?1͚x+JI2f]|b`ZwX-miY[<'72Oyw-W߹h Oy ltVv127 D(cXtO.Wcgl{!YֶIzsYykEq#(_mOԗ]wmg߹^x&~k(W#xH5fw@C Ѻ锶sb'֨n2 p_Yv@޹#Mo>i2 ovN?m`yuc_O?z?pWWH}7b+UP/ MP<-Mm"?Mw N^㛌h.k_w};{ H]h~_=woOl;n<{v;|boxټj޹{3][-s_i9SN+X:ۑ n7\pHaZ?D0Ki8y뽀@j:D0U}bCh@խϧu/^xK˥%Vz2q䏌{/L57|'u2wyNzm9鈇D}kCuz1|7y)HpR_Bj\ PFD ,h̷qyWpxצLv뷿a ZtOy7[=c'T)?Ceqf% ?ڸw\I .hLАp0M[J .T@@j Lp%&IKb_JB A@ $a^ G%ITItIu[`O{W$R)n]Q7 = ,XW= +֬ߘSxYu.`F🦯ęlimoc|c9|\Aoi0e&~ eIW?8&"Q# TI@7{I8(IaA@R>hHH5rOH G$K$R@_ 8 $z@gU 'pąILg sybtx8ac`&J/47^d:~Ɵ&[sS?<'܁ gVēknyG#y'F~w= OxgWN󮇶^wLJ4X{m[W<1crهV* $)hАP-P H` .T @C9wF ALsR1j@҅n@x'4,@@B@sCR`}gjpt[BC`.3\X!P)1ō3nv] nvcnս_vO_u7X`933zW?KD߽ex?Hmֳl󉅝BŪk-I̙1{lԖVm|mD9ƀ.hǖ~-=$c.H@`@ Lljf6]\h.А** 4d6GC H h@B !10)}!)-M=>4 Xq_zZ|wOJf+Mom6pϯh@0ڕGx!n쒀Z )nPGNc8*p3ݐ if=$0r^;״|b|xe7.Odutg8\+}ht#9А@ɶM@ac Hj H:OңV.8e~5o_Nwt"]@,6{<؊ z\HUI}S7{xb[5F0#y{$  L HCDD>gU=W$m= ghKt $$_?Ǔ.Mc#q$=kmco]0z/-7YwWwȨxIDv$+$*ӚG%āxx`;܊SzZE-hm02YDq0C=Le]z 9t͜jv%`g9Vz?\ `Ql;% 9e_RHLkF$ X}=7\2q_.3ׅxh)iUEzcՖ\(HteDmTlBǗ@"s~jQ>?kjf,,&̒Or܊l/y4|̒ yݽ"Н)` -zFh楹}Ѝ[Tzdi5-6ş= kZA<8L1<=e@)g{Ƹy"[ [=%\1"7M73EmD2Me*gHYJiivmeR@3>\zN˼@< /^Su31c% ݶBzk_45-6㨷en8qXc%ភ ҕi3ڔ'(sbyZrf*1$:qX7]`S}QmF`/o;Q}ƪ/bWnC:~NL_hwfg^ĝ ʪenc' @_hꍞFloxZxV;UCxhb\)t<)H9keJt3rF3Kώi^Vl Zx@Vg`Uv2,3`{Ų;e:gdˏ:6el[}AojWFWNF5#vA4f57qjRIG:.Vp:gK/o0KN5z> + Id'As%phLkuSƒo6n΅ ο&|joC<+bJ_Xǎ| ,{T;SY@U[3xWIir9.YGX*\Ѧhpƪo"!rn1[3cF 0%?y`c%x2/ؑ6!!~?Nykw"*#Bw44%V6{:9lTlBLe~/|4N\ZF`୦#6{:S'g.֔-F ͦ|#?5%y^VA?澹ů|Q뤈p RJ) ʣ䧙O|_> |,)e>iIi5_~l oZG[-`8'KJi5?-(U0Ef   Y`pQ) |:)֒RZq/nI)G~i ` 𻼯bQC)Q v4+[f+8sf3_++ܟз+,o+x8ǔ-Jc <쏄^Kiq5 xk_4Ŀ c߅-B'L>&# Ik^[dʎl1\tcivE]'ؐ>Xf+5-rT=1)͎l5e3م9)%5bzoSvg;|zɋBBNhGVt|} o󽋈FQ8=KVة~qNwt}BwU#*',9H  bVNY )ݩS\,OIMTJVD7P/j)c`G&& 0)T p:uqCpjx0QAW8&RL0Ha 0T0)HDTL0Ha 0^O]-Hݎn&lB)&RL0Ha 0T#"&RL0Ha 0`"1D c)&RL0Ha 0!!:ю4!dgHCNi%cGaJ)rN Ѡ)3Z<]1=Vg/x#l]kmOnql]񈇄oasj%+iOfqFJ hOr_zJ䓴\vG %߬?̇ؽ(Z*K>X^m}sblj5p.}y]vmwn>9p<^kmL ⡬q]g6[a [[=]1X PٸLJR)Mh"1D c)&RL0Ha 0`"1D cOeB.L0%T91TDMeG髴#}ʚ80'tz"RuK|"9>0($PQPD[ȹs)Fb(EERYa|ȚA`e̙<ȼ N\rʗR+NxDgKn|ΓVؗo4 f7twx#OOI78F=mc9H7[;(sXBW :3XO=A,Ym#3R;<1Hys4^t+rL/aU^Vuj}VWJ'`a-ۜ!:*r09؄≇Dsǭ#_[`"qHa 0`"1D c)&RL0Ha 0`"1D c)&Rmሑ?IENDB`aroma.light/inst/rsp/figures/NormalizeCurveFit-nonweighted.png0000644000175000017500000001400114136047216024465 0ustar nileshnileshPNG  IHDR IDATx{T}]` ^3Y^C+U9nhDΒTmFu4i ꩓stpN5 ʣ~9j<$ aK%C,%+IF;$$Beah}bggg.×; !3K]r+(vbG8(vbG8(vbG8(vbG8(vbG8(vbG8(vbG8(vbG8(vL16#3 {_ho)w=B,bG8(vbG8(vbG8H1KKy/RI5bG8(vbG8(vbG8H4v"X'`d>K0vzS}qS^KKJE, ORI0v:SnFɼR}S1s( cq懦yi.6KKJFVsjGuJ7Yu2h(vLP:B8nL'g$pb55PHPfF#f0JR$~ )tEfߘNB+I)Еy0QM+I!P^"qJ$;t"8ʊ+bi* DnGMIDC؁-!IE#Y?8F)=Z ħыkty۸ K[\vOZ-*cE_Mp/dfZx 3&2+*]I}7D *r6[Ê|I"_mC](IVN\M41ZTVTluiȅm;h<{ 6l^İ"_npwvS0vvґH*FH"7_t.GĠ"Tmf{j]guyH]8C?:R̀"&X{Z6RۺX|Ɏ- iڌmF 13Bh2@ V׵%=ܠM (r}ۮl^aH;k-NNiZ@`rXcf2Dw$.Gt>E~G-tٓ⺻Pi[fO]G-Q**UZʞ"uY*ǰ!эdGc*_#T:mnE~5jaS}6(9/Mm9@6{v`Ϋij^[W[l6F s/wq+_Ùm'UEWYT7oOzpJ7[F%l*~ERS]gUv;{괻rJC|^"'P,Nuh(dŠoeEˊ @ը?hrw'-MZ̒kMWOOQyP$|"Yݾ[=3GBZ `_дvŞ' NA4/ ;OHIҜ3uS}{W链ܛ"@3{BV$(p?=6[ƥZ'ߩ>*wok8P\#<޲1vp{{"82ЌAc' .u!Ad:ջpeKݦglG#7znjwMR{%Zomyf]8,W1K~y.l<`>QSkUͫ~\{# pkk6ot8$㇁MN>@S;[ &wP?2G/tYs;cߨw6/R\+W*k~|~_E^2 -f1g?<‘a!W[}ȱ= &oɹ>.K?qB yK=HYLޠl2`ڽ:V;0cy#67͕@ß3j'_lGsPǮ9tsq X^`R@M  Aˁ0&?By^=dfKN84 AB4kbegg|fWO[-t6=f@^}HiPd(Ti   c Lf` V`?  `i`A>0+`23 @H1,u3F. y9Q,>iLZ\u7|'3TɩbW4@#ȆY` +XB#l1m,l\@" `XX+`2``K+B`Pl]XBpkYH?>$#i9.yd}ƪ\է{WԮZ/MɘI%JE 9'cs}}0,0,"(i b$Fi20c( 30`o:F2a,@`!Xb /b$lo90,Ybzkv_n] [.Wuז<$vCꦨc tȭW .~פ̀D;[jdhnO97 aD &V" 0  4QW@:C! LX\"hI_azgd "#sq|ãluOK-~`Yd/!PI yZF 0 ]. `0( J*!SD@WC`L41+&kcS.3kEeűrHtVY1ߑg{3ˤdyJҪNZsUn偯wx8t  \a\N3W `Y  yYݢA鮪u%kҵgh䆋q-r 9+]Ϯ9%";-lly̑ʗJAp } = z>`8:yH %4t<Ǖo%~r]<>c5҅?@wN7 qR~JqNSw@9in1֬j6brĩXme^e]GsoϼѤ́~%5 tZ^Sޢ`EUf6'qRS] _'Mӽ{o.9wVKMOp@GW)پο_D E?ci ;͵ϡ{C?[s#kWY}V<~TZzSRh;g[r+JBΝMzZ7|KWxIuznbqqͭMs7}ֳ+Cﻺ2_ZI_[AMڹ2o 3IxץJK5O~/Niis$&~G( [HI$aRHoO@~w\'qefQK)G[eי8vms#tݛ69j5"0Qkٝ&mRЏȻ5+Çm|f{UcS S;1F:羢c4ilwE7yṕ$N횋zu6iS-[;/Dzwlr9I@ 3J\s^c5 )->rSWHG_fb0}WAW)-/)U0\k<8ʪh*l{C?-OOX ]^n6۰7Bc[ó41j+k:[~Ȏ"TɅr-QBNDxv5M+9|KʒQCPm7n3o` @99UJ#Y3gmieI:]Lg:;Ŏp@#|*M$S#;}=%tvvۑQߎ%;Ŏp@#Sx|q -iI5`5dڎp@#P;Ŏp@#̡Ꮡɋȑ_A` ;mW}0fl"5*+:1vk'l_d.2Ȕq5R]%w8Bo;jיU1݂.4xFi.5Cj6xΎbG8Fp@#P;Ŏp@#P;Euu/_iBIENDB`aroma.light/inst/rsp/figures/CalibrateMultiscan-RedChannel-after.png0000644000175000017500000001050214136047216025414 0ustar nileshnileshPNG  IHDR@@NUPLTEHtHHHtHHHHtHHHHHtHHHtHttHtttHHtHttHttHHHHtߜ߿ߜttHttߜHߜttߜGaIDATx] {ܨ&UcM^{˦ͶvOk+_5oYƀx=03|l{D0oDw_'G+y%:h%m#I^>~Ũ~Sd)p[WdDHlA̕(_P$sW%@u&l6םznjITu6[Z8WN/&+, ܈|806םf0])Xa.o& \h8YyrDOpXؐbXaN@&*L~ ukd?sAs{ Lb}l&31#eFb ȑ^ђ‰FQInHa9PnHާ;v{tJH'߿#+ޑJH28t"i<CY L" #6c 1Vgju搎tLHGHG^9#ݓG^fב Dr8 Fdwr1L|[3s?0ok6sB fAI|,Wcv=0Hrd80:!؍!-2EkY_3֝#\n؁םhɗUsV饖ۚDGz H@G":fyh';i_.O&8٘9Hؑ.RT:#50Dn΁C9uN0IШS^-:N}$BB6:Q7s> ֓W>H s*֌gWglǓ`Ϥfo#k?/f0z`114xv_?#dz[:6`@y:F[ 2J xq'[ޟ7BwQN5t^^zx!riΖLVk-r]r1y$^'C 0`GpR%}L{=%OD;9D3! #Ղp͓(+-֤UUU'֕~\*a=~jCM9oCB+!4V*IhBuIkJK>ʥ1jTͮҠY t~An'OFiTXդEK*xy ]#Fx9EZ6->ubVY_dn%5UG&WR˭OKO AR~.e]Mms[sDJ m.e\>v>) 2J"-^\ yk5z@ 3اur!0H 6~4sFT㳙9 1[|Gw-1w޷]益/INym*ɪ V &te65QȬ|I#hŔB yهKgeRh(+2%/ QJ*z ˙p h nR$ȑZ BKAiI*ؘzT%+^J+(gŃgR{ML޻J>3%U4ڮ#W@j^@5_{hMa:+ JJCqj_i/YTmf\~!&rt5]U'Kv卙jrQi)R-]Ax9Kb wu\PNv0Ez2Rl2hqNH_BgDgcL3QxX^?W+2jWJFl1%PX`~&NY[䁕bI+pa?!,U-wrю lrI>{GYH-b9:*d;9V[F՗I'񀥿LX~r2MJgS90p;vyFD?On#x-(uX:O% 3 N69`8ҫU fduI@HO mg{GTꇔHJVssWQ0S!RW.Dcv˲li>#b 6 mz _G nDnQnHDt!u; vm$2 6oi#WCR,7G[GIL vNbHՐ:҄r$ZMp}0YN0WC&BDH۹TD #Hw)PG"v‘n"3VDz2ur="[ٱx2hRJPNR`Pn_Hg,>:5+MvPn_s ;*BOPIo%ᦒZaʐ)Rrvd>W(JٱHD 崎 6=l(B9ʚk5P*mP.>2 ֑ PΈicp=h=ǦC>[HXstFJy:lHD'o*#'PY 6֑(qmM%;2@3̾oƦ́%3l;oֱ¦HļoRv~w2nWVpU>Wc VT2"@MPdD^ĔPm#=„PnM!&Άr[o*PSHd6Km& o*f\Mok_(mM 99x[޷5ǘokZ1%Ǿ0!Pv10f̴`B`ǵoG"Zdq+zH;̇@ǾQHϢI7un*G"ʍy8s$b7Z%QS-Gl;c$ÔME"r=.\o:RMyHĎ Cw*޴&Sl 4TbTwR|Oރ#B m B@`v   D            ":gbd;.nc+Ra KS G9{_㉳哕 [š>'[S seA8'o%5U*9ybk*6tBBP&5Q*9qTlő` BAExk,4P"t\ݟbXB`xk T_(= @&f7|T6~kJlɻKH H H H H &]_̉=ݙ9{Ŏ Xl%p^7_%PeO/ ;'FȾV$0Y݉FCV7?$ mra{e!rЊrL>HnE>ӑvHE( 7 cxHđG"?rc?NT@v!ϒK F \|rޖ@Y@HQ:B D~ H H H H H H H H H H H H H H  M:IENDB`aroma.light/inst/rsp/figures/CalibrateMultiscan-GreenChannel-after.png0000644000175000017500000001046614136047216025753 0ustar nileshnileshPNG  IHDR@@NUPLTEHtHHHtHHHHtHHHHHtHHHtHttHtttHHtHttHttHHHHtߜ߿ttHttߜHߜttߜwXIDATx]b''վ66ko[kZ @BZ͗de,_Ab D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D ~2}>X/ihPGGC<> PHuu*| le8]k"nz=r%W@1ԉmRjSd@º؄3cM5IUdMٱƖOEP%I 쁫3W"ު3b΁k3ƌx&̘M0_PwS\`8#+Iyt%/l\!rE>^s |J%fu = p9o\9EQj"32!fF!&=#+  q ڐ ¸s |ngHw~ҝ"tL`HGߐ\woHw.{7;qpC:q<Ci < 6C 1Vgku搆tHhHgH^9!ݑ Nfא DRa pR~Z390QʥC0fv`#֌4-DӚRD\ :sP3{ZsvLIy1a$G4$tZsQ'}XXvt'sB1C[vd1%_V́[;2jnk:~6 "m\!m6őrF:2&ccӠLN@*tV#Y B} Q<'2CZ=Cϗh i2gmsC:XF޳!Fد!!%nz`E(t7@9nKшYRG#[܃.Tjn돠Z<qEyJ`ȫ9 +œ7R36Xo5&(U:l:d _,HK>vUb&6䯛 t,ͻC64ND\3a oÓGjHICsd\29UV_g^w_|xf{:a i.{Zry&;1E2Y/\N#CP! i앹MHH3L9CU /d}t<1P!̐փVq ? ju-mqL݄̕έTu.sɕ9ksUsM dI =3I)-ק5[imryeU%)>T1S. ĕe١UD$ѐ:HֺL=_A09=E^J=TBVQU7"k'GlpG}欢hf:tlRHE Sl?/:35U6X[ ,vG6 K$g9Y!7ՙPBgTEcuw<Ƃ>~E9eHiW (esOqi^*nhӒkWYifQftsMNmUJ y. <O`lR2V ѝH*ۓV˪޴j{}:+PBrW`+Ӕ\Y[od#EW\Ѕ\V^tuO[R(Fi(Yu-;r޹ɯWh9Yi>!77y/0j :O_?ldx6Z*N86&j: |zk# FY3jۚeB3Զf dn9]hlkB.\ZFqm*57r}yB;FSd:vcSyArsbid FdΓpZ@dБF:Ћ\09L`ұ ucԺe_< v751 Lϐf^B!=(t"Ry2@CGU(htEZlC喞ȖCv(׆t!-0ү/FgCa!7 5s`P%r孍rz"jDL֐n{гn%!嘞H|5d9wNԆtˡ+IOlq`t뉘 ct퉘'Yi!ݓ(D\n9drcd+0URJVWNI0+Ȋ&@Ύk WÕqSɁd0+A>2_.WNqӕ#Y; 4+ٱODttY/ܹIWNMr7՘.&]9ĺm\THĕ3"YC4\9#R4Wx ƦL-|"M`)z"644>#o*!%PYG Jv$kHw¦@ʾoƦ́UC`kSܶMӞyhM@Cк]y"[ V}[ʭdDR @޾5hʕT2"-CZbL+Wm!=IWnM >FNr[o*PSf#OdҕiFto*f\MOk+iMs>94-ӚC >-ӚV Jıo$q6F}j𶪊NXe̴`D 7{"9Y`&бo|znPyrM i#J}螈2ciD≨V#6םHSaL&Z؉<9M7HqSvE>^MC8)hŸg?d )d 4Tn cP 2׻(lUD ""y("   A"A"A"A"A"A"A"A"A"A"A"A"3='َ1 ]ʯ료T@f&N'+;p kWUwV]|U@QEN @v inbA =HnEH;$" 1UծL&BIc)ɔ1vtTXaD(6Nia zj.,6,NA]JPMH3O?q-s ɮ4M&Z* ڥ np^I\I6W5y4MszWGݨ@6[2Y7Y+$`* "l)3U ;`bcKHLў,#$O#ktM%ʥ8- zﴚ aGBFY I/,'e}zyCFWU:ڃ&o~)1X5ەҚVkVٮ5s\JRǬ{"==Y 2+笟ڕ-JK }vO`Ю 8=oZئ#Ѻoi_ |GLڕCN CvsZh'+QV02/v'0_3ھr=vecZ/ٕ} .@^a'U,_+ǜ@H+o:csb(|ۮL/Fj9˿om_kؕxMֳ;kWnt~k/o?V}€W~O_Сvd;xY4ٕם0lWN^ܰ"ZkJYnߋ:ѹlWo7cߕ>usr$ ygKޚz۝/ֶ^jK oWFIء^]냽k*mXōo9v[v:{o1 gV7 [{Gj+/`~k^]aj$@|7jteK}>UoW].j]~1OBֱ{;x}Yۻv(';'4Wuݾ$+W?h^p:?o:tb]?R^xx@??^VXBIl TO\jq͸ejkO"/ݪkW9U?m޳TV`~<ڔj"!wԲʲ]*]M0ӷHoQi==iR!8\0A|t[.;z9U>Ywb*u˽r^i/}򗏙e/(oj}?RG #K ꙏvFIyаtO>"fy ;촰c.%RtZCb41! $ F!itr!A.Ѝ]Et 2NˎWLy-+JL[Q [g0~{Z_Uh}ʙuM3pʛ99=]~ֳc``8 Xmri,׋⒵.\"ևV{>Ͳ%{(dkMG=ˑuޑM{?M̪*|Ovrl+ aԻFa19 ߠ9UVv0R.9@$ (2Nd  3r\oh;{~`b#&Jt~ U3vrQr~z `qWK@QK׫ݴu9N 벆ʾtT&-PfՆל_N7ؓ{[@r` &n[ :h/+˯=T lmAQ[Ǽ{rl_uX{z_+T1egIOhM\oWfY6nnWN Y%aȑ%JРi`xKchyX_q*hp{Jr er@&~EO'{wc !KB6-@.@[-%]smwP^^#KXrmb~NLDpy]#U-\J%Ǚ:\0ᚆa`H80p]uJJl|X J\<.7|G\777u&V*?c00a [-+Xe햊kwxp!*^+ԧp)){sγ8ba=ep- W0{SC@pXV@Ffߊ%T{Ueݿձo¹6| >Tooa9I!;Ձ@Z JWL-m<Ta^@4}~q,/+1NJ `SݯEnF1q 9 :a\D2)eK㷵wvgh?`X>a8ۦ< c?)Buq 5%G,BљW>p ^WpFDߎv0xGߨ<ݾ_=<]WUj 3;Őh.E4MOm50f`&Z[[_ЙKnt:lؤL˟Q1,o]{;1&tؐ+GT9t~٤&@ٚ_ޙaͲDܥlޓv#s+5߫efzoi׍>78&ߩ::~HlQ Rc' 1m2Ii\Z7'2x_M[Nh .E?%1}]=4s8?n}3:y G˙b\Tgh/~FQ9@9PSWOkFAcs7n1F/Rމ}[-ZXNmQ,F^\3cW,/0isn,\[3QM;ڳwc]:ǧ:u]eZ̪Z$9<34{99 Z"5_iacXJlu'fhlĻVtOVC/Sj)Vnce_<7|˷?LM>,G_#Y`IS{\,G&ȟU:r rZUwF&.zz@K4O#Em;x:W6=_HJ-leIzA1v$V,E29[DWB( 0ꀩn(@bM\HOX4͆Zj WY^tnM \]6e%|k ߯XNYy~ /k)RXܳr]`8WlSd@UEgN6:+ֆE#Q]zG^skԻt/~39#F㧌mMdg-?J[rBl l5ؐi}vAh"BEi\Z]hB}e=b!٤n۳StEu$rɒdB#P;"Ŏeۦ|m(Q.oHriGʺkVٮ5slFR v)<ƎD,=ٹn"KzN k{s/dS V@#PH2I;#жmۑdB#P;"@oGhSI;ɷk)vwJɢ%Pɒ@bG(vDbGHq"ᏁEەf(=ꕐjTf58R^_{^otokFu,WUϣ m` ;A#0'(_hmzVwzyo%c6W2x@g|eQXI֚RJkZ[}cY7#u(,WU͹zY[M:m48y}?[inZ+vƚ,qZLZ Yۚe=5>=Ywc6ٲ{dwaK9[vי wSYMddy_li tݟ)es=*ceܾKp| " V*; V]oC;\!?$id"X]&tԅ:ɉ YhSZLҪ֮pZkjjY$+UVdq 崰JZC9:^0:Y"Ŏ@#P;"Ŏ@#PYBZu4wIENDB`aroma.light/inst/rsp/figures/CalibrateMultiscan-GreenChannel-before.png0000644000175000017500000001047614136047216026115 0ustar nileshnileshPNG  IHDR@@NUPLTEHtHHHtHHHHtHHHHHtHHHtHttHtttHHtHttHttHHHHtߜ߿ttHttߜHߜttߜw`IDATx흉b۸륷2vՆr%A(pO"ADJ_R%Y$U{bD1@ Q (H$bD1@ Q (H$bD1@ Q (H$bD1@ Q (H$bD1@ Q (H$bD%|\~߂/ӠmL}L;Wtvw6b8ClD{qM$2 /s#j$+8K 3{aP*o jQY0 0nQK(ddS āt Q (H$bD1@ Q (H$bD1@ Q (H$bD1@ Q (H$[_bkv*M\KP{?nMo[#@٭i/ێGbo3$_g[5eߍ~ 4NXr lØi8PXa[nqpn,7kHgo6#5a0{ /|;> }s1!V,͸l'ҙ>Ώ%X4@m">zwU%ٟmc[#,`uy]/oc]tNrmd+,xeЌOUBF_3~i5OR&@4]4DžتO+f% 81vf\ @O?aqEoҎrTb606r2q -G< OxaA bH]@f@\'~ hۯ 9ԝ8A J'] P;$Pqj;l B%2* C>so4Xw 6A 72(4#mI}kc!V*NP7~ݶs&M; i;J-tul tdmhe+OW%@1. kyh}AԺ7SC {gP [ <ѳ<8  j}u]wfX)@Y:4 svmc)bV D5)7b˯ҥ/3_]s*Wk(j[d E]y2џhn젥6ؾMO(/rdiXQzFOa @IpҠ |]vbd"VݫmYj_0۟%~xDu5W*aKJ E<  &D ?05uӂؐt)pGx 8m0wp=hÇգw0(Rײǵj+=-O,\U ϝ"3w mn\7fP!Om}~nN8t}|XSl+AQA8#MغxaG8Irf]Ԗt!h+ 6G<k+l6n Ru]_j Z1<o^e/ʥlȻ6.H9/Ni1iN|NN8څ>T קKaJIJ'UScՠ+kZgs 5n'Sf^4610Xxܕ$͍HI.&qU̕WRw_ 'c"߽uq 1ξ_UuUF|[h>4U?~]&;E,y`,B -PJ{S@MmtR? 6քmv3~ ͢sϔ%bп*é)bgy]STx>P C c-L@: {L%@xWFURGcǧI4`a}\ n=Ihk8qڢWXNgT0#® UMESBv{XGvѹ$̇ף14,bzE/u5 /bHU頦k>JU^3U=HjJbQZj3c[>FQջA@ 7>4Ѐw=u\)=b& 0qt0ÜH)[is5w8\eF5w!In8Ǭdt7=@:fyY&#PQۙ440<+HiRtt͸_c-C4Jgt|P sg=$5=m:Rœ8ǻ+!hAJ׷iuJhA';sm. |;uWI Q̮2چ Fҽ@:J4!ΫbPuա@z-uQ T@);=(҅=oU@KȡHW[<6@3j|.vʃtx/>3@gX d4 PO"1@(3OS@[S!u_ '[bCO׋Of-Y6 pzaehuCz|r7 SuҮ 0%]\;+ |TN\r'&TIVVL*I%df*qL*i]3=MtWȩтTNcrZM*AR pDW}#J 2yLdbNJFEL$mI) &* &*m1q&&VR_L${=qAD,G;"Ŏ@#P;"Ŏ@#P;"Ŏ@#P;"Ŏ@#P;"Ŏ@#P;"Ŏ@#P;"Ŏ@#P;"Ŏ@#P;"Ŏ`ύ1ssd6,L1#(vDbG(vDbG(vDwQ?,*᱋jd;"Ŏ@#P;"Ŏ@#P;"Ŏ0iNM8x,esV_Syj\q)Y%q\\.8dGJɒ=)ɤ1v4RXaD9۹l*+.E#KWYzrN& SynJPM:H3HR8qJk){$q$R[9MXl䜗R*I: )TƇPJJ4,|ݭhsހԺe22يfMd'Ң]ȹv,[eIDm[BdIs,&s<ֹFWIq-.^'ԭV ~=s Y2PXbOF.SeGέdjXf[%S)UB^);=E]M&-W0;K3 pUՔyxh0;#u*sMXTj]~vinde+FݩpM^u*&. {S<خ*)ƒri]Z]>Z.w9]%#韻u c`׾бݜx өVth}=SD 71TS$Tu8_Ep(;-zxj{뮩ҮIo+N;hs62Hmw׍crGhc߽xithiwc|KW^m;1gS?|MEDĕ+ϟA/w<,gh܋MǎgS^M->;?QrSAo2x*Jߟ?~H' Jx?Wɪ~3)]QG7RV/w}|^96 Zib(`l7*8SAs`#Z{/4 f˳d=;H#of}[Jm|S)ـL_Vuڝ:=66W~'תۿH9vDݲ y,uXV jOꓵURf$_Lpȏ0HT0X0uMRzzRR?NM`GL:uC?[7X̧LݚGT+{njp аM[ɸ.h"O.n6m3U-yCS3uE<]_dG-]*5e{Yk0t;!dGaX 6@t`LF la1c4REMzU$n2Ii:4^ i:FGzORzDF[z:o4u<'UmLM>nY|6m99:o߁cJwVЛ.phX?bRV\\3|=7v_` HVgY@X:* nW@`@& n3`.I@jz =]23^>t;„$_oҚzaA 0pLyUܑo?tգMtbK(=> WS.W{L-jSrב}t@2%0#8LmIt!fFO3@$ H`&d0F 0p3|eKހ$%IɁ̓=EIo']i3'>U8ҚF'Hj޴RiR@O_]CrJkqέw>p㙵#]/I]:5v@.] ,a a % AF #`hxI2"hD A3t#`DЌ@*sLP*`f`8 ,ӈT<X`:|iz}5ē|]F=sȺ726oᎭrYܐ{^0>IH!WyrJSZ."u轜Q7tfi gtXK^(78=[^F$`aH`FI0 A ܀d$t~, Ft~#VF% IȒ00$"Ab`0^ %eH!r^:qǚ\KuCVGSʐܽ2֨k`g>L2\ラ卿{9^Sh6Rׯ4Mk9f75% Ct08|~ 1q@p > >hhڙGҊLo6K {I8kLx׻Z>_t`O+ƛrl@W^|j[]w6n˓^/3otmhHHdkIt*J{fzN{|w9z@' c>f@08m ].@83LA r8/dVW;phZ'CL)۲nacByX!J>_#9O=|>hQ(gT_LKUSDH -e]?Hɭy C7Cc%t3r1 Wa p? ^f0 HL25ߝᡶޠmPb)ru{Fj F/D*E.[ld|ߓP9/hn+|h;||9Vk lKH mmv9} vbc|zml9 "d  .!U2n`3}Rz6z$$}Լي_/mop&]_Pdmd;s~ЭfվU);攎w1WWT,;5LϜ=nѠ)ՠKlHo?0ֱOzg-)7rvœo7ȓR~__~Ey:U}2rY8uw]'[y My %뭛; V}?=*ࢧo8sۊ\a[#~Vڮ|y5nfAޤdqfIMNJ'Zꢘo7TLxqab2i()iά\L#%g^>ʾLi sA?Ge7z-MSIEs#%%G<օo5TxbɎSsC1A3'oGj4j8~)oUhڻ3u,h畟 >kr6k;өiNl.]o~;2U~ƂhGk~rGxr4sӍ:hmv}g"ȟV?=ݥ6yYbTo{x85%cN#A+W'wTpB*oѷjӽբwdNJkM>ɝš#q!oE*9͇ZQSq.X-z@Y 3cLfIDo7?(vvFٺ t)tД0i5ѤioÇs?UtfyVwOX&w/PN;|${01d˓b~b{*ELKpCj/ܲ빐iFR 910=[cM uJdsYT'{I=CsaXmSPmG/z% E9Lطdc {1y2?-X2Ҝ“CX 4a ?_7#0)\ϕl ɒ$N‡N2UcGT(vDbG(vDbG(vD9?L`f[z>V0Ѵd>"!Sb;#SLzEMOĥu9fYjdz,# Nڎ@v$vtlGbG)c]gNUX"V31vtBsx\\fMk5ꚵfXE.) WqraQ8[J9oE;Wծ#Hs*O$[CXeيf W raQ]P{l+-eG7:nYUye+-U\z2ڌoOqU4_yuhH\`'cuCX[kalNũJ \ G=aKkqGňawyφSՆ6T/JdYvsgx:p9-vvSavf[F+ U4p%P;"Ŏ@#P;"ŎW0|/fIENDB`aroma.light/inst/rsp/figures/NormalizeAffine-after.png0000644000175000017500000003475014136047216022731 0ustar nileshnileshPNG  IHDR@@B2 IDATx{|U9K4miK]"%J[RiB6%RnZ0i}Aԍ/T+E[Z5(^B#7h bYh)zm.cvӤٴM۴磏Ξ3̜QޤB'$BxX a`!&pA:v3Uɰܖ¾yW@~[^K`10O;Ǝ|#bcވ̑Dlc̛c1X1-LpIN}c~tj_ϲ,q0cob q::c!΅s BH7pW_H8bwهG>bWȝ.^ٷhh0ĚEez±ƽWe)U#޽7Rao6>ueEJ]\>O%*p5ov]~T{,O!o{!>!NS_8BPۿ H|B"K7e٥rĤeVxͬm3fec5fc6 {1O=~D>ٍo+ºI ޘha/e*qoPaguOf*pc +NaeCY䱰=]jRYOo~"[^t rQJz\>/cW] _?>}.G4X3>ˏy4yM4](5k c+<|0&p4Luw9 ~;mD8#w-{{}$|]290g{[6e0wP!n!}voy35uiܺ7A̛?(1 r. k2vsNɼ ?bc" 4vCƘ7"R_ṕ9?/CCy"rO6lecGFlc[ߛJ؎$bc6F/-p 2y{@xI35cVϛyM1Mfk2ƾm ca̔[ T  SaZ)(n'‰{alf(~<8o~'f6ElcE\.]x~x٢Gw"_nqv]ca1ڜT#☽vqQ}c9לV0F\bLm 0&c钓0&1ӎ둦;P b]6O 4Ƭ9~ 8s*଩̆S)ތkmcȒTncNxOM cۑC]; }0<}Yp]~fS)|΃Pe.|>^%9|. |V$[|> R3nމB|? ;d6Ƽ mo< tU,̢uJc5~O5t]c' |c6uY8<Na~hʙc7Zͨ>?I`@QS@AjM=(z >@ԦT>j3??&}Ŷ}ߛ뿼ehk*j=ͽ|ʲ˂sf-}TOeէƵ7Pc߹ZF=~azyH[U{|/g'c p]n#ZZFV5I2yln:r_/Sh@d :GøQ+$Px 6+I6F=xN8ꡧۂ~$ڌCh_+ cY%q,*{-:iwe?™ >ewlZՊȹ5O#VUzGߺ%feً5< @>?[SpczQ1@<ҏUD_+9˚/\۟P+uh z5 _ROXa:ZET,Yp@Kh;`aE— <4$6,T+(t,Hb@rOsRV>'Ud_6pI6@>tz@Mg7܁qWv,P܆/_V mBQ`>ZazH&Jں{Қ3˂ԣfރb7|=~@u?MҚg|c/:3(ڊKձ U< 0Xv3YߘL+j`?8 miO<^R(P5r[%Z$78B'Q‡%w`YXGF8ˏNIbl|N*ZcOh4`Pz?it򅖷!9#θCO?:$QPsociLQ XX[PSЛ1'=쩖x90Vrz^Y[n/f]O{U`˲k~ e0o0s.|ci I&ғ?5Ӏx*ڋ9 7qeFL韽v]n#[vI Τv\F|3cRwva8XJCՊډ6&ʬʀ 9~u]#RpvƇ[Q}J\w^g&?ކ\kWlz}ʫ}ygל05[[ p対S>pvzY5){7~-vΎ4x pfYkk7;R]jZz!6ʟL5z,Ja ڏJ`Ac) itOS?=lЭˍ60R*&r0ގJBzZ Iua>_ڰRn$Ѡ@6* jZ8X۱T+rPWnR1n 6.t@ި5-?~mo~`. ,w^CEN97|byۃ/'\?_:@N8q_5tlN>mVuãEO,<0) Ujy|2&oOz '?1ymVAOI|<6pM{tJA݊Rv_cG[2vٻ{QhnG_&FC(Ao< (X:Rz$JA}|S5‚߾&j4|-q(hEu?=mewf-[@p_yQ]~/|ԫ|'?U -yn./|y[2竷@|׭μ/6Cx,ؼl3av?,KM^W}lܜiio>4蓦v,tQ:|Vh|9֨6h,,(rG}rP,ʰπJڅSn2#Q>LY CuvЩa*5eB;X[!5eIWz$ }=h9Gzٻ^0݁Œ@T.> 7~=ϯCmCBSoK/Fa9p6_p5[_7+YrAuJE+|Sr=94pvO[?TsT~nn/_&\^ @r);ȩ7 !F~߆AbNθܜ4@jF߻-~0ib|m08yX#1TD䂅VXuffjD*Lul::nrda4L1B㌇\T.dAvPcPqF4 9s zdG(XL@lx `$Ȇ+ti<ۏӮ;퐏l#o>_fԊ?f.oj*/9{֛kuߧ3Qai[?z3?z\=V?:`?je-<8- VZƣeڊ> T۾3Ff=Ywٸ~IߠѠh.a $ڤjTRC;Fuje%u̬|vTB[&/U,L;`iF)hG:2գҍt. ,<Ƹ\TvNv X3&Ȃ~cah (wGMz */Wѐ ;GDT曶@w˂w7 ..X?I񯶭p;N;g{yvaKh;;7vb5Vǂu˽Mޯ`i[W]vuP{'8vXQ:Jjc> ޲ҝ^$q)Y)(;,d}svIi|~T *ҩ?pՊFgrHՑjBQ03CoC9B@I.a%R\* e0 Y0 o;V$PYƣ47 -5EUKxl[oڊ;z7SWL[[aҒ)[wyKۨ"V3&릝tۄ1wBplai@[z yi5\ٳO>L˽Vđ5-˜1۷.6=ud7ˍJH[jh!qR'x89IKO`m@Tk Y~!GpI :.}H,MBSX$iA-CGI rhiՐd||<@6BeaC^wh&.fpJ%S-ps6]mrF/_~<{0~]kp]yw9>qN.Mr7?pʫ nmC+;Z ꜎jU8U⾞50? &Pӗ'ik+8LjQchrܡ`Jz:ҩ;|q&WۙʞRIhlwXpwI4c,:>">@aY'uj}M.ARh9ВM+(E± hWJ K1B1Rٳ Z4dD ?w߯nm'?I[sgxy'P|X˶X56_|#.80d}d\[kݳ:]@֒Or_m0&vٴ=;xE౳*Nco{d3,1-=G&>mn JlMoۮR>Pg=-B):@€QHBB[h v_06p(Fk4 E9_P8nCFY Qhv-VE b?J5aM# 'aqoxl}b IkŮ#W.~kفMgC 'yw;|;wvcC Ǿt\q淺-̶3'S~L͇cӫ pn1prrz!Rc'd3ڑ%۟06V*oy:u1C{Xk0h"Jne*5&H=Er5I#hS$}Zç>MMH(4 M]c59 4Y 8 =lOhZ1IF`|8 X%3nݘDi0$43MV34q3z͘sٖ,cٗ~;u {MϾ&Ǯfo0rŝ]e]+5ɡV7V5==C3V_=r#%>? =?9vxΝ^6$C#Rj>#CBciuC\IEKPFKnc]\qIDATm Y(4t-j4JА:;V 8B')Plxw&#n _j^ZYآ>vh3t(i5/Yak l|kݥ@S'߇ɱ;N-ObN(fWJ?=I;xP ߁F|BzxǕf-O`˃qoӧX[71vs(ǂs򶁫&N_6(2daR?$ (pYԙ]$5Ir+C"[c&Ka8$6 8Zd)8:<6 #j G0-ٴu5ߏѳמCĊ_6. vF@]t?.Qx9wA7>F Eαs;I_\ '\w/ <>>Zj>eϞcfwgge~N8Ld +F"1]_U31ǘ#LwNxRI|.T ܡКloHX ۡlS9Z$ujt$ %S &IQ8ȱqG5 z"ȁVdk: ;')EPLҐuó߬~lip[jINݫoK=4~ WF>CNuls=^3{&Vr+jo]B̤[asN޾J:=V766}zT!%l}%UC Iի C )ICv)ڠEӦi3l5no;0$v(69khSM ;I6+v6~[]`&ּywIW ?Ӯ1X9pw7.CpƔ֛iEǜu-+F>ߝ\\4a.58[#uj25yu;VŖgazax5íQ&)('GN~ER Bkt">6 Tj6{-ip0#^{^{_.#uͨ/=I䟕3+Y{GF鷋oM7:Ót#z; V&|vdAsh7so{sr*}khƴP~HPd^̓s7 $4~ȲH*,C"r#ᐣSM\C(GN3r[-,J[>Z?iDbs"u^,ѡI8J )~P '+Ak.m PXj*U5'S<=O!GVm$?P{G_؆g ~}{{7ta7kz쬑π!g]lr-wJtf~󻩳?X$I, w|ŇR5#p\VV?=͝"i*[a["ϤHԙ0i?xav՛pڊEk/_N On?Ju7[(E^83~E17Ek 3Ż_JkfOW7WS9뮈G6˜97V+UϱA^t(d+}À[ce-o4]52U z_? kW$-P$ _Ъi5$ Vhs VE&1vH~I/tК$ n[;ͮZ#/,sʹ޾P$&]~E1k>oWGl|ꢛqZVMxjkdKCԻ³m{Vxш薁zc[].ZL8֭-#ŋbiYYv,nָ>y$? j*΄Wg883&Ԭth0”}Ω4 YfAͫ/ _ߴ(8)f"u^^kT L;`돸2o3@ WU$ Tn@|1(x6ίu.n ^pWyEo^x_ay%|1p$ ~}^lw&OjZ"8 NS4 3 8>9҂9Y"r# 3PEp[bO%Xؑ[p~"yۘPߚyj߃aYcp+l=ّ{ִ#?A>7yAZ C7Hx|BA>KVkcekJfq+61jg.[0k6rYM45s^GR -x[w]ĭ KtC{I dfhS&ƘYݻD8 &fp̘ 8cG> wc:f™(i8 P p ߎ.cV.]vP `;]~۽UH?={{p 1Ǝ|&24T(n7‘7gP5crGIߛp1pƧo]+ }n΍l4N$Gc1y'MS1~*tPO~84lGBݫnЇY]գ OI9˚vkpgtkBؑoA<3XH =QpgLs_`XS;kJOvH'v:(űn o,>>ŞMhf߫EVՇvkjdaU{}H<:OSjf+{Km3hKlBj>Խ{ҞڑilZNJ!ۼЃ*PPaʫ{u1kga3`u *̫ohEw՛ MoZT%*zyeՓK cAU}[ /=.V NCm=.>׎GוE/K p0Cqն9Ҿ#|בuuV<>NQA4nWjRmLjJij ڗ?5&fLC@v8}C&9>+'J ToWNʛli@ipr=:Z5X%?HvӰ uE+mc2Yc;u[f$Kc2{wؑp;<窇r v'9kԑ? q쟄^3s_z[.mcŸ p!A C,K6vp|#ַ-d]7&cL3?۟2XbC]1Ԍթ{uc ģeCtO11Ok.M?!qo[XjL1@FU\4>_.R]ɽm!RW)uA<6{\K8 E/adjia]P啙CWO[5.644ϱo/{3?3mGE>W7GTʵ·UD T>j*ѓK Vp1P3§*3VUP\G>T1sAx;aV\]|ګ@zžH -{10 ~>X2.SW73x`Zh,(޽xcCLouэ D{{2/kcn*ΰ ͳlh¿P^91KI]! pry{2*Zƣ PꇍG>TWʣ>>Py1suq4{4,1\1*[ ͳm(MuI@;:uO%|$f~'>L*-l GhUzG&vb BOOhRZ8%ÚxXz<\^ (-kA|Pa`KJ"˼3|HB5kCY7WԀ.1Ƭ tYC%śҰ_Pvov>"PJRrOAQ}]CW#.PPTw_P#${/ƁxCm? ׮Pѻ7҄CrUYU".~+זUൢw%odVJ!sjU8]ŊG˂U*=;dqێ7ֳ_].E>U=!Ipx`5-&TQT.UGcub/.EC;X8u~ @^f_{+ģWu nG$)];U6v_KlV% {ց5]_D-ы5dt}qp#BI1Lo4$(P[xTbq \\KEwvBϖEѣNUC}~tE{w"m>G{{J)Ӻ+&;014ɎLv `chCd&;014ɎLv `chCd&;014ɎLv `chCd&;014ɎLv `chCd&;014@?B&2;0'Tvm)Q#24ɎLv `chCd&;014Ɏ>9a3; $,Cd&;014ɎLv `chCdЀNJ?UFә1N^]C,hJfd0F'!ОߝIpcK1!);tQꇹy24`m;\1/Q06 )rE3m̘N~l hc<Š*7PPŴ?8TU@)-w9RZPWR0FغU"Uu'a1pb-, eW8)5(e֕1p@aBQY@ȂCѲTs*Ʀu!/Wm< 4yU.´%$Y"JjvlRL/Cc*1fǧrڸ0+ViSVU0&.$1bf9Cj(3c̥ESVԁφ p$ eʨ^WlULa3c+jHԷtVۗ;m^ʔ4 g 1,FG#_^(Xn(V)ña\C COGX_8C/\"hԌ.y`uVb1OUOԌ"zB,\⌋HRI5JDiYlIUzs*˳V鷗Kd V xδw@HlS7͕Gh9%t瑴yEryWgsLiTbי=v93z[gx4Z.v%NJ)A$bӋ4B:2}?==NGҾ gʷ V9n ɛ9Hڷ~/".d<_d3'yL 5%FB,km/wM]ݽ6u]RBPCOU2y/SS5RZW!D*į]X嵻Te8[!.tB,"Z 񏗌0  ߶pؔûWljĚYgX*\_]ҷ졗WWɿtyeSM+vQr? ZErZ*E&`6ENk @xz]!d{.tYXB2 5Vnjlܴ x~ʭ+ {qk'fLM}2QC6:}-r?c3VW6J%Rگ}K;tj9k>t^\w=9)okyw7FNUf[cl9ULtt6AOw,˜,ĜhhmTKs vH~[O+O ;lTz>= ]>ZpHsڂy8gΚ{C;6 =Y$Jd۔۵"V֜o*@^7ȍX=CA0HGo)yCݛbaE/Bq@3QڊNObɦmTwǧGJ8q{4Mp/8N9m :EU.{OZR< 93 sgB>JV߁}-G]C?]{c~-%-] mM'>}4$mqhܕ|Kه9?HwELhlj|g#RA:<_V$S#wg.b;W kg6?r]'yw?{_ 7.~'@~nOҹf7tFRdNZDCwU] NUs5&X Fg/@ρn@D}'wl  n5y`躓'/-|KOl칆]IKgφKh6~ylfKiMssmWE@:(͐oH'2/13rF$e*4 .&k7]<.@=yo A @u[97p@:C>{v9оHAy:| .5@A z Цo [-g _-TDA@uK}>|흱tOikW\s4:ߖ~[PJ^ i^p9n7!x}LmN%tTtU:r7FmDPO6.wx@~A/zu@3 һW$~)ADIΠԉxpFՃ`nm&'@ٌ< |{7^ Ab ikrn6_ˣj1r1sA#l[+3Mj^vN2#2~вUe4)OZv\[~R\\XUH1T@G Cdѽ(0pr,4GrYЀ $>x\{>}5e<b#7jDЈ@38f 4.MA Hg$HĀ$^UMdT2^V,59 =$P'('߿;N8s|ZCm}t> \3.H$':Xfy\W=oW{k׉{M)px{]yFv?8vgLgHX=Ju~t.sYvR/P|,kEr96/M7Ϧz{: $IK~+]_tz".5A#=` )8 5$ $&@C%h< : @M@HJumG>=L]Є$/-@@{)՗Rsὣ=71C7+ґ4H/5ӬPz\}>byB)idt UYlUE QOIzǓW:KyN8I hKBCt0ݱ@Ȱ=:t@ TFCx PѝjBxc Ōj@ 4 3Е $;4ƃ##`FGIpW!hRAR>0HtxD ez-vHIORLHF1eض6 ے?@6ᩜS|s|wmwt9Ҏ%,QBOש奌.ʱ-+ U 5ƽ?94iy]G^D,( :pqB} zNAρ :9tz NBAG!`p8t<I<@IuRt I&確e/mչ[Bai6nh^#I^#]QrLӁn>wLNJZxw'&Br[e %Q^81clB<8B< <./O ~A/U$L{{ q@ o=c@; PC'E' &n@\n @}@S9x(|@;NPpx6́8sw򲠉+qY^cN7h!W1K}k#APrfPcL mJ46r_>mSB|YyjAhcFS{4KtY"x|R68&t)3뭨hln#ϐgu4CC7t (A p]@pFEnt]9G <Z& @ HΝ{+Y}~(T%|~k=YLj`>pSJ Gn%tM]^WB Ys1kN.˹=m~${҄(*jiW;d^;i'?Kg!1"uW@MHBuҕ gX )OT@r^` TM`I? cr2C jLKתG}&XH8+Imq6u6Ԯß`I+qnxbS92' X~ za Fu*:O?}ZWL"]^Y VGjԔޑgC&r_Mx!Oo$pS:t*'RuK!.)R8>],_->Mʼ)Gߕ,Cl0/S͍kcCK1iņ i3lu塣~BpoQuF^C,o YF7жx!Oa)f:Zz,fk/'݊dQ8v).|yu|\*W`oTz'BX+YNQgZ#;G%Mrߢ*Y[oԥaK3r^^ynۅQ\LDedr_)A4wjDK~.ww`WA{Z(v,-g3kd ڏD%K_)Sa#^OS+ƒ0carw'-c?Ddt M녨g:Ly @yK8W^_/\WTrٍU2aC_g^y攪A,@y_\~p$tdDv0` EyG|>0"-wc-F13;>vJtq-o;.Ť`/6,=,NնJ[Xz׍ruQ# mUWUސ,ot@|SVpR*hU m)M+V46k]PZמ̘^Dcլ'˘p@+m!wIϸ`V.b.(Ic`oVx/136m_> c7+rYyG֥Xm1=Yl9u9&&; y+%1om; Y+q7Q;v:3qP)?6@6D6k}sw Td=9C`ı9CX Z$jn pԭ]׺6n7l)5|G.ˤnhicy^0ٍ#ғXԸoXLƗ盎=+`]qESU Dz@JQI.DŽP& GN܌Qv6Kc=mƃ9-o]$;Nmgf9CQ|E; wɶ; 2&P( vd2*e86Т蔍1ma=Y en sOrE ة@TBJV;3ӌQPֶc6KJ\);3&chk1Fk1Lv `chC&z N8vYQIY014`Y4v `chCd&;L!)VIÏ?Frb*EnZ0Hc~SGvNJi Vk!<ő]C)t8K䢉B2UGN&!=zaNEa ^L|v':+H)&!=aa6{T8C;ZmP-?~G!L YZfW+<#LTnWت˞]410m”VfBV,o3ʳJ !TL|L]By{zsvTk7v(٪+)ȋdhHea/Om\W1毨<B&R@-ɪU\WVՒUGF-F"1lFbx֔ԄkJz/$ъQj2qEvc|[mu;lB ++YcRJy#-yO(6 YjP-5Ɏ24ɎLv `chCd&;  wIENDB`aroma.light/inst/rsp/index.html.rsp0000644000175000017500000001102314136047216017173 0ustar nileshnilesh <% pkg <- "aroma.light"; pd <- packageDescription(pkg); %> <% htmlHelp <- function(topic=NULL, package=pkg) { path <- system.file(package=package); path <- system.file(package=pkg); path <- basename(dirname(path)); path <- file.path("", path, pkg, "html"); if (is.null(topic)) topic <- "00Index"; filename <- paste(topic, "html", sep="."); file.path(path, filename); } %> User's guide to <%=pkg%> <%@include file="src/simpleHeader.html.rsp"%>

User's guide to <%=pkg%>

Author: Henrik Bengtsson
Last updated: 2006-07-20
Comments: Feedback is appreciated.

Abstract

The <%=pkg%> package provides methods for basic microarray analysis, especially methods to pre-process (calibrate and normalize) feature intensities. Initially the methods was for two-color data, but several apply also to single- and multi-channel data. The majority of the methods operate on basic data types such as matrices and lists of vectors, making them easy to use utilize by other packages, but also as is.

Table of Contents

  1. Introduction
  2. Multiscan calibration (scanner calibration)
  3. Affine normalization
  4. Additional documentation
  5. References

Introduction

With microarray measurement we try to test a few different biological hypothesis. For instance, in gene-expression analysis we wish to test if a gene is differentially expressed (compared to a reference). In genotyping analysis, we wish to classify the genotypes along the chromsomes to be either AA, AB, or BB. Several other questions may be asked. In order for the microarray analysis to be successful, we need to be able to estimate the test variables with both high accuracy (low bias) and high precision (small spread). Typically, this means that we need to get good estimates of the true biological signal.

<%@include file="preprocessing.html.rsp"%> <%@include file="bgcorrection.html.rsp"%>

A simple model

One of the simplest models for transformation of signals is the affine model. Formally, an affine transformation function rescales the signal and then adds an offset (background). We might assume that both the scale factor and the added offset is constant for each channel (and array), that is:

yc,i = f(xc,i) + ec,i = bc*xc,i + ac + ec,i.
Compare this with the above model for additive background. The main difference is that here we assume ac,i = ac for all features i=1,2,...,I. Several of the pre-processing methods implemented in the <%=pkg%> assume (directly or indirectly) that the relationship between the true and observed signals can be approximated by this model.

The reason for not calling it a linear model is that formally, in mathematics, do linear transforms not include an additive term. By using the term affine we wish to make this distinction explicit.

In <%=pkg%>

To load the <%=pkg%> package, call:

library(<%=pkg%>)
<%@include file="MultiscanCalibration/MultiscanCalibration.html.rsp"%> <%@include file="AffineNormalization/AffineNormalization.html.rsp"%>

Additional documentation

Package's help index

<%@include file="references.html.rsp"%> <%@include file="src/simpleFooter.html.rsp"%> aroma.light/inst/data-ex/0000755000175000017500000000000014136047216015115 5ustar nileshnilesharoma.light/inst/data-ex/PMT-RGData.dat0000644000175000017500000103622614136047216017361 0ustar nileshnilesh"slide" "spot" "R" "G" 1 1 156 1488 1 2 35 90 1 3 21 44 1 4 75 419 1 5 20 36 1 6 20 54 1 7 20 45 1 8 20 33 1 9 1010 8381 1 10 20 44 1 11 345 874 1 12 20 61 1 13 20 35 1 14 134 544 1 15 20 49 1 16 20 58 1 17 22 50 1 18 33 75 1 19 20 23 1 20 20 24 1 21 64 516 1 22 21 38 1 23 20 31 1 24 44 252 1 25 20 45 1 26 20 36 1 27 263 835 1 28 20 29 1 29 20 31 1 30 20 31 1 31 20 39 1 32 20 36 1 33 132 888 1 34 20 40 1 35 19 24 1 36 20 36 1 37 20 24 1 38 20 31 1 39 20 29 1 40 20 28 1 41 22 44 1 42 31 62 1 43 24 96 1 44 22 49 1 45 21 68 1 46 24 102 1 47 20 23 1 48 20 44 1 49 20 30 1 50 20 42 1 51 20 23 1 52 21 36 1 53 26 56 1 54 21 37 1 55 27 65 1 56 21 37 1 57 20 34 1 58 21 36 1 59 20 26 1 60 49 158 1 61 21 31 1 62 27 59 1 63 842 5292 1 64 20 23 1 65 599 4152 1 66 20 24 1 67 20 25 1 68 20 22 1 69 27 99 1 70 37 110 1 71 20 24 1 72 20 25 1 73 29 76 1 74 20 25 1 75 20 22 1 76 30 86 1 77 26 54 1 78 20 39 1 79 25 70 1 80 20 33 1 81 20 27 1 82 20 30 1 83 20 23 1 84 20 24 1 85 21 48 1 86 20 28 1 87 20 24 1 88 27 92 1 89 20 25 1 90 20 30 1 91 19 26 1 92 22 77 1 93 20 42 1 94 20 23 1 95 20 24 1 96 20 26 1 97 20 26 1 98 49 72 1 99 20 25 1 100 21 86 1 101 20 23 1 102 23 34 1 103 20 24 1 104 20 23 1 105 20 28 1 106 20 42 1 107 20 25 1 108 20 33 1 109 20 35 1 110 33 67 1 111 20 29 1 112 25 72 1 113 20 26 1 114 231 874 1 115 22 27 1 116 26 81 1 117 26 81 1 118 20 25 1 119 20 32 1 120 20 24 1 121 25 77 1 122 20 25 1 123 20 25 1 124 21 38 1 125 20 24 1 126 24 53 1 127 20 24 1 128 52 116 1 129 20 26 1 130 20 29 1 131 21 67 1 132 22 118 1 133 415 1749 1 134 20 25 1 135 22 50 1 136 21 43 1 137 30 73 1 138 20 42 1 139 31 139 1 140 26 57 1 141 80 266 1 142 20 45 1 143 21 79 1 144 20 27 1 145 20 34 1 146 44 71 1 147 25 52 1 148 21 27 1 149 22 41 1 150 23 124 1 151 31 76 1 152 23 46 1 153 20 23 1 154 20 23 1 155 22 32 1 156 20 24 1 157 23 49 1 158 78 213 1 159 22 45 1 160 20 26 1 161 21 48 1 162 21 27 1 163 21 33 1 164 57 195 1 165 21 32 1 166 27 83 1 167 20 28 1 168 63 163 1 169 24 79 1 170 32 45 1 171 21 44 1 172 20 26 1 173 25 54 1 174 35 124 1 175 20 36 1 176 58 117 1 177 20 23 1 178 20 32 1 179 33 68 1 180 21 26 1 181 27 31 1 182 20 23 1 183 20 37 1 184 20 23 1 185 20 24 1 186 22 37 1 187 29 61 1 188 31 51 1 189 21 34 1 190 20 26 1 191 28 39 1 192 21 29 1 193 32 74 1 194 21 45 1 195 20 25 1 196 21 30 1 197 20 32 1 198 39 241 1 199 37 167 1 200 56 790 1 201 20 43 1 202 20 21 1 203 23 40 1 204 42 86 1 205 20 26 1 206 23 63 1 207 42 63 1 208 20 30 1 209 57 224 1 210 71 475 1 211 20 24 1 212 20 26 1 213 26 61 1 214 25 42 1 215 27 83 1 216 31 100 1 217 29 173 1 218 23 48 1 219 26 33 1 220 47 80 1 221 28 189 1 222 20 33 1 223 20 27 1 224 22 50 1 225 20 26 1 226 79 371 1 227 20 22 1 228 23 70 1 229 20 25 1 230 21 30 1 231 21 36 1 232 21 28 1 233 20 23 1 234 36 98 1 235 20 23 1 236 20 33 1 237 20 23 1 238 63 116 1 239 20 27 1 240 21 33 1 241 22 29 1 242 25 55 1 243 40 82 1 244 26 77 1 245 20 31 1 246 21 43 1 247 21 36 1 248 21 36 1 249 26 90 1 250 21 41 1 251 40 146 1 252 20 23 1 253 20 31 1 254 28 79 1 255 20 24 1 256 24 47 1 257 21 30 1 258 23 55 1 259 23 56 1 260 25 66 1 261 22 48 1 262 20 27 1 263 21 34 1 264 20 26 1 265 24 63 1 266 41 125 1 267 20 26 1 268 20 24 1 269 22 45 1 270 20 24 1 271 42 102 1 272 22 40 1 273 20 23 1 274 20 23 1 275 23 47 1 276 37 114 1 277 20 22 1 278 20 23 1 279 56 165 1 280 28 254 1 281 25 91 1 282 20 21 1 283 20 23 1 284 20 21 1 285 74 194 1 286 20 22 1 287 25 66 1 288 21 32 1 289 24 29 1 290 116 1105 1 291 76 255 1 292 1822 3903 1 293 21 40 1 294 22 45 1 295 22 46 1 296 28 62 1 297 23 48 1 298 33 81 1 299 20 29 1 300 42 158 1 301 206 498 1 302 35 117 1 303 30 87 1 304 20 40 1 305 20 25 1 306 20 44 1 307 50 192 1 308 20 22 1 309 20 25 1 310 22 65 1 311 22 61 1 312 38 172 1 313 22 45 1 314 36 85 1 315 224 1385 1 316 20 39 1 317 21 35 1 318 664 3362 1 319 20 33 1 320 24 47 1 321 21 34 1 322 20 33 1 323 1255 3115 1 324 20 23 1 325 22 34 1 326 20 23 1 327 20 30 1 328 21 40 1 329 20 31 1 330 23 37 1 331 25 52 1 332 20 40 1 333 35 88 1 334 542 2141 1 335 21 28 1 336 32 66 1 337 20 32 1 338 46 293 1 339 22 43 1 340 24 58 1 341 25 67 1 342 20 25 1 343 21 49 1 344 21 30 1 345 28 98 1 346 20 23 1 347 25 54 1 348 56 253 1 349 22 32 1 350 20 44 1 351 23 42 1 352 43 110 1 353 20 22 1 354 28 60 1 355 20 22 1 356 21 24 1 357 20 23 1 358 20 29 1 359 26 111 1 360 23 52 1 361 20 27 1 362 25 42 1 363 27 40 1 364 45 111 1 365 21 31 1 366 20 32 1 367 20 23 1 368 22 50 1 369 20 30 1 370 31 60 1 371 368 430 1 372 23 36 1 373 20 25 1 374 20 39 1 375 28 72 1 376 21 38 1 377 20 25 1 378 26 64 1 379 20 24 1 380 21 44 1 381 51 195 1 382 25 72 1 383 20 31 1 384 33 128 1 385 50 230 1 386 20 23 1 387 21 33 1 388 22 39 1 389 20 30 1 390 74 261 1 391 20 33 1 392 21 36 1 393 22 26 1 394 20 42 1 395 49 140 1 396 26 48 1 397 21 43 1 398 38 206 1 399 30 44 1 400 21 31 1 401 21 47 1 402 20 26 1 403 20 23 1 404 85 312 1 405 23 30 1 406 25 62 1 407 84 219 1 408 35 264 1 409 20 24 1 410 20 24 1 411 20 28 1 412 84 143 1 413 54 190 1 414 49 89 1 415 21 33 1 416 20 26 1 417 28 52 1 418 20 25 1 419 104 160 1 420 20 25 1 421 22 59 1 422 20 31 1 423 21 36 1 424 69 424 1 425 20 28 1 426 22 30 1 427 26 103 1 428 105 476 1 429 34 140 1 430 23 39 1 431 24 50 1 432 23 47 1 433 54 111 1 434 78 214 1 435 60 167 1 436 20 24 1 437 47 58 1 438 20 27 1 439 25 52 1 440 33 100 1 441 22 32 1 442 21 38 1 443 20 24 1 444 20 26 1 445 26 41 1 446 20 23 1 447 27 46 1 448 21 37 1 449 25 62 1 450 22 35 1 451 20 27 1 452 20 23 1 453 121 551 1 454 22 26 1 455 98 178 1 456 22 62 1 457 20 26 1 458 22 33 1 459 26 67 1 460 21 33 1 461 140 810 1 462 20 30 1 463 31 107 1 464 20 25 1 465 29 109 1 466 20 23 1 467 21 30 1 468 48 139 1 469 20 23 1 470 21 57 1 471 21 31 1 472 21 26 1 473 27 49 1 474 30 105 1 475 21 26 1 476 22 36 1 477 22 46 1 478 21 30 1 479 21 33 1 480 20 31 1 481 65 224 1 482 20 23 1 483 20 55 1 484 20 34 1 485 22 27 1 486 20 25 1 487 20 29 1 488 21 30 1 489 23 37 1 490 20 26 1 491 20 156 1 492 27 74 1 493 22 45 1 494 27 154 1 495 20 25 1 496 66 215 1 497 20 24 1 498 21 53 1 499 23 61 1 500 28 211 1 501 26 74 1 502 65 311 1 503 34 93 1 504 23 91 1 505 24 75 1 506 20 25 1 507 20 44 1 508 20 24 1 509 62 28 1 510 20 111 1 511 20 25 1 512 23 42 1 513 84 454 1 514 41 156 1 515 26 115 1 516 76 233 1 517 36 147 1 518 28 74 1 519 27 57 1 520 28 52 1 521 25 52 1 522 21 26 1 523 101 579 1 524 182 515 1 525 20 25 1 526 20 23 1 527 33 98 1 528 20 24 1 529 21 45 1 530 21 27 1 531 29 59 1 532 21 42 1 533 22 60 1 534 20 37 1 535 28 97 1 536 20 24 1 537 50 161 1 538 42 92 1 539 24 142 1 540 55 218 1 541 23 38 1 542 29 77 1 543 20 28 1 544 81 323 1 545 20 25 1 546 53 331 1 547 50 257 1 548 20 22 1 549 29 39 1 550 28 52 1 551 28 60 1 552 30 149 1 553 26 53 1 554 20 26 1 555 21 27 1 556 25 27 1 557 21 37 1 558 36 86 1 559 72 274 1 560 21 27 1 561 41 166 1 562 20 23 1 563 33 93 1 564 23 38 1 565 132 388 1 566 42 219 1 567 40 228 1 568 20 28 1 569 20 23 1 570 21 27 1 571 25 68 1 572 20 24 1 573 44 309 1 574 20 24 1 575 29 115 1 576 20 30 1 577 28 131 1 578 24 24 1 579 224 2143 1 580 20 33 1 581 20 60 1 582 202 1440 1 583 1650 7474 1 584 20 26 1 585 20 43 1 586 20 56 1 587 21 33 1 588 387 1156 1 589 33 164 1 590 20 67 1 591 20 70 1 592 21 56 1 593 29 71 1 594 21 30 1 595 21 44 1 596 20 29 1 597 20 26 1 598 21 509 1 599 33 67 1 600 20 32 1 601 44 110 1 602 26 108 1 603 21 58 1 604 21 61 1 605 21 48 1 606 147 470 1 607 20 26 1 608 26 82 1 609 34 69 1 610 20 41 1 611 41 134 1 612 22 31 1 613 20 25 1 614 20 52 1 615 21 43 1 616 20 32 1 617 24 56 1 618 23 74 1 619 22 49 1 620 27 47 1 621 29 57 1 622 5981 19675 1 623 877 5221 1 624 6537 21169 1 625 20 26 1 626 20 41 1 627 38 119 1 628 38 83 1 629 20 22 1 630 27 69 1 631 25 61 1 632 36 74 1 633 22 41 1 634 22 37 1 635 20 25 1 636 20 26 1 637 20 25 1 638 21 33 1 639 25 54 1 640 22 34 1 641 24 162 1 642 20 23 1 643 1572 8121 1 644 20 23 1 645 60 95 1 646 20 23 1 647 27 55 1 648 40 82 1 649 27 81 1 650 21 34 1 651 24 47 1 652 21 24 1 653 20 22 1 654 21 32 1 655 38 155 1 656 24 45 1 657 34 106 1 658 102 313 1 659 60 104 1 660 25 57 1 661 20 28 1 662 21 26 1 663 20 32 1 664 20 25 1 665 20 42 1 666 20 40 1 667 36 89 1 668 23 49 1 669 20 26 1 670 37 121 1 671 184 3050 1 672 23 42 1 673 20 26 1 674 20 25 1 675 24 45 1 676 20 25 1 677 20 23 1 678 21 31 1 679 21 39 1 680 20 23 1 681 20 25 1 682 20 26 1 683 27 57 1 684 21 41 1 685 22 29 1 686 46 124 1 687 20 23 1 688 21 32 1 689 22 60 1 690 29 53 1 691 22 27 1 692 25 90 1 693 24 46 1 694 32 66 1 695 27 80 1 696 20 28 1 697 22 40 1 698 21 36 1 699 20 23 1 700 20 27 1 701 25 39 1 702 24 40 1 703 37 88 1 704 21 30 1 705 20 25 1 706 27 57 1 707 20 24 1 708 26 87 1 709 29 59 1 710 20 34 1 711 49 100 1 712 20 28 1 713 20 27 1 714 66 1404 1 715 26 28 1 716 20 24 1 717 44 175 1 718 31 85 1 719 20 23 1 720 20 29 1 721 20 29 1 722 22 46 1 723 25 68 1 724 46 402 1 725 24 61 1 726 28 73 1 727 23 48 1 728 20 31 1 729 38 64 1 730 74 327 1 731 52 72 1 732 37 361 1 733 30 60 1 734 47 249 1 735 32 84 1 736 136 237 1 737 20 29 1 738 33 58 1 739 20 25 1 740 36 58 1 741 30 77 1 742 47 82 1 743 32 45 1 744 38 131 1 745 20 23 1 746 41 30 1 747 56 212 1 748 44 144 1 749 31 64 1 750 33 56 1 751 47 155 1 752 61 187 1 753 38 176 1 754 40 194 1 755 23 68 1 756 21 52 1 757 20 44 1 758 27 113 1 759 45 99 1 760 20 56 1 761 20 49 1 762 22 32 1 763 36 143 1 764 26 87 1 765 22 36 1 766 188 695 1 767 20 32 1 768 108 91 1 769 70 1315 1 770 21 36 1 771 20 35 1 772 31 143 1 773 20 24 1 774 33 147 1 775 20 24 1 776 27 136 1 777 43 227 1 778 894 2603 1 779 20 28 1 780 37 132 1 781 21 65 1 782 102 308 1 783 49 166 1 784 32 92 1 785 29 52 1 786 25 63 1 787 101 303 1 788 20 38 1 789 60 55 1 790 20 25 1 791 88 213 1 792 21 31 1 793 39 116 1 794 27 36 1 795 65 218 1 796 119 1220 1 797 21 28 1 798 31 79 1 799 24 60 1 800 29 81 1 801 31 176 1 802 40 110 1 803 25 138 1 804 43 79 1 805 20 26 1 806 20 25 1 807 20 24 1 808 20 43 1 809 27 47 1 810 20 24 1 811 22 35 1 812 36 86 1 813 26 37 1 814 29 65 1 815 44 81 1 816 29 97 1 817 21 29 1 818 30 111 1 819 30 43 1 820 21 36 1 821 36 181 1 822 22 49 1 823 20 24 1 824 20 40 1 825 54 163 1 826 27 66 1 827 38 217 1 828 22 42 1 829 20 25 1 830 23 28 1 831 33 82 1 832 23 52 1 833 27 45 1 834 30 90 1 835 171 310 1 836 20 56 1 837 39 80 1 838 47 136 1 839 66 304 1 840 30 91 1 841 20 24 1 842 31 59 1 843 31 114 1 844 34 115 1 845 27 119 1 846 77 218 1 847 47 151 1 848 22 37 1 849 36 112 1 850 22 44 1 851 25 44 1 852 46 166 1 853 20 44 1 854 27 51 1 855 20 39 1 856 21 40 1 857 20 26 1 858 30 173 1 859 20 24 1 860 22 38 1 861 21 27 1 862 34 41 1 863 20 26 1 864 27 45 1 865 20 39 1 866 36 182 1 867 21 25 1 868 183 1607 1 869 20 34 1 870 29 66 1 871 20 33 1 872 21 32 1 873 34 90 1 874 24 57 1 875 21 56 1 876 307 9017 1 877 22 47 1 878 22 57 1 879 20 26 1 880 25 53 1 881 20 58 1 882 20 24 1 883 20 24 1 884 22 33 1 885 20 29 1 886 20 26 1 887 21 47 1 888 21 41 1 889 20 48 1 890 20 37 1 891 907 3213 1 892 21 27 1 893 28 76 1 894 34 110 1 895 41 99 1 896 1045 4412 1 897 23 51 1 898 99 910 1 899 20 40 1 900 22 39 1 901 28 73 1 902 20 27 1 903 20 44 1 904 20 29 1 905 25 64 1 906 21 58 1 907 26 91 1 908 203 1047 1 909 20 28 1 910 20 43 1 911 24 54 1 912 20 29 1 913 20 32 1 914 26 157 1 915 580 2775 1 916 31 96 1 917 25 57 1 918 20 23 1 919 23 50 1 920 30 89 1 921 36 140 1 922 36 75 1 923 25 51 1 924 665 2451 1 925 25 58 1 926 20 45 1 927 25 43 1 928 86 515 1 929 21 51 1 930 26 72 1 931 20 26 1 932 21 32 1 933 20 22 1 934 20 24 1 935 20 24 1 936 24 49 1 937 21 45 1 938 38 76 1 939 30 98 1 940 23 59 1 941 25 59 1 942 21 28 1 943 117 224 1 944 20 26 1 945 28 94 1 946 22 45 1 947 26 92 1 948 35 77 1 949 26 72 1 950 22 51 1 951 20 38 1 952 24 47 1 953 27 80 1 954 24 72 1 955 20 67 1 956 22 54 1 957 85 217 1 958 20 37 1 959 57 113 1 960 21 41 1 961 20 41 1 962 43 120 1 963 27 65 1 964 27 79 1 965 27 66 1 966 24 71 1 967 20 59 1 968 26 55 1 969 77 309 1 970 31 111 1 971 21 35 1 972 38 202 1 973 20 53 1 974 62 167 1 975 30 89 1 976 41 171 1 977 24 50 1 978 21 50 1 979 20 59 1 980 26 103 1 981 26 132 1 982 32 74 1 983 23 74 1 984 49 111 1 985 21 92 1 986 33 124 1 987 26 66 1 988 21 55 1 989 26 636 1 990 315 487 1 991 29 73 1 992 21 35 1 993 39 245 1 994 20 29 1 995 49 50 1 996 21 55 1 997 21 66 1 998 22 69 1 999 23 79 1 1000 20 38 1 1001 20 31 1 1002 23 44 1 1003 21 94 1 1004 74 98 1 1005 36 96 1 1006 21 93 1 1007 24 49 1 1008 20 42 1 1009 20 30 1 1010 118 192 1 1011 28 91 1 1012 21 52 1 1013 25 76 1 1014 20 67 1 1015 20 37 1 1016 20 34 1 1017 54 213 1 1018 26 85 1 1019 77 3005 1 1020 22 28 1 1021 21 33 1 1022 24 55 1 1023 20 25 1 1024 21 33 1 1025 37 146 1 1026 21 40 1 1027 21 121 1 1028 22 49 1 1029 31 142 1 1030 20 39 1 1031 20 42 1 1032 20 41 1 1033 22 37 1 1034 31 80 1 1035 28 62 1 1036 20 28 1 1037 195 937 1 1038 20 34 1 1039 52 94 1 1040 21 32 1 1041 22 46 1 1042 20 35 1 1043 26 56 1 1044 23 40 1 1045 23 56 1 1046 21 38 1 1047 20 50 1 1048 40 84 1 1049 21 49 1 1050 21 56 1 1051 35 104 1 1052 23 64 1 1053 20 29 1 1054 26 101 1 1055 28 69 1 1056 22 30 1 1057 20 25 1 1058 20 39 1 1059 84 540 1 1060 22 44 1 1061 20 26 1 1062 20 35 1 1063 41 149 1 1064 22 59 1 1065 196 1513 1 1066 20 64 1 1067 20 53 1 1068 52 221 1 1069 361 1534 1 1070 20 33 1 1071 65 309 1 1072 129 1808 1 1073 21 31 1 1074 26 92 1 1075 20 30 1 1076 20 22 1 1077 42 128 1 1078 20 33 1 1079 20 34 1 1080 23 279 1 1081 24 58 1 1082 29 666 1 1083 62 379 1 1084 23 69 1 1085 20 30 1 1086 26 56 1 1087 21 57 1 1088 26 36 1 1089 20 26 1 1090 20 24 1 1091 21 32 1 1092 21 29 1 1093 21 46 1 1094 89 116 1 1095 20 28 1 1096 24 54 1 1097 27 267 1 1098 47 335 1 1099 20 33 1 1100 20 58 1 1101 23 48 1 1102 46 199 1 1103 20 51 1 1104 36 121 1 1105 23 29 1 1106 56 213 1 1107 20 65 1 1108 29 111 1 1109 23 83 1 1110 23 52 1 1111 23 56 1 1112 20 26 1 1113 21 68 1 1114 29 81 1 1115 28 76 1 1116 21 48 1 1117 21 57 1 1118 20 34 1 1119 39 211 1 1120 20 33 1 1121 36 180 1 1122 24 67 1 1123 33 78 1 1124 25 73 1 1125 39 156 1 1126 46 169 1 1127 26 48 1 1128 32 121 1 1129 23 42 1 1130 69 232 1 1131 31 150 1 1132 27 80 1 1133 28 93 1 1134 20 38 1 1135 21 28 1 1136 30 121 1 1137 20 37 1 1138 20 26 1 1139 20 24 1 1140 20 23 1 1141 23 40 1 1142 20 22 1 1143 105 255 1 1144 20 22 1 1145 22 55 1 1146 20 23 1 1147 29 83 1 1148 29 36 1 1149 42 109 1 1150 20 31 1 1151 48 124 1 1152 20 27 1 1153 25 56 1 1154 21 48 1 1155 20 27 1 1156 20 24 1 1157 247 1687 1 1158 57 111 1 1159 97 152 1 1160 984 2305 1 1161 292 724 1 1162 20 26 1 1163 975 4767 1 1164 22 44 1 1165 25 63 1 1166 20 62 1 1167 21 44 1 1168 20 27 1 1169 20 29 1 1170 20 31 1 1171 20 24 1 1172 21 46 1 1173 36 95 1 1174 59 113 1 1175 20 23 1 1176 72 759 1 1177 20 24 1 1178 20 24 1 1179 21 35 1 1180 130 578 1 1181 20 59 1 1182 21 44 1 1183 21 36 1 1184 20 25 1 1185 20 44 1 1186 20 34 1 1187 20 36 1 1188 845 2229 1 1189 21 37 1 1190 20 32 1 1191 20 23 1 1192 35 81 1 1193 20 21 1 1194 20 27 1 1195 20 28 1 1196 23 54 1 1197 20 37 1 1198 23 60 1 1199 20 30 1 1200 261 913 1 1201 20 31 1 1202 20 40 1 1203 23 40 1 1204 20 23 1 1205 29 123 1 1206 32 162 1 1207 20 25 1 1208 20 25 1 1209 25 60 1 1210 31 45 1 1211 20 23 1 1212 28 43 1 1213 130 813 1 1214 20 23 1 1215 20 39 1 1216 23 50 1 1217 67 118 1 1218 20 25 1 1219 21 42 1 1220 22 37 1 1221 22 43 1 1222 23 38 1 1223 20 23 1 1224 20 22 1 1225 25 41 1 1226 20 24 1 1227 20 36 1 1228 25 66 1 1229 20 44 1 1230 20 40 1 1231 20 23 1 1232 22 50 1 1233 25 36 1 1234 21 28 1 1235 20 25 1 1236 403 2078 1 1237 35 91 1 1238 20 26 1 1239 20 26 1 1240 24 48 1 1241 32 89 1 1242 32 98 1 1243 19 26 1 1244 53 119 1 1245 20 23 1 1246 21 34 1 1247 20 22 1 1248 20 27 1 1249 20 39 1 1250 20 32 1 1251 21 27 1 1252 21 24 1 1253 20 26 1 1254 21 38 1 1255 20 22 1 1256 23 44 1 1257 20 23 1 1258 20 23 1 1259 20 23 1 1260 20 24 1 1261 30 52 1 1262 20 24 1 1263 30 96 1 1264 20 23 1 1265 20 26 1 1266 20 27 1 1267 20 23 1 1268 20 24 1 1269 20 25 1 1270 31 56 1 1271 20 30 1 1272 20 26 1 1273 21 43 1 1274 576 4033 1 1275 20 27 1 1276 20 22 1 1277 20 31 1 1278 44 190 1 1279 20 23 1 1280 21 32 1 1281 20 24 1 1282 25 77 1 1283 20 34 1 1284 20 26 1 1285 20 22 1 1286 20 26 1 1287 22 42 1 1288 65 92 1 1289 20 25 1 1290 20 25 1 1291 22 49 1 1292 20 25 1 1293 21 39 1 1294 20 25 1 1295 23 39 1 1296 37 90 1 1297 21 50 1 1298 20 23 1 1299 24 60 1 1300 20 24 1 1301 21 51 1 1302 21 22 1 1303 20 25 1 1304 25 65 1 1305 22 39 1 1306 20 33 1 1307 23 60 1 1308 30 73 1 1309 23 26 1 1310 20 28 1 1311 20 23 1 1312 41 252 1 1313 30 90 1 1314 25 70 1 1315 23 47 1 1316 21 38 1 1317 39 154 1 1318 22 37 1 1319 20 22 1 1320 23 45 1 1321 25 86 1 1322 20 22 1 1323 32 119 1 1324 24 44 1 1325 310 769 1 1326 20 26 1 1327 23 43 1 1328 80 519 1 1329 20 24 1 1330 23 55 1 1331 20 24 1 1332 23 48 1 1333 22 42 1 1334 28 47 1 1335 20 29 1 1336 21 29 1 1337 21 36 1 1338 22 36 1 1339 20 27 1 1340 22 44 1 1341 22 41 1 1342 26 87 1 1343 21 31 1 1344 20 33 1 1345 22 58 1 1346 20 25 1 1347 20 22 1 1348 24 62 1 1349 20 28 1 1350 24 44 1 1351 27 53 1 1352 27 53 1 1353 22 31 1 1354 28 65 1 1355 20 24 1 1356 35 205 1 1357 20 25 1 1358 22 39 1 1359 20 23 1 1360 20 24 1 1361 25 64 1 1362 24 53 1 1363 23 50 1 1364 21 36 1 1365 35 76 1 1366 31 118 1 1367 47 123 1 1368 20 29 1 1369 21 29 1 1370 69 218 1 1371 20 228 1 1372 20 25 1 1373 21 40 1 1374 20 27 1 1375 25 39 1 1376 20 22 1 1377 20 23 1 1378 20 28 1 1379 21 33 1 1380 24 91 1 1381 20 26 1 1382 20 26 1 1383 20 22 1 1384 22 32 1 1385 20 25 1 1386 26 30 1 1387 21 26 1 1388 25 74 1 1389 20 23 1 1390 20 27 1 1391 20 23 1 1392 22 58 1 1393 20 23 1 1394 23 38 1 1395 84 256 1 1396 20 27 1 1397 20 24 1 1398 20 23 1 1399 21 39 1 1400 22 39 1 1401 27 73 1 1402 21 31 1 1403 22 42 1 1404 20 41 1 1405 23 148 1 1406 21 29 1 1407 23 45 1 1408 20 59 1 1409 21 126 1 1410 20 23 1 1411 46 119 1 1412 22 59 1 1413 20 24 1 1414 20 27 1 1415 26 67 1 1416 20 28 1 1417 21 41 1 1418 21 29 1 1419 20 45 1 1420 20 25 1 1421 30 156 1 1422 29 89 1 1423 27 36 1 1424 27 76 1 1425 23 63 1 1426 20 38 1 1427 57 191 1 1428 21 29 1 1429 20 31 1 1430 25 41 1 1431 20 23 1 1432 30 237 1 1433 20 24 1 1434 20 32 1 1435 20 24 1 1436 30 100 1 1437 23 46 1 1438 22 61 1 1439 20 23 1 1440 74 113 1 1441 20 29 1 1442 23 41 1 1443 20 23 1 1444 32 59 1 1445 21 37 1 1446 56 421 1 1447 57 197 1 1448 20 29 1 1449 26 65 1 1450 25 43 1 1451 599 2850 1 1452 35 222 1 1453 20 30 1 1454 28 110 1 1455 24 44 1 1456 70 699 1 1457 412 2093 1 1458 20 32 1 1459 23 55 1 1460 30 105 1 1461 20 22 1 1462 24 35 1 1463 25 84 1 1464 20 28 1 1465 20 25 1 1466 23 80 1 1467 20 29 1 1468 263 824 1 1469 28 89 1 1470 21 44 1 1471 29 93 1 1472 126 338 1 1473 30 66 1 1474 30 237 1 1475 31 90 1 1476 161 573 1 1477 24 32 1 1478 28 70 1 1479 20 34 1 1480 20 23 1 1481 20 28 1 1482 20 22 1 1483 46 116 1 1484 37 79 1 1485 179 937 1 1486 32 72 1 1487 23 40 1 1488 23 43 1 1489 21 39 1 1490 45 145 1 1491 31 137 1 1492 20 27 1 1493 20 31 1 1494 20 42 1 1495 418 1774 1 1496 20 24 1 1497 20 24 1 1498 30 94 1 1499 20 25 1 1500 21 29 1 1501 27 47 1 1502 20 27 1 1503 23 42 1 1504 20 152 1 1505 21 31 1 1506 97 263 1 1507 20 28 1 1508 20 27 1 1509 20 22 1 1510 28 109 1 1511 20 22 1 1512 76 205 1 1513 20 22 1 1514 20 24 1 1515 25 98 1 1516 20 23 1 1517 25 45 1 1518 43 146 1 1519 37 216 1 1520 21 26 1 1521 22 49 1 1522 20 22 1 1523 24 56 1 1524 96 234 1 1525 20 23 1 1526 27 82 1 1527 21 28 1 1528 22 41 1 1529 20 26 1 1530 22 46 1 1531 20 23 1 1532 20 23 1 1533 27 65 1 1534 20 25 1 1535 20 22 1 1536 20 24 1 1537 163 470 1 1538 27 203 1 1539 30 521 1 1540 36 152 1 1541 20 31 1 1542 33 205 1 1543 23 85 1 1544 20 24 1 1545 20 41 1 1546 25 91 1 1547 139 664 1 1548 20 34 1 1549 21 26 1 1550 32 42 1 1551 21 41 1 1552 44 48 1 1553 21 40 1 1554 29 100 1 1555 20 29 1 1556 20 34 1 1557 20 25 1 1558 20 27 1 1559 25 56 1 1560 22 34 1 1561 29 40 1 1562 32 66 1 1563 23 44 1 1564 55 218 1 1565 20 24 1 1566 26 94 1 1567 21 32 1 1568 23 70 1 1569 24 48 1 1570 20 23 1 1571 20 25 1 1572 20 46 1 1573 299 607 1 1574 47 302 1 1575 48 140 1 1576 21 32 1 1577 23 34 1 1578 21 42 1 1579 23 51 1 1580 20 24 1 1581 21 36 1 1582 20 29 1 1583 30 77 1 1584 25 70 1 1585 20 23 1 1586 27 51 1 1587 32 77 1 1588 34 111 1 1589 28 76 1 1590 21 33 1 1591 21 31 1 1592 23 36 1 1593 27 103 1 1594 22 31 1 1595 49 192 1 1596 20 44 1 1597 20 28 1 1598 128 247 1 1599 20 23 1 1600 28 121 1 1601 22 45 1 1602 39 109 1 1603 43 174 1 1604 20 30 1 1605 44 87 1 1606 25 50 1 1607 25 60 1 1608 25 57 1 1609 431 732 1 1610 20 24 1 1611 59 236 1 1612 36 138 1 1613 53 145 1 1614 22 68 1 1615 20 34 1 1616 20 22 1 1617 20 24 1 1618 21 26 1 1619 25 93 1 1620 20 23 1 1621 27 81 1 1622 21 32 1 1623 21 27 1 1624 20 22 1 1625 23 42 1 1626 21 44 1 1627 69 182 1 1628 20 26 1 1629 94 442 1 1630 23 37 1 1631 197 837 1 1632 42 214 1 1633 20 24 1 1634 20 28 1 1635 20 24 1 1636 20 23 1 1637 56 179 1 1638 20 26 1 1639 20 23 1 1640 20 24 1 1641 24 46 1 1642 21 40 1 1643 26 50 1 1644 24 33 1 1645 22 30 1 1646 20 23 1 1647 23 41 1 1648 22 47 1 1649 20 27 1 1650 21 25 1 1651 27 67 1 1652 97 486 1 1653 65 290 1 1654 22 30 1 1655 20 33 1 1656 91 73 1 1657 21 24 1 1658 81 211 1 1659 20 28 1 1660 28 105 1 1661 20 26 1 1662 95 331 1 1663 25 83 1 1664 22 44 1 1665 32 70 1 1666 48 245 1 1667 23 87 1 1668 22 38 1 1669 33 249 1 1670 388 809 1 1671 20 25 1 1672 92 409 1 1673 20 28 1 1674 36 134 1 1675 20 26 1 1676 20 29 1 1677 29 117 1 1678 26 85 1 1679 25 75 1 1680 22 63 1 1681 20 23 1 1682 200 654 1 1683 20 27 1 1684 20 23 1 1685 26 51 1 1686 44 94 1 1687 23 62 1 1688 24 62 1 1689 20 28 1 1690 58 193 1 1691 47 87 1 1692 29 140 1 1693 20 44 1 1694 21 42 1 1695 20 23 1 1696 21 35 1 1697 20 26 1 1698 20 29 1 1699 25 70 1 1700 20 36 1 1701 20 24 1 1702 22 38 1 1703 23 92 1 1704 21 30 1 1705 42 125 1 1706 22 39 1 1707 41 155 1 1708 23 48 1 1709 45 359 1 1710 69 221 1 1711 21 28 1 1712 20 24 1 1713 20 34 1 1714 20 26 1 1715 21 28 1 1716 26 61 1 1717 25 54 1 1718 20 22 1 1719 24 59 1 1720 20 23 1 1721 28 118 1 1722 21 34 1 1723 27 74 1 1724 24 101 1 1725 23 61 1 1726 20 23 1 1727 72 136 1 1728 56 835 1 1729 47 167 1 1730 21 24 1 1731 22 28 1 1732 25 135 1 1733 23 93 1 1734 30 82 1 1735 325 2222 1 1736 20 28 1 1737 81 213 1 1738 20 22 1 1739 20 29 1 1740 26 31 1 1741 21 29 1 1742 23 39 1 1743 22 57 1 1744 21 35 1 1745 20 22 1 1746 20 25 1 1747 20 22 1 1748 20 25 1 1749 30 79 1 1750 21 38 1 1751 23 50 1 1752 20 25 1 1753 20 24 1 1754 26 62 1 1755 27 71 1 1756 145 1116 1 1757 28 115 1 1758 20 34 1 1759 90 205 1 1760 23 48 1 1761 20 24 1 1762 3710 19481 1 1763 23 36 1 1764 20 36 1 1765 30 37 1 1766 77 207 1 1767 32 60 1 1768 21 36 1 1769 22 58 1 1770 21 38 1 1771 20 30 1 1772 24 109 1 1773 24 62 1 1774 94 256 1 1775 20 26 1 1776 463 4616 1 1777 27 56 1 1778 21 40 1 1779 29 63 1 1780 20 25 1 1781 70 561 1 1782 80 91 1 1783 57 211 1 1784 21 48 1 1785 21 22 1 1786 20 35 1 1787 20 29 1 1788 39 127 1 1789 27 59 1 1790 23 41 1 1791 28 63 1 1792 20 25 1 1793 52 93 1 1794 27 73 1 1795 44 84 1 1796 25 47 1 1797 29 68 1 1798 25 49 1 1799 23 48 1 1800 35 82 1 1801 108 1235 1 1802 20 23 1 1803 65 91 1 1804 20 23 1 1805 21 37 1 1806 21 27 1 1807 21 28 1 1808 29 109 1 1809 43 118 1 1810 37 182 1 1811 22 58 1 1812 21 30 1 1813 20 36 1 1814 21 26 1 1815 25 49 1 1816 23 79 1 1817 20 25 1 1818 20 32 1 1819 81 194 1 1820 43 412 1 1821 26 39 1 1822 91 408 1 1823 42 124 1 1824 25 53 1 1825 23 56 1 1826 22 48 1 1827 20 24 1 1828 32 63 1 1829 39 81 1 1830 57 101 1 1831 20 35 1 1832 118 376 1 1833 21 38 1 1834 21 37 1 1835 21 32 1 1836 20 25 1 1837 20 25 1 1838 21 31 1 1839 20 27 1 1840 20 22 1 1841 37 89 1 1842 24 41 1 1843 21 32 1 1844 20 29 1 1845 22 32 1 1846 20 35 1 1847 37 50 1 1848 25 33 1 1849 33 107 1 1850 29 63 1 1851 24 75 1 1852 20 23 1 1853 20 24 1 1854 20 31 1 1855 20 25 1 1856 20 23 1 1857 31 84 1 1858 24 61 1 1859 63 286 1 1860 20 25 1 1861 22 96 1 1862 20 26 1 1863 20 26 1 1864 24 51 1 1865 35 138 1 1866 22 37 1 1867 27 101 1 1868 21 26 1 1869 36 65 1 1870 151 679 1 1871 22 47 1 1872 22 103 1 1873 47 127 1 1874 21 38 1 1875 34 42 1 1876 42 67 1 1877 23 42 1 1878 21 38 1 1879 26 59 1 1880 22 36 1 1881 26 30 1 1882 23 56 1 1883 20 23 1 1884 34 113 1 1885 22 43 1 1886 47 224 1 1887 23 44 1 1888 21 32 1 1889 24 31 1 1890 33 124 1 1891 26 77 1 1892 22 43 1 1893 21 33 1 1894 20 40 1 1895 31 49 1 1896 20 28 1 1897 55 211 1 1898 60 276 1 1899 38 162 1 1900 26 129 1 1901 110 1277 1 1902 20 32 1 1903 36 44 1 1904 21 24 1 1905 27 86 1 1906 44 107 1 1907 20 32 1 1908 40 97 1 1909 65 220 1 1910 22 39 1 1911 21 26 1 1912 30 105 1 1913 20 36 1 1914 29 53 1 1915 21 26 1 1916 20 24 1 1917 31 278 1 1918 22 31 1 1919 20 26 1 1920 25 165 1 1921 37 107 1 1922 21 33 1 1923 27 51 1 1924 61 165 1 1925 20 69 1 1926 25 44 1 1927 34 88 1 1928 23 52 1 1929 23 30 1 1930 29 137 1 1931 26 66 1 1932 28 77 1 1933 20 30 1 1934 66 44 1 1935 20 26 1 1936 90 51 1 1937 20 29 1 1938 35 75 1 1939 191 660 1 1940 31 69 1 1941 36 227 1 1942 39 164 1 1943 26 58 1 1944 20 28 1 1945 40 193 1 1946 49 188 1 1947 20 25 1 1948 21 30 1 1949 22 34 1 1950 35 60 1 1951 20 58 1 1952 20 25 1 1953 21 26 1 1954 116 310 1 1955 61 164 1 1956 35 112 1 1957 23 39 1 1958 25 40 1 1959 26 166 1 1960 52 132 1 1961 20 24 1 1962 114 264 1 1963 20 24 1 1964 20 28 1 1965 22 31 1 1966 20 56 1 1967 20 24 1 1968 21 42 1 1969 23 34 1 1970 34 51 1 1971 32 59 1 1972 25 134 1 1973 108 844 1 1974 36 75 1 1975 34 131 1 1976 26 77 1 1977 21 40 1 1978 25 147 1 1979 25 73 1 1980 28 70 1 1981 28 499 1 1982 24 47 1 1983 29 106 1 1984 20 24 1 1985 48 340 1 1986 20 30 1 1987 50 120 1 1988 26 118 1 1989 29 52 1 1990 26 197 1 1991 44 253 1 1992 36 196 1 1993 20 31 1 1994 20 25 1 1995 25 58 1 1996 21 109 1 1997 53 280 1 1998 23 42 1 1999 670 10098 1 2000 22 109 1 2001 27 66 1 2002 30 60 1 2003 35 46 1 2004 39 60 1 2005 20 46 1 2006 33 75 1 2007 29 36 1 2008 84 178 1 2009 20 22 1 2010 37 194 1 2011 20 22 1 2012 73 360 1 2013 25 40 1 2014 34 187 1 2015 78 100 1 2016 40 130 1 2017 76 411 1 2018 21 29 1 2019 20 23 1 2020 30 85 1 2021 20 24 1 2022 34 188 1 2023 25 40 1 2024 184 1518 1 2025 20 24 1 2026 32 77 1 2027 21 32 1 2028 220 826 1 2029 26 62 1 2030 40 79 1 2031 20 43 1 2032 20 37 1 2033 59 175 1 2034 20 43 1 2035 20 32 1 2036 20 38 1 2037 20 43 1 2038 26 41 1 2039 20 21 1 2040 20 29 1 2041 20 24 1 2042 20 28 1 2043 23 65 1 2044 22 58 1 2045 20 31 1 2046 20 48 1 2047 21 36 1 2048 1014 4635 1 2049 20 34 1 2050 26 58 1 2051 1968 9735 1 2052 20 43 1 2053 20 26 1 2054 21 44 1 2055 30 179 1 2056 22 43 1 2057 20 24 1 2058 20 26 1 2059 22 41 1 2060 20 30 1 2061 20 26 1 2062 24 56 1 2063 20 28 1 2064 38 98 1 2065 20 35 1 2066 21 67 1 2067 20 45 1 2068 20 68 1 2069 20 27 1 2070 34 148 1 2071 20 33 1 2072 35 74 1 2073 20 23 1 2074 20 22 1 2075 25 67 1 2076 22 31 1 2077 20 29 1 2078 20 24 1 2079 30 61 1 2080 20 24 1 2081 50 179 1 2082 75 381 1 2083 21 48 1 2084 20 54 1 2085 22 49 1 2086 145 816 1 2087 20 24 1 2088 20 41 1 2089 20 23 1 2090 54 260 1 2091 20 23 1 2092 28 256 1 2093 25 74 1 2094 26 69 1 2095 39 108 1 2096 34 72 1 2097 91 420 1 2098 22 58 1 2099 73 619 1 2100 110 578 1 2101 23 63 1 2102 30 157 1 2103 22 68 1 2104 20 37 1 2105 39 161 1 2106 20 45 1 2107 20 26 1 2108 20 24 1 2109 20 26 1 2110 23 53 1 2111 22 43 1 2112 27 45 1 2113 66 265 1 2114 30 61 1 2115 20 41 1 2116 23 144 1 2117 93 373 1 2118 48 89 1 2119 23 223 1 2120 36 116 1 2121 28 62 1 2122 23 58 1 2123 20 30 1 2124 52 197 1 2125 110 614 1 2126 36 63 1 2127 21 57 1 2128 20 22 1 2129 25 107 1 2130 27 54 1 2131 22 81 1 2132 20 27 1 2133 21 41 1 2134 21 43 1 2135 20 56 1 2136 22 89 1 2137 36 146 1 2138 23 76 1 2139 29 58 1 2140 29 67 1 2141 22 44 1 2142 20 54 1 2143 20 555 1 2144 29 39 1 2145 28 94 1 2146 21 45 1 2147 21 52 1 2148 20 31 1 2149 63 172 1 2150 44 156 1 2151 168 573 1 2152 20 52 1 2153 53 217 1 2154 20 51 1 2155 27 129 1 2156 20 33 1 2157 21 30 1 2158 25 84 1 2159 26 68 1 2160 35 114 1 2161 27 61 1 2162 21 29 1 2163 24 39 1 2164 20 27 1 2165 58 116 1 2166 28 41 1 2167 161 785 1 2168 20 55 1 2169 26 92 1 2170 27 140 1 2171 77 342 1 2172 24 65 1 2173 27 116 1 2174 26 118 1 2175 20 23 1 2176 20 26 1 2177 21 27 1 2178 20 25 1 2179 34 144 1 2180 20 27 1 2181 21 42 1 2182 20 27 1 2183 34 130 1 2184 24 67 1 2185 22 105 1 2186 35 93 1 2187 94 1140 1 2188 27 76 1 2189 41 181 1 2190 48 113 1 2191 49 186 1 2192 20 26 1 2193 20 38 1 2194 20 29 1 2195 65 278 1 2196 70 176 1 2197 36 166 1 2198 20 26 1 2199 21 32 1 2200 23 42 1 2201 22 52 1 2202 23 58 1 2203 57 243 1 2204 32 112 1 2205 79 397 1 2206 20 32 1 2207 112 701 1 2208 21 47 1 2209 40 89 1 2210 453 2110 1 2211 21 27 1 2212 20 24 1 2213 54 374 1 2214 28 64 1 2215 20 24 1 2216 20 23 1 2217 25 94 1 2218 20 30 1 2219 70 1043 1 2220 20 44 1 2221 21 49 1 2222 20 39 1 2223 20 41 1 2224 24 83 1 2225 22 39 1 2226 23 54 1 2227 20 26 1 2228 21 195 1 2229 25 59 1 2230 24 45 1 2231 70 96 1 2232 88 1636 1 2233 30 59 1 2234 32 122 1 2235 20 30 1 2236 84 168 1 2237 21 67 1 2238 74 343 1 2239 62 576 1 2240 20 38 1 2241 23 63 1 2242 67 244 1 2243 44 138 1 2244 22 89 1 2245 20 23 1 2246 25 81 1 2247 24 67 1 2248 582 4298 1 2249 28 82 1 2250 49 216 1 2251 20 25 1 2252 129 587 1 2253 21 29 1 2254 36 115 1 2255 27 79 1 2256 61 396 1 2257 21 49 1 2258 167 165 1 2259 24 146 1 2260 62 173 1 2261 20 26 1 2262 20 31 1 2263 20 22 1 2264 20 29 1 2265 53 110 1 2266 20 23 1 2267 20 23 1 2268 25 56 1 2269 20 24 1 2270 25 77 1 2271 40 140 1 2272 60 205 1 2273 21 38 1 2274 20 29 1 2275 39 117 1 2276 25 81 1 2277 99 481 1 2278 29 68 1 2279 43 302 1 2280 23 363 1 2281 21 38 1 2282 26 149 1 2283 84 446 1 2284 34 111 1 2285 20 29 1 2286 20 27 1 2287 26 66 1 2288 20 31 1 2289 21 44 1 2290 20 44 1 2291 20 41 1 2292 20 27 1 2293 26 90 1 2294 26 75 1 2295 20 47 1 2296 20 23 1 2297 37 146 1 2298 20 22 1 2299 32 152 1 2300 23 69 1 2301 25 112 1 2302 24 32 1 2303 53 191 1 2304 73 561 1 2305 66 199 1 2306 21 65 1 2307 44 230 1 2308 41 168 1 2309 22 37 1 2310 20 24 1 2311 73 414 1 2312 20 25 1 2313 191 1501 1 2314 216 905 1 2315 307 647 1 2316 414 903 1 2317 20 22 1 2318 20 41 1 2319 20 26 1 2320 20 24 1 2321 20 23 1 2322 20 22 1 2323 35 110 1 2324 21 38 1 2325 20 22 1 2326 20 44 1 2327 20 25 1 2328 400 1975 1 2329 36 107 1 2330 219 968 1 2331 20 23 1 2332 76 92 1 2333 20 28 1 2334 214 585 1 2335 20 30 1 2336 20 37 1 2337 20 24 1 2338 20 23 1 2339 20 49 1 2340 23 42 1 2341 20 47 1 2342 20 31 1 2343 20 24 1 2344 20 28 1 2345 20 24 1 2346 20 22 1 2347 20 41 1 2348 20 31 1 2349 20 36 1 2350 24 101 1 2351 128 1339 1 2352 20 33 1 2353 20 45 1 2354 20 41 1 2355 24 61 1 2356 20 23 1 2357 20 44 1 2358 2734 9997 1 2359 37 140 1 2360 8162 24748 1 2361 20 23 1 2362 21 30 1 2363 101 295 1 2364 20 31 1 2365 25 54 1 2366 22 41 1 2367 20 24 1 2368 20 23 1 2369 25 53 1 2370 21 43 1 2371 20 27 1 2372 21 33 1 2373 20 34 1 2374 21 29 1 2375 179 1689 1 2376 20 22 1 2377 22 40 1 2378 20 23 1 2379 86 562 1 2380 20 22 1 2381 20 29 1 2382 28 48 1 2383 20 32 1 2384 20 31 1 2385 21 34 1 2386 22 37 1 2387 20 26 1 2388 24 80 1 2389 33 87 1 2390 20 23 1 2391 37 43 1 2392 20 31 1 2393 20 24 1 2394 21 35 1 2395 20 30 1 2396 20 47 1 2397 20 23 1 2398 20 25 1 2399 20 26 1 2400 20 24 1 2401 20 33 1 2402 20 25 1 2403 21 28 1 2404 23 44 1 2405 19 36 1 2406 20 25 1 2407 22 31 1 2408 20 25 1 2409 20 23 1 2410 20 24 1 2411 20 25 1 2412 20 23 1 2413 20 23 1 2414 20 24 1 2415 20 22 1 2416 20 23 1 2417 20 23 1 2418 29 52 1 2419 20 22 1 2420 20 31 1 2421 20 23 1 2422 24 45 1 2423 20 26 1 2424 20 32 1 2425 20 25 1 2426 20 26 1 2427 32 90 1 2428 33 136 1 2429 20 24 1 2430 20 32 1 2431 20 23 1 2432 22 46 1 2433 21 27 1 2434 20 25 1 2435 20 22 1 2436 23 49 1 2437 20 23 1 2438 21 33 1 2439 25 54 1 2440 20 22 1 2441 20 26 1 2442 21 27 1 2443 28 92 1 2444 31 46 1 2445 20 29 1 2446 20 25 1 2447 23 71 1 2448 21 45 1 2449 20 32 1 2450 20 28 1 2451 20 23 1 2452 23 83 1 2453 21 38 1 2454 23 55 1 2455 26 78 1 2456 20 27 1 2457 21 33 1 2458 27 76 1 2459 21 38 1 2460 22 58 1 2461 44 134 1 2462 260 1208 1 2463 20 24 1 2464 20 32 1 2465 20 45 1 2466 24 256 1 2467 20 24 1 2468 20 26 1 2469 20 23 1 2470 38 5004 1 2471 20 22 1 2472 20 27 1 2473 19 23 1 2474 24 71 1 2475 21 37 1 2476 38 54 1 2477 20 23 1 2478 22 97 1 2479 20 21 1 2480 22 53 1 2481 20 23 1 2482 38 113 1 2483 20 25 1 2484 20 33 1 2485 21 33 1 2486 47 254 1 2487 20 24 1 2488 20 22 1 2489 36 50 1 2490 20 27 1 2491 23 45 1 2492 20 24 1 2493 20 25 1 2494 20 40 1 2495 20 22 1 2496 20 23 1 2497 20 24 1 2498 25 99 1 2499 20 35 1 2500 22 52 1 2501 20 22 1 2502 28 56 1 2503 24 53 1 2504 23 40 1 2505 20 47 1 2506 20 31 1 2507 21 41 1 2508 20 24 1 2509 20 24 1 2510 22 47 1 2511 51 130 1 2512 24 35 1 2513 20 24 1 2514 37 233 1 2515 20 33 1 2516 21 25 1 2517 52 176 1 2518 20 33 1 2519 26 98 1 2520 20 25 1 2521 23 56 1 2522 20 28 1 2523 46 269 1 2524 20 25 1 2525 35 138 1 2526 20 22 1 2527 35 138 1 2528 20 23 1 2529 20 22 1 2530 20 23 1 2531 33 137 1 2532 25 82 1 2533 25 62 1 2534 21 44 1 2535 20 24 1 2536 20 25 1 2537 40 149 1 2538 20 25 1 2539 20 24 1 2540 20 25 1 2541 20 26 1 2542 48 212 1 2543 123 134 1 2544 21 34 1 2545 20 23 1 2546 30 95 1 2547 20 22 1 2548 20 42 1 2549 26 63 1 2550 21 64 1 2551 20 25 1 2552 20 34 1 2553 20 25 1 2554 20 23 1 2555 20 25 1 2556 20 25 1 2557 22 54 1 2558 20 29 1 2559 23 66 1 2560 20 23 1 2561 26 96 1 2562 20 31 1 2563 26 85 1 2564 20 33 1 2565 22 53 1 2566 20 23 1 2567 51 86 1 2568 21 28 1 2569 21 33 1 2570 29 70 1 2571 20 23 1 2572 25 239 1 2573 22 34 1 2574 20 25 1 2575 21 34 1 2576 22 44 1 2577 20 23 1 2578 26 119 1 2579 27 95 1 2580 22 40 1 2581 20 30 1 2582 20 41 1 2583 23 38 1 2584 21 26 1 2585 20 23 1 2586 20 37 1 2587 21 27 1 2588 21 71 1 2589 20 22 1 2590 23 63 1 2591 20 24 1 2592 20 49 1 2593 20 25 1 2594 20 24 1 2595 20 30 1 2596 27 129 1 2597 20 23 1 2598 23 104 1 2599 20 23 1 2600 20 27 1 2601 26 40 1 2602 152 1502 1 2603 417 2001 1 2604 157 88 1 2605 44 180 1 2606 20 43 1 2607 20 23 1 2608 201 517 1 2609 126 498 1 2610 21 40 1 2611 20 34 1 2612 134 508 1 2613 34 106 1 2614 47 171 1 2615 21 36 1 2616 33 186 1 2617 20 24 1 2618 29 50 1 2619 327 1870 1 2620 20 24 1 2621 111 547 1 2622 20 49 1 2623 46 93 1 2624 34 78 1 2625 84 365 1 2626 22 63 1 2627 20 44 1 2628 859 1709 1 2629 51 95 1 2630 133 421 1 2631 20 24 1 2632 123 321 1 2633 23 74 1 2634 20 42 1 2635 165 559 1 2636 20 25 1 2637 20 27 1 2638 36 83 1 2639 21 24 1 2640 44 264 1 2641 101 573 1 2642 33 49 1 2643 34 79 1 2644 97 1349 1 2645 148 762 1 2646 184 543 1 2647 40 86 1 2648 20 30 1 2649 73 132 1 2650 21 55 1 2651 20 27 1 2652 20 23 1 2653 20 26 1 2654 29 69 1 2655 29 52 1 2656 20 27 1 2657 34 91 1 2658 20 30 1 2659 44 139 1 2660 20 23 1 2661 139 470 1 2662 22 46 1 2663 121 351 1 2664 1564 9525 1 2665 20 23 1 2666 20 23 1 2667 20 20 1 2668 20 33 1 2669 20 21 1 2670 20 25 1 2671 25 34 1 2672 33 133 1 2673 20 48 1 2674 24 31 1 2675 122 338 1 2676 24 59 1 2677 22 58 1 2678 23 56 1 2679 21 47 1 2680 24 46 1 2681 30 61 1 2682 38 169 1 2683 26 89 1 2684 36 112 1 2685 20 24 1 2686 42 100 1 2687 21 47 1 2688 20 30 1 2689 20 30 1 2690 21 34 1 2691 24 46 1 2692 22 32 1 2693 21 31 1 2694 47 66 1 2695 20 24 1 2696 25 112 1 2697 21 53 1 2698 27 66 1 2699 24 46 1 2700 20 33 1 2701 20 26 1 2702 20 41 1 2703 22 31 1 2704 22 47 1 2705 33 158 1 2706 20 24 1 2707 20 25 1 2708 33 196 1 2709 43 160 1 2710 421 1791 1 2711 51 122 1 2712 43 97 1 2713 78 269 1 2714 20 44 1 2715 22 30 1 2716 25 63 1 2717 23 47 1 2718 20 29 1 2719 22 45 1 2720 23 37 1 2721 20 24 1 2722 21 29 1 2723 20 26 1 2724 33 139 1 2725 65 182 1 2726 26 80 1 2727 20 24 1 2728 25 75 1 2729 20 45 1 2730 34 121 1 2731 24 44 1 2732 25 69 1 2733 27 61 1 2734 28 99 1 2735 20 23 1 2736 22 69 1 2737 36 71 1 2738 32 65 1 2739 20 22 1 2740 20 22 1 2741 26 84 1 2742 20 29 1 2743 25 68 1 2744 30 113 1 2745 26 121 1 2746 21 38 1 2747 21 107 1 2748 249 1244 1 2749 50 101 1 2750 20 26 1 2751 21 52 1 2752 32 77 1 2753 24 67 1 2754 21 34 1 2755 24 42 1 2756 22 43 1 2757 22 49 1 2758 21 32 1 2759 28 49 1 2760 20 23 1 2761 39 222 1 2762 34 141 1 2763 20 24 1 2764 20 30 1 2765 20 25 1 2766 21 36 1 2767 49 332 1 2768 20 23 1 2769 27 64 1 2770 32 46 1 2771 27 145 1 2772 20 23 1 2773 20 27 1 2774 20 29 1 2775 77 360 1 2776 20 28 1 2777 43 125 1 2778 20 31 1 2779 29 68 1 2780 20 25 1 2781 20 23 1 2782 21 31 1 2783 47 174 1 2784 20 26 1 2785 24 49 1 2786 40 180 1 2787 20 25 1 2788 20 26 1 2789 22 42 1 2790 21 30 1 2791 28 37 1 2792 20 29 1 2793 61 384 1 2794 21 32 1 2795 50 307 1 2796 20 27 1 2797 21 47 1 2798 20 35 1 2799 20 24 1 2800 25 150 1 2801 20 25 1 2802 20 29 1 2803 20 24 1 2804 39 209 1 2805 20 33 1 2806 22 57 1 2807 21 27 1 2808 23 59 1 2809 29 109 1 2810 175 817 1 2811 20 25 1 2812 28 73 1 2813 20 30 1 2814 28 118 1 2815 22 65 1 2816 26 89 1 2817 93 561 1 2818 42 448 1 2819 20 26 1 2820 21 72 1 2821 21 36 1 2822 22 72 1 2823 21 82 1 2824 22 41 1 2825 20 38 1 2826 28 90 1 2827 25 111 1 2828 21 44 1 2829 22 34 1 2830 207 538 1 2831 20 29 1 2832 35 186 1 2833 23 104 1 2834 27 41 1 2835 22 74 1 2836 20 23 1 2837 20 23 1 2838 208 648 1 2839 64 361 1 2840 20 24 1 2841 21 48 1 2842 21 93 1 2843 22 41 1 2844 20 27 1 2845 20 30 1 2846 25 69 1 2847 20 24 1 2848 29 80 1 2849 31 95 1 2850 22 47 1 2851 21 27 1 2852 42 207 1 2853 22 44 1 2854 22 53 1 2855 20 23 1 2856 20 23 1 2857 20 71 1 2858 20 34 1 2859 20 33 1 2860 21 29 1 2861 23 129 1 2862 28 108 1 2863 23 67 1 2864 20 27 1 2865 21 40 1 2866 20 25 1 2867 24 50 1 2868 20 23 1 2869 57 216 1 2870 20 24 1 2871 20 26 1 2872 25 54 1 2873 20 25 1 2874 23 68 1 2875 20 54 1 2876 20 23 1 2877 32 123 1 2878 22 28 1 2879 20 33 1 2880 20 24 1 2881 27 55 1 2882 20 28 1 2883 24 82 1 2884 20 23 1 2885 220 915 1 2886 20 24 1 2887 137 1169 1 2888 20 22 1 2889 27 87 1 2890 23 37 1 2891 217 1549 1 2892 20 26 1 2893 21 31 1 2894 26 62 1 2895 31 62 1 2896 28 70 1 2897 27 74 1 2898 20 25 1 2899 25 77 1 2900 48 125 1 2901 34 78 1 2902 25 58 1 2903 24 53 1 2904 20 40 1 2905 21 36 1 2906 37 77 1 2907 56 172 1 2908 20 25 1 2909 20 24 1 2910 20 29 1 2911 24 53 1 2912 33 94 1 2913 20 46 1 2914 123 234 1 2915 22 80 1 2916 20 30 1 2917 20 26 1 2918 20 37 1 2919 20 30 1 2920 30 59 1 2921 84 721 1 2922 45 218 1 2923 715 4234 1 2924 20 36 1 2925 22 33 1 2926 24 43 1 2927 20 44 1 2928 96 149 1 2929 43 126 1 2930 1761 11416 1 2931 23 35 1 2932 23 41 1 2933 52 166 1 2934 167 804 1 2935 25 45 1 2936 1360 4875 1 2937 38 74 1 2938 73 361 1 2939 24 38 1 2940 20 34 1 2941 306 852 1 2942 21 34 1 2943 24 78 1 2944 21 34 1 2945 20 25 1 2946 35 88 1 2947 24 31 1 2948 20 23 1 2949 20 29 1 2950 20 42 1 2951 23 68 1 2952 24 60 1 2953 20 41 1 2954 20 22 1 2955 280 2038 1 2956 20 23 1 2957 42 108 1 2958 20 21 1 2959 28 51 1 2960 27 129 1 2961 21 59 1 2962 23 47 1 2963 20 27 1 2964 20 24 1 2965 20 30 1 2966 20 105 1 2967 20 23 1 2968 23 77 1 2969 21 44 1 2970 25 98 1 2971 20 22 1 2972 49 159 1 2973 26 60 1 2974 34 116 1 2975 24 48 1 2976 20 23 1 2977 21 32 1 2978 21 32 1 2979 22 52 1 2980 43 69 1 2981 20 27 1 2982 22 47 1 2983 20 31 1 2984 20 25 1 2985 20 25 1 2986 20 32 1 2987 22 51 1 2988 20 22 1 2989 20 24 1 2990 35 136 1 2991 20 23 1 2992 20 24 1 2993 29 56 1 2994 21 54 1 2995 20 28 1 2996 20 542 1 2997 20 28 1 2998 20 26 1 2999 43 195 1 3000 28 63 1 3001 22 75 1 3002 35 969 1 3003 60 137 1 3004 22 64 1 3005 86 220 1 3006 45 65 1 3007 21 82 1 3008 24 54 1 3009 20 23 1 3010 23 74 1 3011 23 44 1 3012 23 56 1 3013 20 23 1 3014 21 30 1 3015 72 697 1 3016 23 36 1 3017 20 23 1 3018 36 87 1 3019 37 113 1 3020 23 50 1 3021 108 185 1 3022 20 32 1 3023 30 76 1 3024 36 316 1 3025 21 27 1 3026 20 41 1 3027 21 44 1 3028 25 66 1 3029 21 44 1 3030 85 234 1 3031 21 32 1 3032 25 58 1 3033 21 60 1 3034 21 51 1 3035 23 73 1 3036 23 31 1 3037 21 29 1 3038 26 55 1 3039 22 41 1 3040 49 92 1 3041 219 921 1 3042 35 66 1 3043 25 112 1 3044 20 22 1 3045 24 87 1 3046 20 24 1 3047 22 55 1 3048 30 105 1 3049 34 96 1 3050 20 25 1 3051 20 23 1 3052 22 38 1 3053 24 39 1 3054 27 198 1 3055 21 42 1 3056 45 157 1 3057 20 31 1 3058 35 145 1 3059 28 113 1 3060 22 51 1 3061 23 52 1 3062 21 32 1 3063 28 67 1 3064 31 146 1 3065 29 121 1 3066 55 337 1 3067 20 29 1 3068 21 32 1 3069 20 25 1 3070 20 24 1 3071 74 1089 1 3072 21 33 1 3073 25 79 1 3074 20 25 1 3075 20 24 1 3076 22 89 1 3077 20 26 1 3078 21 44 1 3079 22 44 1 3080 41 135 1 3081 25 167 1 3082 32 1719 1 3083 24 44 1 3084 21 32 1 3085 20 24 1 3086 25 67 1 3087 20 22 1 3088 25 49 1 3089 27 69 1 3090 20 24 1 3091 24 89 1 3092 26 61 1 3093 20 25 1 3094 20 23 1 3095 21 36 1 3096 20 23 1 3097 34 47 1 3098 20 29 1 3099 37 168 1 3100 32 180 1 3101 121 283 1 3102 20 32 1 3103 202 357 1 3104 20 32 1 3105 44 88 1 3106 20 25 1 3107 31 59 1 3108 58 278 1 3109 34 179 1 3110 20 24 1 3111 21 26 1 3112 25 83 1 3113 21 37 1 3114 23 92 1 3115 20 24 1 3116 39 92 1 3117 20 38 1 3118 26 51 1 3119 102 818 1 3120 20 26 1 3121 21 264 1 3122 24 75 1 3123 20 37 1 3124 27 175 1 3125 22 43 1 3126 21 55 1 3127 401 3442 1 3128 22 29 1 3129 20 28 1 3130 20 23 1 3131 22 34 1 3132 30 121 1 3133 20 29 1 3134 34 158 1 3135 22 67 1 3136 31 92 1 3137 38 78 1 3138 20 22 1 3139 33 99 1 3140 20 30 1 3141 20 25 1 3142 21 33 1 3143 25 66 1 3144 31 34 1 3145 21 44 1 3146 45 539 1 3147 25 124 1 3148 20 25 1 3149 56 222 1 3150 20 25 1 3151 27 153 1 3152 36 69 1 3153 20 35 1 3154 37 178 1 3155 35 172 1 3156 35 33 1 3157 20 45 1 3158 22 51 1 3159 21 42 1 3160 25 140 1 3161 20 23 1 3162 43 118 1 3163 36 394 1 3164 26 146 1 3165 20 25 1 3166 36 136 1 3167 20 23 1 3168 37 137 1 3169 116 559 1 3170 40 149 1 3171 25 99 1 3172 20 23 1 3173 27 167 1 3174 21 33 1 3175 20 23 1 3176 28 95 1 3177 29 101 1 3178 34 295 1 3179 23 110 1 3180 203 1623 1 3181 20 24 1 3182 20 25 1 3183 20 37 1 3184 20 33 1 3185 20 37 1 3186 21 33 1 3187 45 101 1 3188 20 24 1 3189 70 190 1 3190 22 42 1 3191 20 54 1 3192 23 43 1 3193 21 56 1 3194 20 26 1 3195 20 22 1 3196 60 202 1 3197 20 25 1 3198 20 23 1 3199 39 109 1 3200 34 152 1 3201 27 94 1 3202 30 109 1 3203 20 48 1 3204 20 26 1 3205 32 95 1 3206 20 34 1 3207 246 1318 1 3208 20 33 1 3209 25 55 1 3210 20 38 1 3211 20 44 1 3212 458 1552 1 3213 1856 6335 1 3214 22 67 1 3215 20 32 1 3216 21 53 1 3217 27 84 1 3218 30 76 1 3219 23 46 1 3220 20 27 1 3221 21 50 1 3222 22 55 1 3223 558 2520 1 3224 36 79 1 3225 2685 13434 1 3226 25 66 1 3227 28 85 1 3228 20 24 1 3229 20 29 1 3230 21 68 1 3231 20 36 1 3232 49 141 1 3233 74 100 1 3234 93 699 1 3235 36 112 1 3236 20 28 1 3237 20 32 1 3238 20 36 1 3239 69 135 1 3240 20 26 1 3241 39 101 1 3242 179 713 1 3243 20 42 1 3244 41 147 1 3245 20 23 1 3246 22 31 1 3247 20 23 1 3248 20 37 1 3249 20 24 1 3250 117 951 1 3251 21 36 1 3252 24 68 1 3253 20 33 1 3254 20 29 1 3255 23 47 1 3256 21 48 1 3257 28 49 1 3258 24 64 1 3259 21 60 1 3260 21 48 1 3261 71 142 1 3262 63 176 1 3263 21 40 1 3264 20 26 1 3265 20 27 1 3266 20 31 1 3267 20 25 1 3268 21 74 1 3269 20 24 1 3270 23 28 1 3271 20 27 1 3272 21 129 1 3273 20 27 1 3274 21 42 1 3275 20 48 1 3276 20 34 1 3277 20 43 1 3278 23 66 1 3279 30 65 1 3280 50 162 1 3281 21 46 1 3282 20 24 1 3283 27 61 1 3284 20 29 1 3285 44 397 1 3286 20 27 1 3287 26 86 1 3288 32 93 1 3289 20 25 1 3290 43 125 1 3291 24 80 1 3292 20 53 1 3293 20 44 1 3294 23 52 1 3295 20 28 1 3296 20 24 1 3297 24 52 1 3298 34 120 1 3299 20 24 1 3300 20 23 1 3301 21 204 1 3302 72 318 1 3303 123 248 1 3304 23 68 1 3305 23 53 1 3306 20 29 1 3307 21 48 1 3308 49 259 1 3309 23 145 1 3310 20 32 1 3311 22 52 1 3312 20 25 1 3313 36 94 1 3314 21 57 1 3315 24 54 1 3316 21 31 1 3317 23 61 1 3318 25 54 1 3319 20 25 1 3320 22 27 1 3321 23 38 1 3322 25 66 1 3323 26 77 1 3324 56 245 1 3325 24 81 1 3326 33 82 1 3327 24 33 1 3328 26 80 1 3329 23 46 1 3330 35 72 1 3331 148 468 1 3332 72 319 1 3333 33 80 1 3334 20 22 1 3335 22 118 1 3336 30 51 1 3337 98 912 1 3338 20 24 1 3339 33 375 1 3340 21 40 1 3341 20 38 1 3342 43 199 1 3343 20 52 1 3344 20 31 1 3345 56 153 1 3346 47 110 1 3347 27 110 1 3348 20 23 1 3349 34 94 1 3350 20 23 1 3351 26 65 1 3352 20 27 1 3353 20 25 1 3354 20 36 1 3355 20 46 1 3356 20 23 1 3357 20 43 1 3358 20 26 1 3359 20 39 1 3360 43 113 1 3361 21 41 1 3362 67 359 1 3363 22 39 1 3364 34 69 1 3365 20 26 1 3366 23 60 1 3367 760 2214 1 3368 22 71 1 3369 447 792 1 3370 20 25 1 3371 21 49 1 3372 20 28 1 3373 20 26 1 3374 21 47 1 3375 24 150 1 3376 20 35 1 3377 129 608 1 3378 20 46 1 3379 29 98 1 3380 20 47 1 3381 304 981 1 3382 37 148 1 3383 29 89 1 3384 22 39 1 3385 20 27 1 3386 24 85 1 3387 20 22 1 3388 24 39 1 3389 21 41 1 3390 32 77 1 3391 23 63 1 3392 29 104 1 3393 29 39 1 3394 60 141 1 3395 22 47 1 3396 53 210 1 3397 35 114 1 3398 39 130 1 3399 40 45 1 3400 95 487 1 3401 26 51 1 3402 21 27 1 3403 22 50 1 3404 21 81 1 3405 20 27 1 3406 43 217 1 3407 20 25 1 3408 33 76 1 3409 20 30 1 3410 23 43 1 3411 20 30 1 3412 24 76 1 3413 33 272 1 3414 66 287 1 3415 31 34 1 3416 20 23 1 3417 22 47 1 3418 23 61 1 3419 34 112 1 3420 80 254 1 3421 25 56 1 3422 44 255 1 3423 32 414 1 3424 23 60 1 3425 20 24 1 3426 28 86 1 3427 21 81 1 3428 46 201 1 3429 22 79 1 3430 26 106 1 3431 24 55 1 3432 20 25 1 3433 21 40 1 3434 36 106 1 3435 23 109 1 3436 37 105 1 3437 28 106 1 3438 20 27 1 3439 26 110 1 3440 31 54 1 3441 20 24 1 3442 31 134 1 3443 24 53 1 3444 27 157 1 3445 21 55 1 3446 21 79 1 3447 20 98 1 3448 20 33 1 3449 23 45 1 3450 20 24 1 3451 34 169 1 3452 21 37 1 3453 34 180 1 3454 20 22 1 3455 76 517 1 3456 20 22 1 3457 49 200 1 3458 20 27 1 3459 23 50 1 3460 20 197 1 3461 34 793 1 3462 21 62 1 3463 29 102 1 3464 20 26 1 3465 22 30 1 3466 22 79 1 3467 25 46 1 3468 25 40 1 3469 166 1597 1 3470 142 687 1 3471 20 21 1 3472 20 34 1 3473 20 24 1 3474 20 24 1 3475 20 24 1 3476 20 26 1 3477 21 39 1 3478 20 25 1 3479 20 23 1 3480 20 34 1 3481 20 22 1 3482 21 29 1 3483 47 332 1 3484 25 62 1 3485 31 87 1 3486 234 934 1 3487 20 29 1 3488 20 23 1 3489 20 22 1 3490 20 23 1 3491 50 158 1 3492 66 97 1 3493 24 80 1 3494 100 608 1 3495 22 33 1 3496 38 130 1 3497 21 31 1 3498 26 171 1 3499 20 23 1 3500 20 40 1 3501 22 53 1 3502 22 48 1 3503 28 91 1 3504 20 24 1 3505 22 32 1 3506 20 54 1 3507 19 22 1 3508 24 70 1 3509 20 24 1 3510 128 1675 1 3511 20 41 1 3512 25 68 1 3513 20 42 1 3514 20 22 1 3515 20 25 1 3516 22 55 1 3517 25 85 1 3518 22 41 1 3519 21 67 1 3520 20 22 1 3521 26 70 1 3522 20 28 1 3523 20 23 1 3524 20 23 1 3525 20 27 1 3526 20 27 1 3527 27 93 1 3528 20 22 1 3529 29 64 1 3530 25 83 1 3531 21 43 1 3532 20 29 1 3533 24 39 1 3534 21 49 1 3535 20 26 1 3536 20 22 1 3537 20 33 1 3538 21 37 1 3539 21 36 1 3540 20 24 1 3541 20 30 1 3542 20 24 1 3543 20 26 1 3544 35 53 1 3545 27 79 1 3546 20 23 1 3547 21 46 1 3548 29 55 1 3549 20 24 1 3550 20 27 1 3551 20 24 1 3552 25 98 1 3553 20 26 1 3554 20 34 1 3555 21 41 1 3556 21 58 1 3557 20 23 1 3558 20 33 1 3559 20 21 1 3560 95 279 1 3561 20 23 1 3562 31 99 1 3563 20 35 1 3564 20 29 1 3565 20 27 1 3566 23 53 1 3567 20 30 1 3568 22 118 1 3569 20 38 1 3570 36 116 1 3571 52 223 1 3572 20 23 1 3573 28 76 1 3574 22 28 1 3575 20 22 1 3576 20 24 1 3577 37 186 1 3578 21 48 1 3579 200 454 1 3580 20 22 1 3581 20 24 1 3582 20 32 1 3583 20 23 1 3584 20 23 1 3585 20 26 1 3586 21 42 1 3587 20 27 1 3588 20 31 1 3589 20 23 1 3590 20 25 1 3591 20 25 1 3592 21 45 1 3593 20 22 1 3594 30 143 1 3595 20 23 1 3596 20 30 1 3597 20 23 1 3598 20 26 1 3599 22 48 1 3600 25 51 1 3601 20 27 1 3602 20 29 1 3603 20 22 1 3604 20 38 1 3605 20 25 1 3606 23 55 1 3607 20 23 1 3608 20 21 1 3609 47 230 1 3610 20 24 1 3611 20 32 1 3612 20 27 1 3613 21 26 1 3614 20 22 1 3615 20 26 1 3616 30 88 1 3617 20 32 1 3618 22 40 1 3619 20 24 1 3620 22 68 1 3621 20 27 1 3622 20 41 1 3623 20 31 1 3624 20 24 1 3625 27 94 1 3626 20 39 1 3627 34 135 1 3628 27 58 1 3629 20 50 1 3630 22 37 1 3631 21 36 1 3632 20 34 1 3633 34 128 1 3634 20 24 1 3635 66 130 1 3636 20 34 1 3637 80 389 1 3638 21 37 1 3639 20 37 1 3640 20 32 1 3641 20 22 1 3642 40 127 1 3643 20 54 1 3644 29 82 1 3645 41 103 1 3646 22 67 1 3647 20 28 1 3648 32 93 1 3649 21 48 1 3650 29 88 1 3651 37 257 1 3652 20 23 1 3653 20 27 1 3654 22 131 1 3655 128 910 1 3656 20 23 1 3657 1066 2215 1 3658 27 37 1 3659 20 24 1 3660 43 244 1 3661 20 26 1 3662 20 27 1 3663 20 26 1 3664 24 59 1 3665 20 32 1 3666 20 24 1 3667 20 22 1 3668 95 263 1 3669 20 23 1 3670 26 83 1 3671 20 23 1 3672 24 72 1 3673 20 30 1 3674 20 36 1 3675 20 28 1 3676 20 31 1 3677 26 54 1 3678 20 25 1 3679 51 248 1 3680 20 28 1 3681 31 84 1 3682 20 76 1 3683 33 51 1 3684 158 1205 1 3685 20 47 1 3686 21 36 1 3687 20 28 1 3688 20 25 1 3689 22 72 1 3690 21 36 1 3691 19 21 1 3692 20 34 1 3693 34 86 1 3694 20 23 1 3695 20 22 1 3696 20 34 1 3697 20 24 1 3698 20 28 1 3699 150 225 1 3700 20 23 1 3701 20 22 1 3702 35 68 1 3703 20 23 1 3704 23 121 1 3705 22 41 1 3706 26 61 1 3707 20 24 1 3708 20 23 1 3709 21 37 1 3710 20 24 1 3711 20 31 1 3712 22 22 1 3713 20 28 1 3714 20 23 1 3715 20 50 1 3716 20 21 1 3717 20 28 1 3718 20 54 1 3719 20 39 1 3720 28 44 1 3721 21 35 1 3722 20 24 1 3723 22 40 1 3724 21 33 1 3725 22 107 1 3726 20 33 1 3727 28 108 1 3728 21 37 1 3729 23 100 1 3730 20 25 1 3731 22 51 1 3732 25 112 1 3733 20 28 1 3734 21 47 1 3735 21 93 1 3736 32 148 1 3737 21 26 1 3738 21 35 1 3739 24 65 1 3740 20 34 1 3741 20 22 1 3742 23 47 1 3743 20 22 1 3744 20 72 1 3745 20 22 1 3746 21 137 1 3747 20 24 1 3748 106 640 1 3749 21 51 1 3750 21 38 1 3751 20 40 1 3752 60 397 1 3753 20 22 1 3754 20 27 1 3755 20 21 1 3756 23 61 1 3757 28 65 1 3758 130 1065 1 3759 342 1959 1 3760 21 37 1 3761 23 65 1 3762 21 32 1 3763 392 1128 1 3764 20 22 1 3765 21 30 1 3766 22 31 1 3767 21 64 1 3768 20 25 1 3769 20 23 1 3770 20 48 1 3771 27 69 1 3772 20 49 1 3773 20 22 1 3774 1393 5830 1 3775 215 1402 1 3776 20 24 1 3777 31 59 1 3778 100 952 1 3779 21 32 1 3780 21 48 1 3781 21 54 1 3782 27 79 1 3783 29 55 1 3784 21 34 1 3785 20 23 1 3786 20 33 1 3787 20 24 1 3788 20 26 1 3789 21 35 1 3790 28 92 1 3791 21 34 1 3792 22 62 1 3793 22 23 1 3794 22 58 1 3795 21 35 1 3796 21 28 1 3797 20 30 1 3798 20 36 1 3799 154 591 1 3800 20 30 1 3801 39 177 1 3802 32 80 1 3803 119 354 1 3804 27 104 1 3805 21 28 1 3806 21 35 1 3807 20 28 1 3808 20 24 1 3809 20 24 1 3810 28 173 1 3811 20 25 1 3812 29 47 1 3813 22 32 1 3814 20 30 1 3815 20 37 1 3816 28 122 1 3817 21 29 1 3818 20 288 1 3819 26 45 1 3820 695 4576 1 3821 20 22 1 3822 785 5359 1 3823 20 22 1 3824 26 74 1 3825 20 23 1 3826 21 26 1 3827 20 26 1 3828 20 30 1 3829 28 53 1 3830 78 294 1 3831 21 55 1 3832 24 48 1 3833 29 199 1 3834 28 65 1 3835 25 61 1 3836 44 66 1 3837 30 132 1 3838 26 95 1 3839 29 95 1 3840 23 54 1 3841 24 59 1 3842 46 153 1 3843 21 44 1 3844 20 24 1 3845 20 27 1 3846 21 41 1 3847 21 78 1 3848 20 24 1 3849 22 41 1 3850 38 121 1 3851 23 76 1 3852 26 72 1 3853 20 22 1 3854 21 47 1 3855 35 81 1 3856 21 41 1 3857 22 38 1 3858 20 25 1 3859 24 43 1 3860 20 26 1 3861 20 23 1 3862 25 172 1 3863 22 33 1 3864 100 100 1 3865 20 23 1 3866 25 47 1 3867 22 36 1 3868 48 167 1 3869 21 71 1 3870 23 49 1 3871 32 264 1 3872 21 38 1 3873 31 100 1 3874 24 65 1 3875 20 28 1 3876 22 42 1 3877 21 30 1 3878 29 59 1 3879 24 74 1 3880 20 33 1 3881 23 49 1 3882 20 27 1 3883 22 41 1 3884 20 24 1 3885 21 51 1 3886 56 215 1 3887 25 94 1 3888 23 86 1 3889 86 257 1 3890 20 23 1 3891 25 56 1 3892 20 29 1 3893 20 24 1 3894 23 50 1 3895 29 31 1 3896 21 32 1 3897 20 35 1 3898 20 34 1 3899 20 25 1 3900 21 35 1 3901 20 24 1 3902 20 26 1 3903 22 38 1 3904 20 32 1 3905 20 45 1 3906 20 26 1 3907 24 32 1 3908 35 176 1 3909 60 129 1 3910 20 32 1 3911 20 24 1 3912 59 491 1 3913 28 73 1 3914 21 23 1 3915 21 37 1 3916 22 66 1 3917 44 244 1 3918 20 23 1 3919 21 50 1 3920 20 50 1 3921 25 90 1 3922 20 24 1 3923 23 60 1 3924 20 34 1 3925 21 31 1 3926 20 27 1 3927 76 263 1 3928 29 95 1 3929 20 23 1 3930 20 22 1 3931 20 23 1 3932 24 85 1 3933 21 87 1 3934 29 54 1 3935 29 112 1 3936 23 63 1 3937 20 27 1 3938 24 47 1 3939 55 149 1 3940 20 42 1 3941 54 156 1 3942 20 31 1 3943 65 303 1 3944 20 32 1 3945 27 57 1 3946 20 35 1 3947 22 53 1 3948 20 25 1 3949 21 69 1 3950 22 58 1 3951 21 25 1 3952 20 24 1 3953 20 27 1 3954 23 65 1 3955 27 147 1 3956 20 31 1 3957 21 37 1 3958 20 24 1 3959 23 51 1 3960 28 81 1 3961 20 25 1 3962 22 34 1 3963 20 28 1 3964 20 23 1 3965 20 32 1 3966 61 152 1 3967 20 30 1 3968 28 70 1 3969 20 23 1 3970 22 27 1 3971 24 32 1 3972 23 60 1 3973 21 40 1 3974 28 153 1 3975 20 38 1 3976 20 25 1 3977 23 64 1 3978 21 52 1 3979 21 53 1 3980 26 68 1 3981 20 29 1 3982 26 90 1 3983 20 28 1 3984 35 100 1 3985 22 31 1 3986 68 74 1 3987 20 24 1 3988 62 202 1 3989 28 119 1 3990 49 271 1 3991 21 30 1 3992 46 99 1 3993 20 32 1 3994 26 107 1 3995 20 29 1 3996 20 23 1 3997 34 209 1 3998 23 49 1 3999 22 61 1 4000 22 71 1 4001 25 85 1 4002 20 31 1 4003 23 38 1 4004 21 34 1 4005 22 47 1 4006 26 44 1 4007 20 23 1 4008 20 49 1 4009 20 23 1 4010 31 83 1 4011 24 40 1 4012 21 86 1 4013 67 377 1 4014 20 37 1 4015 22 32 1 4016 24 37 1 4017 22 51 1 4018 22 81 1 4019 20 32 1 4020 20 31 1 4021 20 55 1 4022 29 92 1 4023 27 202 1 4024 20 23 1 4025 20 24 1 4026 22 68 1 4027 20 37 1 4028 27 174 1 4029 21 60 1 4030 30 130 1 4031 23 113 1 4032 20 33 1 4033 22 31 1 4034 20 22 1 4035 22 102 1 4036 996 8426 1 4037 21 41 1 4038 20 24 1 4039 20 70 1 4040 22 62 1 4041 21 68 1 4042 20 24 1 4043 20 49 1 4044 20 22 1 4045 26 88 1 4046 20 30 1 4047 152 1325 1 4048 21 29 1 4049 20 28 1 4050 20 23 1 4051 20 45 1 4052 20 32 1 4053 20 31 1 4054 20 23 1 4055 154 904 1 4056 33 618 1 4057 21 31 1 4058 20 23 1 4059 20 25 1 4060 20 40 1 4061 20 31 1 4062 28 89 1 4063 20 31 1 4064 22 41 1 4065 30 49 1 4066 20 30 1 4067 95 648 1 4068 22 49 1 4069 39 185 1 4070 21 63 1 4071 28 64 1 4072 20 48 1 4073 21 27 1 4074 100 783 1 4075 93 315 1 4076 45 443 1 4077 20 27 1 4078 25 61 1 4079 22 39 1 4080 105 941 1 4081 21 33 1 4082 20 24 1 4083 24 40 1 4084 20 48 1 4085 20 28 1 4086 21 40 1 4087 20 24 1 4088 20 313 1 4089 23 61 1 4090 21 45 1 4091 20 40 1 4092 20 40 1 4093 21 39 1 4094 20 36 1 4095 20 24 1 4096 20 42 1 4097 20 26 1 4098 21 44 1 4099 24 83 1 4100 20 25 1 4101 20 23 1 4102 20 23 1 4103 24 51 1 4104 22 45 1 4105 20 43 1 4106 20 25 1 4107 45 127 1 4108 25 110 1 4109 21 36 1 4110 24 55 1 4111 21 33 1 4112 27 207 1 4113 20 38 1 4114 20 23 1 4115 35 98 1 4116 29 80 1 4117 26 48 1 4118 21 40 1 4119 20 25 1 4120 21 65 1 4121 20 23 1 4122 28 110 1 4123 65 311 1 4124 24 45 1 4125 21 30 1 4126 20 25 1 4127 25 43 1 4128 66 221 1 4129 20 32 1 4130 20 23 1 4131 27 39 1 4132 20 32 1 4133 20 33 1 4134 21 35 1 4135 23 72 1 4136 20 44 1 4137 20 22 1 4138 31 121 1 4139 20 24 1 4140 34 120 1 4141 20 30 1 4142 31 49 1 4143 20 23 1 4144 20 23 1 4145 20 23 1 4146 21 33 1 4147 21 33 1 4148 23 69 1 4149 37 168 1 4150 23 81 1 4151 20 28 1 4152 20 29 1 4153 20 262 1 4154 20 24 1 4155 20 22 1 4156 20 25 1 4157 20 24 1 4158 20 47 1 4159 20 26 1 4160 20 25 1 4161 65 681 1 4162 29 50 1 4163 20 24 1 4164 20 24 1 4165 20 23 1 4166 21 53 1 4167 20 25 1 4168 20 27 1 4169 20 91 1 4170 21 43 1 4171 30 79 1 4172 46 139 1 4173 20 24 1 4174 21 38 1 4175 25 105 1 4176 22 44 1 4177 26 108 1 4178 53 84 1 4179 124 361 1 4180 20 24 1 4181 28 32 1 4182 20 52 1 4183 21 27 1 4184 21 33 1 4185 22 52 1 4186 71 421 1 4187 21 40 1 4188 20 25 1 4189 20 25 1 4190 47 112 1 4191 20 25 1 4192 24 23 1 4193 25 69 1 4194 20 27 1 4195 31 136 1 4196 23 63 1 4197 20 26 1 4198 24 78 1 4199 33 140 1 4200 35 70 1 4201 20 23 1 4202 20 34 1 4203 39 185 1 4204 43 250 1 4205 20 35 1 4206 20 22 1 4207 40 91 1 4208 41 55 1 4209 25 125 1 4210 30 154 1 4211 27 56 1 4212 21 42 1 4213 22 28 1 4214 27 71 1 4215 20 23 1 4216 21 46 1 4217 60 485 1 4218 23 56 1 4219 22 45 1 4220 20 31 1 4221 20 50 1 4222 21 32 1 4223 56 202 1 4224 32 215 1 4225 35 101 1 4226 26 60 1 4227 147 309 1 4228 36 53 1 4229 27 137 1 4230 21 33 1 4231 20 23 1 4232 46 247 1 4233 35 225 1 4234 21 50 1 4235 21 37 1 4236 34 408 1 4237 21 47 1 4238 55 258 1 4239 26 321 1 4240 62 314 1 4241 31 57 1 4242 72 279 1 4243 20 23 1 4244 22 28 1 4245 20 22 1 4246 20 24 1 4247 20 25 1 4248 21 35 1 4249 20 24 1 4250 22 69 1 4251 22 37 1 4252 20 24 1 4253 22 44 1 4254 20 27 1 4255 26 97 1 4256 21 36 1 4257 21 97 1 4258 24 81 1 4259 22 102 1 4260 20 23 1 4261 27 73 1 4262 27 54 1 4263 20 25 1 4264 20 24 1 4265 23 73 1 4266 20 118 1 4267 75 478 1 4268 22 42 1 4269 33 225 1 4270 27 99 1 4271 21 26 1 4272 20 25 1 4273 20 29 1 4274 20 45 1 4275 80 625 1 4276 38 140 1 4277 20 226 1 4278 20 41 1 4279 20 82 1 4280 21 69 1 4281 21 29 1 4282 32 137 1 4283 379 3177 1 4284 22 28 1 4285 20 42 1 4286 20 24 1 4287 26 54 1 4288 21 33 1 4289 20 25 1 4290 20 29 1 4291 22 80 1 4292 20 28 1 4293 33 26 1 4294 20 24 1 4295 26 94 1 4296 21 33 1 4297 23 58 1 4298 20 24 1 4299 24 93 1 4300 20 24 1 4301 56 187 1 4302 20 24 1 4303 25 101 1 4304 29 99 1 4305 27 120 1 4306 20 31 1 4307 20 34 1 4308 28 104 1 4309 32 256 1 4310 23 174 1 4311 23 62 1 4312 20 45 1 4313 82 224 1 4314 21 42 1 4315 21 23 1 4316 20 75 1 4317 20 115 1 4318 20 25 1 4319 20 24 1 4320 26 64 1 4321 24 42 1 4322 26 156 1 4323 43 103 1 4324 30 40 1 4325 22 74 1 4326 21 178 1 4327 21 26 1 4328 26 46 1 4329 21 23 1 4330 43 270 1 4331 21 35 1 4332 36 326 1 4333 20 24 1 4334 31 79 1 4335 24 71 1 4336 98 793 1 4337 20 22 1 4338 20 24 1 4339 20 24 1 4340 20 24 1 4341 106 246 1 4342 20 40 1 4343 21 39 1 4344 20 36 1 4345 20 37 1 4346 21 48 1 4347 20 36 1 4348 23 59 1 4349 23 53 1 4350 20 28 1 4351 20 22 1 4352 90 260 1 4353 20 23 1 4354 20 23 1 4355 20 121 1 4356 20 47 1 4357 20 26 1 4358 73 258 1 4359 45 129 1 4360 20 33 1 4361 20 50 1 4362 20 42 1 4363 20 39 1 4364 37 124 1 4365 20 26 1 4366 128 710 1 4367 20 31 1 4368 20 32 1 4369 20 31 1 4370 27 130 1 4371 21 40 1 4372 20 23 1 4373 20 24 1 4374 20 29 1 4375 21 44 1 4376 20 34 1 4377 20 35 1 4378 20 43 1 4379 21 40 1 4380 20 33 1 4381 20 51 1 4382 33 104 1 4383 62 558 1 4384 20 25 1 4385 20 29 1 4386 25 68 1 4387 20 30 1 4388 20 24 1 4389 20 23 1 4390 20 23 1 4391 22 63 1 4392 41 103 1 4393 23 59 1 4394 20 31 1 4395 23 70 1 4396 20 37 1 4397 24 65 1 4398 116 617 1 4399 20 24 1 4400 20 25 1 4401 20 21 1 4402 88 606 1 4403 20 23 1 4404 20 34 1 4405 32 204 1 4406 25 54 1 4407 20 23 1 4408 20 27 1 4409 26 110 1 4410 22 33 1 4411 36 122 1 4412 37 208 1 4413 68 469 1 4414 48 136 1 4415 20 35 1 4416 20 38 1 4417 33 290 1 4418 29 135 1 4419 21 35 1 4420 20 30 1 4421 20 24 1 4422 34 118 1 4423 20 29 1 4424 20 35 1 4425 75 424 1 4426 28 46 1 4427 20 36 1 4428 20 29 1 4429 89 298 1 4430 316 2991 1 4431 21 62 1 4432 20 25 1 4433 20 27 1 4434 20 27 1 4435 20 38 1 4436 23 48 1 4437 21 55 1 4438 26 80 1 4439 20 23 1 4440 22 37 1 4441 20 22 1 4442 20 23 1 4443 20 23 1 4444 69 690 1 4445 22 36 1 4446 24 38 1 4447 32 180 1 4448 20 43 1 4449 21 36 1 4450 20 29 1 4451 20 24 1 4452 25 109 1 4453 20 23 1 4454 20 24 1 4455 20 36 1 4456 37 84 1 4457 20 64 1 4458 28 234 1 4459 27 86 1 4460 20 24 1 4461 22 42 1 4462 20 28 1 4463 56 173 1 4464 20 43 1 4465 26 94 1 4466 21 35 1 4467 20 27 1 4468 20 24 1 4469 39 92 1 4470 20 25 1 4471 35 122 1 4472 20 28 1 4473 20 23 1 4474 20 22 1 4475 21 41 1 4476 20 23 1 4477 48 116 1 4478 20 25 1 4479 20 56 1 4480 21 35 1 4481 27 64 1 4482 87 297 1 4483 23 54 1 4484 22 38 1 4485 21 1230 1 4486 23 93 1 4487 21 56 1 4488 20 24 1 4489 20 28 1 4490 20 26 1 4491 20 23 1 4492 20 23 1 4493 27 73 1 4494 29 141 1 4495 20 23 1 4496 20 42 1 4497 25 62 1 4498 20 44 1 4499 46 189 1 4500 20 34 1 4501 27 104 1 4502 20 25 1 4503 35 269 1 4504 23 60 1 4505 22 78 1 4506 20 23 1 4507 20 25 1 4508 20 24 1 4509 24 63 1 4510 26 63 1 4511 23 89 1 4512 20 24 1 4513 20 26 1 4514 20 35 1 4515 20 46 1 4516 20 72 1 4517 53 263 1 4518 20 32 1 4519 43 124 1 4520 20 26 1 4521 27 69 1 4522 28 86 1 4523 20 23 1 4524 22 35 1 4525 20 47 1 4526 21 28 1 4527 24 34 1 4528 20 36 1 4529 21 33 1 4530 21 32 1 4531 21 55 1 4532 20 34 1 4533 54 297 1 4534 22 55 1 4535 28 131 1 4536 24 46 1 4537 20 25 1 4538 20 25 1 4539 20 33 1 4540 87 919 1 4541 21 66 1 4542 35 94 1 4543 20 23 1 4544 44 151 1 4545 20 25 1 4546 29 243 1 4547 20 33 1 4548 20 33 1 4549 20 30 1 4550 24 68 1 4551 21 54 1 4552 25 101 1 4553 21 32 1 4554 26 40 1 4555 22 40 1 4556 54 284 1 4557 20 26 1 4558 20 35 1 4559 22 67 1 4560 36 129 1 4561 25 128 1 4562 93 280 1 4563 22 70 1 4564 34 195 1 4565 21 42 1 4566 20 34 1 4567 22 61 1 4568 20 32 1 4569 71 353 1 4570 21 27 1 4571 20 26 1 4572 30 110 1 4573 21 35 1 4574 20 55 1 4575 20 25 1 4576 23 114 1 4577 22 44 1 4578 30 118 1 4579 20 24 1 4580 22 41 1 4581 22 42 1 4582 21 41 1 4583 20 32 1 4584 21 54 1 4585 20 26 1 4586 21 29 1 4587 22 54 1 4588 20 23 1 4589 25 30 1 4590 20 52 1 4591 22 105 1 4592 26 163 1 4593 20 33 1 4594 24 83 1 4595 27 177 1 4596 21 50 1 4597 20 28 1 4598 24 47 1 4599 23 54 1 4600 21 45 1 4601 22 82 1 4602 20 27 1 4603 20 27 1 4604 20 26 1 4605 24 74 1 4606 20 25 1 4607 20 24 1 4608 20 22 1 4609 20 31 1 4610 22 49 1 4611 20 36 1 4612 20 22 1 4613 20 27 1 4614 55 344 1 4615 20 37 1 4616 20 26 1 4617 32 187 1 4618 20 26 1 4619 21 41 1 4620 26 79 1 4621 26 66 1 4622 20 24 1 4623 20 23 1 4624 20 23 2 1 560 5832 2 2 86 344 2 3 28 124 2 4 256 1618 2 5 24 99 2 6 25 205 2 7 29 118 2 8 23 77 2 9 3932 33656 2 10 26 93 2 11 1212 3860 2 12 25 147 2 13 27 86 2 14 431 1958 2 15 23 125 2 16 25 164 2 17 33 134 2 18 91 263 2 19 23 37 2 20 21 39 2 21 209 1946 2 22 31 110 2 23 23 79 2 24 120 895 2 25 36 146 2 26 29 103 2 27 763 3054 2 28 22 74 2 29 24 66 2 30 23 93 2 31 22 94 2 32 24 120 2 33 436 3426 2 34 33 77 2 35 21 43 2 36 20 80 2 37 22 51 2 38 25 89 2 39 25 75 2 40 24 53 2 41 35 140 2 42 83 268 2 43 46 364 2 44 33 164 2 45 41 217 2 46 45 302 2 47 20 49 2 48 23 123 2 49 24 60 2 50 29 106 2 51 21 42 2 52 32 99 2 53 56 161 2 54 38 111 2 55 65 257 2 56 36 101 2 57 31 85 2 58 36 115 2 59 24 59 2 60 137 522 2 61 37 70 2 62 66 180 2 63 2996 19561 2 64 23 28 2 65 1959 14740 2 66 22 38 2 67 22 57 2 68 21 33 2 69 54 328 2 70 115 420 2 71 24 51 2 72 25 63 2 73 67 281 2 74 23 42 2 75 24 39 2 76 57 286 2 77 53 169 2 78 30 93 2 79 50 236 2 80 27 77 2 81 25 55 2 82 27 80 2 83 22 29 2 84 27 56 2 85 29 140 2 86 23 57 2 87 21 45 2 88 57 302 2 89 22 46 2 90 23 45 2 91 24 59 2 92 43 193 2 93 29 112 2 94 22 46 2 95 22 71 2 96 27 41 2 97 24 48 2 98 141 225 2 99 24 44 2 100 36 280 2 101 24 60 2 102 36 55 2 103 24 50 2 104 23 39 2 105 24 52 2 106 29 108 2 107 23 50 2 108 24 70 2 109 25 68 2 110 74 235 2 111 25 59 2 112 59 222 2 113 29 50 2 114 855 3437 2 115 42 49 2 116 50 324 2 117 58 264 2 118 28 61 2 119 28 71 2 120 23 35 2 121 53 301 2 122 24 40 2 123 25 52 2 124 27 104 2 125 23 52 2 126 44 149 2 127 20 31 2 128 160 395 2 129 28 48 2 130 23 72 2 131 33 258 2 132 36 391 2 133 1529 7035 2 134 20 39 2 135 37 145 2 136 36 154 2 137 75 271 2 138 28 119 2 139 80 529 2 140 56 193 2 141 252 972 2 142 27 108 2 143 28 243 2 144 22 76 2 145 23 97 2 146 127 219 2 147 43 178 2 148 30 83 2 149 34 118 2 150 45 420 2 151 69 231 2 152 37 130 2 153 25 43 2 154 22 48 2 155 33 86 2 156 29 56 2 157 38 133 2 158 238 785 2 159 33 135 2 160 23 71 2 161 31 121 2 162 34 70 2 163 34 62 2 164 185 693 2 165 26 83 2 166 54 288 2 167 23 73 2 168 217 646 2 169 38 317 2 170 60 124 2 171 35 162 2 172 25 66 2 173 43 157 2 174 70 386 2 175 26 95 2 176 168 415 2 177 25 44 2 178 23 79 2 179 68 273 2 180 30 87 2 181 66 66 2 182 22 48 2 183 24 114 2 184 23 35 2 185 23 49 2 186 38 131 2 187 83 193 2 188 77 154 2 189 34 78 2 190 23 61 2 191 59 121 2 192 31 70 2 193 96 242 2 194 33 116 2 195 23 74 2 196 26 95 2 197 24 53 2 198 114 922 2 199 110 641 2 200 174 3536 2 201 26 125 2 202 22 31 2 203 35 116 2 204 115 274 2 205 24 48 2 206 51 198 2 207 122 207 2 208 23 93 2 209 177 853 2 210 241 1778 2 211 22 32 2 212 30 57 2 213 69 198 2 214 47 120 2 215 51 307 2 216 83 353 2 217 88 671 2 218 44 165 2 219 58 90 2 220 120 305 2 221 70 784 2 222 29 78 2 223 25 71 2 224 33 147 2 225 28 62 2 226 283 1513 2 227 21 34 2 228 44 178 2 229 29 45 2 230 28 75 2 231 30 97 2 232 28 60 2 233 24 42 2 234 93 364 2 235 23 35 2 236 24 69 2 237 22 30 2 238 192 439 2 239 31 89 2 240 30 74 2 241 39 88 2 242 45 122 2 243 107 309 2 244 63 257 2 245 24 65 2 246 38 157 2 247 37 118 2 248 34 110 2 249 62 305 2 250 30 137 2 251 102 536 2 252 24 43 2 253 23 70 2 254 52 334 2 255 24 59 2 256 52 151 2 257 28 96 2 258 42 149 2 259 36 137 2 260 44 209 2 261 40 123 2 262 25 73 2 263 29 121 2 264 26 53 2 265 43 171 2 266 126 486 2 267 31 54 2 268 38 57 2 269 34 130 2 270 21 45 2 271 111 355 2 272 44 143 2 273 22 32 2 274 22 29 2 275 43 111 2 276 92 320 2 277 22 29 2 278 22 28 2 279 151 492 2 280 59 958 2 281 48 322 2 282 23 32 2 283 22 36 2 284 23 31 2 285 223 674 2 286 23 28 2 287 51 203 2 288 30 86 2 289 43 46 2 290 424 4353 2 291 281 934 2 292 6169 13641 2 293 27 122 2 294 33 122 2 295 31 123 2 296 47 203 2 297 36 126 2 298 79 253 2 299 25 55 2 300 109 518 2 301 740 1979 2 302 91 360 2 303 61 270 2 304 23 90 2 305 25 46 2 306 24 138 2 307 154 732 2 308 23 34 2 309 22 35 2 310 34 178 2 311 43 213 2 312 113 691 2 313 31 105 2 314 109 286 2 315 796 5356 2 316 24 86 2 317 26 116 2 318 2298 13464 2 319 24 48 2 320 46 147 2 321 30 95 2 322 27 82 2 323 4805 12221 2 324 27 35 2 325 30 77 2 326 24 38 2 327 29 71 2 328 28 93 2 329 27 94 2 330 38 73 2 331 46 162 2 332 23 115 2 333 78 335 2 334 2096 8518 2 335 29 59 2 336 72 194 2 337 23 57 2 338 146 1098 2 339 29 129 2 340 41 180 2 341 55 230 2 342 22 38 2 343 32 138 2 344 26 64 2 345 64 386 2 346 21 50 2 347 40 170 2 348 169 940 2 349 31 62 2 350 29 112 2 351 42 114 2 352 111 400 2 353 25 33 2 354 47 172 2 355 24 26 2 356 27 41 2 357 23 29 2 358 30 60 2 359 52 389 2 360 38 135 2 361 24 48 2 362 59 129 2 363 64 98 2 364 114 333 2 365 30 45 2 366 26 74 2 367 26 33 2 368 36 122 2 369 25 60 2 370 57 205 2 371 1399 1566 2 372 37 89 2 373 24 57 2 374 22 82 2 375 68 275 2 376 24 92 2 377 23 51 2 378 54 204 2 379 24 37 2 380 31 107 2 381 136 678 2 382 45 228 2 383 28 93 2 384 69 494 2 385 145 985 2 386 27 50 2 387 34 101 2 388 41 129 2 389 28 73 2 390 241 1026 2 391 24 83 2 392 29 73 2 393 45 91 2 394 32 91 2 395 171 441 2 396 44 137 2 397 36 117 2 398 94 700 2 399 60 100 2 400 35 98 2 401 33 150 2 402 27 70 2 403 23 40 2 404 286 1238 2 405 33 58 2 406 41 150 2 407 301 845 2 408 78 974 2 409 22 52 2 410 23 39 2 411 24 51 2 412 277 577 2 413 144 686 2 414 143 231 2 415 28 90 2 416 27 53 2 417 48 158 2 418 23 43 2 419 373 580 2 420 22 62 2 421 39 128 2 422 21 55 2 423 29 92 2 424 199 1557 2 425 25 46 2 426 37 87 2 427 62 378 2 428 346 1664 2 429 80 522 2 430 39 85 2 431 33 128 2 432 39 137 2 433 160 432 2 434 296 830 2 435 177 608 2 436 27 36 2 437 123 178 2 438 23 60 2 439 52 147 2 440 81 333 2 441 31 84 2 442 30 84 2 443 23 45 2 444 26 62 2 445 60 100 2 446 28 44 2 447 53 167 2 448 38 121 2 449 46 187 2 450 33 80 2 451 26 47 2 452 23 32 2 453 510 2191 2 454 31 54 2 455 375 681 2 456 42 228 2 457 34 38 2 458 31 41 2 459 46 200 2 460 32 104 2 461 439 3309 2 462 25 57 2 463 70 379 2 464 24 56 2 465 68 354 2 466 24 36 2 467 34 53 2 468 119 431 2 469 24 41 2 470 35 160 2 471 25 73 2 472 28 45 2 473 54 133 2 474 74 354 2 475 31 57 2 476 38 93 2 477 35 146 2 478 28 70 2 479 35 103 2 480 24 71 2 481 205 885 2 482 24 42 2 483 22 179 2 484 27 80 2 485 31 62 2 486 25 54 2 487 25 62 2 488 29 63 2 489 34 90 2 490 26 45 2 491 27 570 2 492 48 227 2 493 39 106 2 494 64 522 2 495 21 37 2 496 219 809 2 497 23 41 2 498 31 165 2 499 36 153 2 500 83 820 2 501 56 209 2 502 208 1174 2 503 81 331 2 504 46 311 2 505 43 276 2 506 22 39 2 507 27 131 2 508 29 48 2 509 199 46 2 510 29 396 2 511 27 55 2 512 37 120 2 513 280 1753 2 514 118 616 2 515 46 444 2 516 259 902 2 517 93 525 2 518 49 250 2 519 55 172 2 520 67 126 2 521 46 114 2 522 29 56 2 523 389 2282 2 524 695 2057 2 525 29 43 2 526 27 44 2 527 85 336 2 528 23 41 2 529 30 111 2 530 28 54 2 531 75 185 2 532 28 79 2 533 36 207 2 534 21 116 2 535 48 342 2 536 23 37 2 537 136 555 2 538 109 302 2 539 43 534 2 540 157 848 2 541 35 112 2 542 64 226 2 543 24 44 2 544 233 1197 2 545 26 53 2 546 164 1123 2 547 166 1151 2 548 25 32 2 549 59 113 2 550 71 166 2 551 61 139 2 552 67 655 2 553 43 149 2 554 24 40 2 555 32 55 2 556 38 54 2 557 27 97 2 558 84 246 2 559 218 1049 2 560 28 88 2 561 102 528 2 562 24 39 2 563 69 326 2 564 55 92 2 565 438 1784 2 566 124 808 2 567 110 903 2 568 31 71 2 569 23 37 2 570 30 61 2 571 46 289 2 572 24 37 2 573 117 1068 2 574 22 40 2 575 46 361 2 576 24 85 2 577 58 325 2 578 41 35 2 579 874 8417 2 580 24 74 2 581 30 204 2 582 738 5663 2 583 6429 25366 2 584 27 44 2 585 23 124 2 586 27 186 2 587 26 80 2 588 1434 4428 2 589 70 618 2 590 25 200 2 591 25 213 2 592 26 173 2 593 70 270 2 594 26 51 2 595 29 121 2 596 25 63 2 597 25 36 2 598 29 2017 2 599 65 202 2 600 26 68 2 601 96 393 2 602 51 365 2 603 27 182 2 604 28 181 2 605 34 142 2 606 525 1742 2 607 24 45 2 608 46 259 2 609 88 209 2 610 27 106 2 611 120 522 2 612 33 73 2 613 25 44 2 614 26 120 2 615 32 130 2 616 25 69 2 617 40 143 2 618 43 227 2 619 28 103 2 620 58 154 2 621 52 116 2 622 8219 35068 2 623 3493 19617 2 624 7650 37855 2 625 26 47 2 626 26 86 2 627 92 334 2 628 105 268 2 629 24 33 2 630 44 197 2 631 50 170 2 632 88 242 2 633 32 88 2 634 36 109 2 635 24 49 2 636 25 46 2 637 23 47 2 638 27 82 2 639 41 139 2 640 30 93 2 641 42 623 2 642 24 32 2 643 5940 27533 2 644 25 34 2 645 191 298 2 646 22 32 2 647 52 134 2 648 89 260 2 649 51 253 2 650 36 66 2 651 44 148 2 652 30 58 2 653 23 31 2 654 34 72 2 655 96 508 2 656 40 126 2 657 74 427 2 658 366 1342 2 659 165 298 2 660 41 143 2 661 28 64 2 662 23 46 2 663 30 65 2 664 24 40 2 665 27 122 2 666 24 77 2 667 78 221 2 668 41 139 2 669 27 53 2 670 113 466 2 671 676 12359 2 672 41 95 2 673 22 52 2 674 25 49 2 675 46 138 2 676 24 42 2 677 23 36 2 678 24 81 2 679 29 117 2 680 24 37 2 681 22 36 2 682 25 32 2 683 45 182 2 684 28 89 2 685 32 58 2 686 108 434 2 687 21 44 2 688 30 84 2 689 34 192 2 690 77 180 2 691 38 62 2 692 40 302 2 693 44 146 2 694 75 180 2 695 53 245 2 696 27 79 2 697 27 81 2 698 29 81 2 699 22 39 2 700 25 51 2 701 45 78 2 702 44 115 2 703 101 260 2 704 30 62 2 705 24 44 2 706 56 161 2 707 23 38 2 708 46 291 2 709 71 188 2 710 29 80 2 711 139 342 2 712 25 61 2 713 22 39 2 714 196 5408 2 715 46 65 2 716 23 41 2 717 117 606 2 718 83 301 2 719 23 43 2 720 30 75 2 721 26 44 2 722 41 123 2 723 44 193 2 724 134 1707 2 725 40 196 2 726 54 218 2 727 43 112 2 728 29 81 2 729 98 220 2 730 249 1399 2 731 140 202 2 732 84 1280 2 733 70 187 2 734 142 875 2 735 79 296 2 736 455 918 2 737 24 56 2 738 80 207 2 739 25 39 2 740 84 183 2 741 70 219 2 742 124 234 2 743 63 116 2 744 93 471 2 745 25 42 2 746 126 57 2 747 167 706 2 748 119 571 2 749 67 186 2 750 76 163 2 751 92 528 2 752 179 771 2 753 104 641 2 754 110 754 2 755 47 248 2 756 25 133 2 757 27 118 2 758 54 342 2 759 115 329 2 760 27 157 2 761 26 92 2 762 37 94 2 763 92 557 2 764 52 157 2 765 34 87 2 766 645 2661 2 767 26 63 2 768 366 304 2 769 253 6024 2 770 28 144 2 771 26 85 2 772 66 537 2 773 23 32 2 774 84 522 2 775 24 50 2 776 62 497 2 777 113 855 2 778 3729 11035 2 779 24 44 2 780 100 494 2 781 28 223 2 782 415 1182 2 783 158 591 2 784 70 361 2 785 68 164 2 786 49 207 2 787 377 1278 2 788 24 91 2 789 170 168 2 790 23 39 2 791 311 826 2 792 28 98 2 793 112 520 2 794 50 130 2 795 234 828 2 796 471 5096 2 797 24 36 2 798 67 279 2 799 42 166 2 800 75 283 2 801 64 599 2 802 86 366 2 803 54 503 2 804 138 299 2 805 25 38 2 806 26 44 2 807 24 52 2 808 22 133 2 809 52 119 2 810 25 47 2 811 37 67 2 812 88 322 2 813 46 89 2 814 60 188 2 815 89 266 2 816 72 364 2 817 28 69 2 818 71 393 2 819 65 132 2 820 34 117 2 821 81 666 2 822 37 134 2 823 21 46 2 824 27 98 2 825 150 548 2 826 55 181 2 827 109 786 2 828 29 149 2 829 27 50 2 830 38 57 2 831 80 234 2 832 43 284 2 833 65 114 2 834 74 269 2 835 526 1067 2 836 22 151 2 837 94 222 2 838 104 589 2 839 256 1214 2 840 68 346 2 841 22 36 2 842 60 170 2 843 74 405 2 844 79 459 2 845 50 364 2 846 286 933 2 847 141 544 2 848 32 93 2 849 93 390 2 850 34 110 2 851 32 52 2 852 145 587 2 853 22 87 2 854 103 173 2 855 25 111 2 856 23 78 2 857 25 49 2 858 193 2117 2 859 23 29 2 860 34 104 2 861 32 48 2 862 60 275 2 863 25 46 2 864 54 100 2 865 22 84 2 866 60 515 2 867 25 68 2 868 704 6419 2 869 24 73 2 870 71 189 2 871 25 89 2 872 29 113 2 873 71 262 2 874 37 205 2 875 25 200 2 876 1643 30147 2 877 32 173 2 878 35 174 2 879 21 71 2 880 63 183 2 881 34 132 2 882 23 56 2 883 22 39 2 884 38 101 2 885 25 84 2 886 24 46 2 887 24 108 2 888 33 121 2 889 25 166 2 890 23 54 2 891 3221 12682 2 892 35 62 2 893 63 258 2 894 74 351 2 895 95 293 2 896 5522 18104 2 897 40 178 2 898 374 4194 2 899 23 119 2 900 39 108 2 901 56 287 2 902 25 43 2 903 25 122 2 904 23 62 2 905 49 205 2 906 30 147 2 907 40 277 2 908 680 3809 2 909 26 51 2 910 25 190 2 911 41 131 2 912 22 59 2 913 23 90 2 914 52 618 2 915 2142 10789 2 916 72 329 2 917 52 196 2 918 23 36 2 919 34 147 2 920 58 319 2 921 93 444 2 922 84 279 2 923 41 191 2 924 2621 9528 2 925 41 183 2 926 30 104 2 927 51 100 2 928 345 1980 2 929 31 142 2 930 54 220 2 931 24 47 2 932 26 67 2 933 24 34 2 934 29 50 2 935 24 31 2 936 34 146 2 937 28 136 2 938 89 190 2 939 73 314 2 940 41 197 2 941 43 155 2 942 24 44 2 943 478 929 2 944 23 44 2 945 61 313 2 946 44 99 2 947 50 296 2 948 69 279 2 949 43 215 2 950 48 158 2 951 23 108 2 952 35 133 2 953 64 245 2 954 44 204 2 955 22 236 2 956 37 153 2 957 262 787 2 958 26 84 2 959 127 416 2 960 25 141 2 961 25 118 2 962 110 405 2 963 45 221 2 964 56 255 2 965 59 245 2 966 52 225 2 967 25 126 2 968 51 153 2 969 245 1205 2 970 77 396 2 971 34 109 2 972 109 734 2 973 23 137 2 974 199 626 2 975 71 317 2 976 113 642 2 977 37 145 2 978 32 168 2 979 25 150 2 980 52 350 2 981 49 479 2 982 73 248 2 983 44 245 2 984 136 352 2 985 35 327 2 986 71 484 2 987 44 177 2 988 31 143 2 989 45 2685 2 990 1245 1718 2 991 55 238 2 992 27 80 2 993 108 864 2 994 28 63 2 995 161 154 2 996 40 189 2 997 35 161 2 998 35 196 2 999 37 338 2 1000 24 111 2 1001 23 66 2 1002 43 143 2 1003 30 308 2 1004 217 406 2 1005 91 300 2 1006 24 368 2 1007 40 132 2 1008 27 145 2 1009 26 55 2 1010 408 721 2 1011 52 286 2 1012 27 175 2 1013 43 232 2 1014 24 226 2 1015 22 74 2 1016 23 74 2 1017 143 876 2 1018 56 256 2 1019 299 11588 2 1020 36 63 2 1021 27 76 2 1022 55 209 2 1023 23 44 2 1024 30 112 2 1025 94 537 2 1026 31 93 2 1027 32 467 2 1028 37 138 2 1029 73 502 2 1030 26 113 2 1031 25 110 2 1032 24 72 2 1033 34 90 2 1034 72 290 2 1035 58 171 2 1036 23 66 2 1037 735 3860 2 1038 26 83 2 1039 171 329 2 1040 30 95 2 1041 29 151 2 1042 27 71 2 1043 49 172 2 1044 43 124 2 1045 42 178 2 1046 26 123 2 1047 26 162 2 1048 112 286 2 1049 42 139 2 1050 34 157 2 1051 85 373 2 1052 48 278 2 1053 23 89 2 1054 54 333 2 1055 64 156 2 1056 47 68 2 1057 23 44 2 1058 24 105 2 1059 288 2210 2 1060 32 123 2 1061 30 55 2 1062 32 89 2 1063 87 564 2 1064 42 212 2 1065 776 6516 2 1066 31 178 2 1067 31 157 2 1068 143 904 2 1069 1488 6478 2 1070 24 98 2 1071 210 1161 2 1072 489 6846 2 1073 32 54 2 1074 47 292 2 1075 25 57 2 1076 24 31 2 1077 95 389 2 1078 33 90 2 1079 24 63 2 1080 53 1182 2 1081 54 152 2 1082 65 2655 2 1083 179 1370 2 1084 40 198 2 1085 23 64 2 1086 45 176 2 1087 29 175 2 1088 54 105 2 1089 31 76 2 1090 31 43 2 1091 29 78 2 1092 40 75 2 1093 37 155 2 1094 270 408 2 1095 22 58 2 1096 55 154 2 1097 54 1089 2 1098 152 1213 2 1099 28 89 2 1100 24 149 2 1101 51 173 2 1102 132 756 2 1103 32 89 2 1104 92 368 2 1105 30 70 2 1106 178 899 2 1107 24 188 2 1108 62 367 2 1109 46 288 2 1110 49 159 2 1111 37 161 2 1112 25 65 2 1113 32 204 2 1114 77 265 2 1115 61 211 2 1116 35 172 2 1117 37 159 2 1118 24 73 2 1119 117 696 2 1120 23 97 2 1121 94 632 2 1122 54 269 2 1123 74 284 2 1124 54 235 2 1125 108 656 2 1126 141 671 2 1127 65 306 2 1128 87 501 2 1129 77 120 2 1130 218 866 2 1131 75 556 2 1132 46 286 2 1133 65 385 2 1134 22 89 2 1135 30 74 2 1136 71 419 2 1137 37 111 2 1138 22 51 2 1139 22 38 2 1140 23 32 2 1141 38 96 2 1142 23 35 2 1143 373 931 2 1144 23 34 2 1145 34 137 2 1146 25 41 2 1147 63 222 2 1148 63 111 2 1149 99 366 2 1150 23 56 2 1151 183 437 2 1152 25 60 2 1153 38 181 2 1154 36 100 2 1155 24 64 2 1156 24 64 2 1157 1031 6692 2 1158 208 366 2 1159 339 563 2 1160 2967 8813 2 1161 1042 3010 2 1162 24 83 2 1163 4374 19841 2 1164 41 135 2 1165 48 199 2 1166 25 211 2 1167 27 150 2 1168 28 56 2 1169 29 70 2 1170 26 67 2 1171 22 41 2 1172 35 127 2 1173 92 310 2 1174 195 361 2 1175 23 43 2 1176 238 2959 2 1177 25 73 2 1178 22 46 2 1179 38 118 2 1180 490 2187 2 1181 23 162 2 1182 36 105 2 1183 34 116 2 1184 24 63 2 1185 23 137 2 1186 23 67 2 1187 28 81 2 1188 3251 8787 2 1189 31 83 2 1190 22 123 2 1191 23 28 2 1192 81 342 2 1193 23 34 2 1194 26 79 2 1195 24 81 2 1196 37 172 2 1197 33 94 2 1198 36 202 2 1199 26 70 2 1200 994 3566 2 1201 24 88 2 1202 36 106 2 1203 34 102 2 1204 23 40 2 1205 65 481 2 1206 64 542 2 1207 24 58 2 1208 26 49 2 1209 61 160 2 1210 72 127 2 1211 22 34 2 1212 62 165 2 1213 462 3156 2 1214 21 34 2 1215 34 131 2 1216 47 184 2 1217 210 372 2 1218 23 44 2 1219 38 140 2 1220 38 116 2 1221 37 135 2 1222 34 82 2 1223 22 38 2 1224 23 30 2 1225 53 160 2 1226 23 52 2 1227 25 93 2 1228 42 175 2 1229 26 119 2 1230 23 89 2 1231 23 40 2 1232 47 139 2 1233 43 124 2 1234 29 90 2 1235 29 79 2 1236 1611 8655 2 1237 104 318 2 1238 28 75 2 1239 25 53 2 1240 43 143 2 1241 68 284 2 1242 83 338 2 1243 20 47 2 1244 151 392 2 1245 22 38 2 1246 26 90 2 1247 24 35 2 1248 25 82 2 1249 27 115 2 1250 22 106 2 1251 26 69 2 1252 36 58 2 1253 25 45 2 1254 32 103 2 1255 21 33 2 1256 40 123 2 1257 23 43 2 1258 21 41 2 1259 25 48 2 1260 24 48 2 1261 78 147 2 1262 21 41 2 1263 65 293 2 1264 21 33 2 1265 23 52 2 1266 20 91 2 1267 24 45 2 1268 29 77 2 1269 22 46 2 1270 73 175 2 1271 28 77 2 1272 22 79 2 1273 32 114 2 1274 2380 17182 2 1275 22 60 2 1276 23 32 2 1277 24 86 2 1278 140 681 2 1279 21 33 2 1280 35 96 2 1281 25 64 2 1282 44 311 2 1283 30 85 2 1284 25 55 2 1285 22 29 2 1286 29 56 2 1287 29 86 2 1288 215 350 2 1289 24 62 2 1290 22 43 2 1291 34 124 2 1292 26 53 2 1293 31 127 2 1294 26 67 2 1295 37 84 2 1296 96 335 2 1297 33 160 2 1298 25 37 2 1299 46 177 2 1300 22 33 2 1301 37 177 2 1302 35 65 2 1303 24 43 2 1304 51 185 2 1305 28 124 2 1306 25 89 2 1307 36 182 2 1308 76 192 2 1309 32 53 2 1310 30 55 2 1311 21 48 2 1312 127 1035 2 1313 69 354 2 1314 63 260 2 1315 38 135 2 1316 36 116 2 1317 115 582 2 1318 35 113 2 1319 21 53 2 1320 46 147 2 1321 51 304 2 1322 20 44 2 1323 82 399 2 1324 41 112 2 1325 1412 3030 2 1326 23 42 2 1327 35 142 2 1328 337 2309 2 1329 22 35 2 1330 50 205 2 1331 21 36 2 1332 43 143 2 1333 38 121 2 1334 62 118 2 1335 26 72 2 1336 34 68 2 1337 38 89 2 1338 41 99 2 1339 24 59 2 1340 43 128 2 1341 35 102 2 1342 55 305 2 1343 29 81 2 1344 24 98 2 1345 39 160 2 1346 23 38 2 1347 22 30 2 1348 44 226 2 1349 24 56 2 1350 47 117 2 1351 64 193 2 1352 62 192 2 1353 35 88 2 1354 68 247 2 1355 28 64 2 1356 79 743 2 1357 23 55 2 1358 37 104 2 1359 25 33 2 1360 21 42 2 1361 53 178 2 1362 37 159 2 1363 35 138 2 1364 34 105 2 1365 85 222 2 1366 84 434 2 1367 146 495 2 1368 27 79 2 1369 25 70 2 1370 209 864 2 1371 24 798 2 1372 22 48 2 1373 30 103 2 1374 29 77 2 1375 40 113 2 1376 22 37 2 1377 20 45 2 1378 24 84 2 1379 24 112 2 1380 48 273 2 1381 25 75 2 1382 26 61 2 1383 21 33 2 1384 40 84 2 1385 23 41 2 1386 64 70 2 1387 25 80 2 1388 64 222 2 1389 22 39 2 1390 27 54 2 1391 23 38 2 1392 35 186 2 1393 21 34 2 1394 45 70 2 1395 303 945 2 1396 25 46 2 1397 22 44 2 1398 22 64 2 1399 27 81 2 1400 35 103 2 1401 53 262 2 1402 30 58 2 1403 34 108 2 1404 28 119 2 1405 42 571 2 1406 31 60 2 1407 35 119 2 1408 24 148 2 1409 25 239 2 1410 22 51 2 1411 141 477 2 1412 44 188 2 1413 22 47 2 1414 28 59 2 1415 66 224 2 1416 26 70 2 1417 26 113 2 1418 25 65 2 1419 24 109 2 1420 24 39 2 1421 61 377 2 1422 60 374 2 1423 56 70 2 1424 63 271 2 1425 35 192 2 1426 33 83 2 1427 179 746 2 1428 32 68 2 1429 28 71 2 1430 43 118 2 1431 35 69 2 1432 60 590 2 1433 23 36 2 1434 27 75 2 1435 24 34 2 1436 60 336 2 1437 32 85 2 1438 36 158 2 1439 24 36 2 1440 286 412 2 1441 27 84 2 1442 45 137 2 1443 25 43 2 1444 78 227 2 1445 32 92 2 1446 833 5788 2 1447 191 760 2 1448 22 43 2 1449 58 226 2 1450 48 123 2 1451 2788 11435 2 1452 80 893 2 1453 24 89 2 1454 62 385 2 1455 42 146 2 1456 260 2570 2 1457 1817 8639 2 1458 30 63 2 1459 43 134 2 1460 69 363 2 1461 24 28 2 1462 34 84 2 1463 173 709 2 1464 26 59 2 1465 29 73 2 1466 50 314 2 1467 24 67 2 1468 1069 3099 2 1469 84 292 2 1470 27 116 2 1471 71 288 2 1472 435 1222 2 1473 71 198 2 1474 71 795 2 1475 71 310 2 1476 553 2274 2 1477 42 72 2 1478 53 229 2 1479 32 90 2 1480 22 27 2 1481 28 78 2 1482 24 35 2 1483 180 419 2 1484 113 297 2 1485 533 3206 2 1486 79 254 2 1487 29 100 2 1488 31 101 2 1489 25 81 2 1490 145 493 2 1491 81 516 2 1492 29 56 2 1493 24 71 2 1494 24 117 2 1495 1588 7020 2 1496 24 27 2 1497 90 221 2 1498 62 285 2 1499 23 42 2 1500 31 105 2 1501 77 155 2 1502 25 64 2 1503 36 123 2 1504 24 511 2 1505 27 64 2 1506 329 983 2 1507 27 59 2 1508 27 56 2 1509 24 36 2 1510 64 381 2 1511 23 32 2 1512 263 696 2 1513 24 31 2 1514 77 177 2 1515 42 350 2 1516 21 30 2 1517 54 164 2 1518 123 529 2 1519 118 736 2 1520 28 62 2 1521 31 136 2 1522 25 27 2 1523 41 163 2 1524 279 772 2 1525 23 35 2 1526 59 238 2 1527 29 63 2 1528 40 134 2 1529 23 51 2 1530 37 127 2 1531 27 158 2 1532 25 58 2 1533 61 213 2 1534 23 37 2 1535 25 33 2 1536 23 36 2 1537 663 1892 2 1538 68 790 2 1539 50 2033 2 1540 98 476 2 1541 27 67 2 1542 79 795 2 1543 37 281 2 1544 24 37 2 1545 32 107 2 1546 53 340 2 1547 486 2590 2 1548 187 842 2 1549 32 68 2 1550 87 94 2 1551 30 102 2 1552 153 129 2 1553 31 97 2 1554 66 319 2 1555 27 50 2 1556 34 80 2 1557 24 44 2 1558 26 59 2 1559 42 180 2 1560 33 93 2 1561 76 124 2 1562 63 202 2 1563 37 109 2 1564 182 766 2 1565 59 454 2 1566 53 289 2 1567 31 93 2 1568 52 223 2 1569 43 135 2 1570 24 53 2 1571 25 51 2 1572 30 135 2 1573 1127 2268 2 1574 147 1089 2 1575 115 514 2 1576 34 84 2 1577 46 85 2 1578 28 112 2 1579 32 148 2 1580 23 39 2 1581 27 97 2 1582 32 3506 2 1583 72 237 2 1584 48 196 2 1585 23 30 2 1586 72 163 2 1587 75 309 2 1588 78 371 2 1589 61 288 2 1590 35 64 2 1591 28 75 2 1592 37 65 2 1593 63 325 2 1594 28 79 2 1595 144 764 2 1596 24 121 2 1597 27 58 2 1598 437 895 2 1599 24 49 2 1600 62 433 2 1601 43 150 2 1602 124 413 2 1603 110 671 2 1604 29 101 2 1605 95 321 2 1606 52 120 2 1607 47 170 2 1608 47 145 2 1609 1717 2838 2 1610 26 31 2 1611 186 908 2 1612 90 559 2 1613 182 470 2 1614 34 194 2 1615 28 76 2 1616 27 71 2 1617 22 45 2 1618 31 48 2 1619 46 273 2 1620 23 43 2 1621 54 274 2 1622 28 94 2 1623 29 70 2 1624 23 30 2 1625 34 118 2 1626 29 115 2 1627 239 706 2 1628 23 38 2 1629 324 1704 2 1630 33 93 2 1631 762 3195 2 1632 105 743 2 1633 27 52 2 1634 29 118 2 1635 22 34 2 1636 25 47 2 1637 166 695 2 1638 25 49 2 1639 21 30 2 1640 21 36 2 1641 36 126 2 1642 27 98 2 1643 43 147 2 1644 48 84 2 1645 32 59 2 1646 23 39 2 1647 36 85 2 1648 47 129 2 1649 24 41 2 1650 52 252 2 1651 69 221 2 1652 351 1959 2 1653 225 976 2 1654 34 67 2 1655 23 82 2 1656 333 246 2 1657 30 49 2 1658 247 755 2 1659 23 97 2 1660 54 402 2 1661 28 54 2 1662 351 1164 2 1663 43 286 2 1664 35 106 2 1665 77 320 2 1666 135 893 2 1667 61 356 2 1668 58 160 2 1669 101 1055 2 1670 1601 3104 2 1671 23 47 2 1672 317 1565 2 1673 27 51 2 1674 91 446 2 1675 23 47 2 1676 22 64 2 1677 64 407 2 1678 53 318 2 1679 45 220 2 1680 28 206 2 1681 25 45 2 1682 713 2592 2 1683 23 43 2 1684 27 39 2 1685 42 167 2 1686 127 322 2 1687 51 187 2 1688 40 193 2 1689 31 55 2 1690 182 644 2 1691 159 301 2 1692 67 510 2 1693 29 127 2 1694 30 118 2 1695 24 41 2 1696 26 78 2 1697 28 58 2 1698 25 62 2 1699 59 273 2 1700 25 79 2 1701 122 453 2 1702 33 132 2 1703 48 277 2 1704 28 77 2 1705 81 632 2 1706 36 138 2 1707 104 550 2 1708 52 247 2 1709 122 1228 2 1710 344 839 2 1711 35 73 2 1712 23 37 2 1713 25 52 2 1714 30 58 2 1715 33 91 2 1716 49 237 2 1717 31 95 2 1718 23 31 2 1719 48 207 2 1720 21 30 2 1721 41 371 2 1722 29 72 2 1723 52 246 2 1724 46 443 2 1725 39 175 2 1726 22 30 2 1727 204 528 2 1728 224 3497 2 1729 142 638 2 1730 29 36 2 1731 27 51 2 1732 43 496 2 1733 44 325 2 1734 67 259 2 1735 1316 8969 2 1736 23 59 2 1737 257 781 2 1738 25 44 2 1739 27 55 2 1740 41 45 2 1741 30 56 2 1742 36 114 2 1743 39 164 2 1744 31 110 2 1745 23 38 2 1746 25 49 2 1747 23 36 2 1748 27 46 2 1749 74 270 2 1750 31 96 2 1751 42 101 2 1752 28 51 2 1753 24 37 2 1754 45 205 2 1755 55 210 2 1756 563 4541 2 1757 69 379 2 1758 24 76 2 1759 301 787 2 1760 32 130 2 1761 26 42 2 1762 8197 63485 2 1763 35 81 2 1764 25 83 2 1765 58 86 2 1766 337 715 2 1767 63 171 2 1768 32 79 2 1769 27 174 2 1770 29 74 2 1771 28 56 2 1772 42 414 2 1773 44 175 2 1774 338 934 2 1775 23 40 2 1776 1998 17638 2 1777 54 184 2 1778 26 82 2 1779 51 193 2 1780 24 50 2 1781 212 2098 2 1782 228 352 2 1783 171 737 2 1784 32 158 2 1785 23 31 2 1786 27 69 2 1787 33 57 2 1788 90 395 2 1789 67 213 2 1790 34 114 2 1791 67 177 2 1792 28 50 2 1793 150 285 2 1794 62 255 2 1795 125 242 2 1796 40 120 2 1797 73 267 2 1798 52 193 2 1799 35 163 2 1800 92 261 2 1801 398 4508 2 1802 24 28 2 1803 214 303 2 1804 27 39 2 1805 41 137 2 1806 30 72 2 1807 27 78 2 1808 53 440 2 1809 118 392 2 1810 100 662 2 1811 35 198 2 1812 32 92 2 1813 26 71 2 1814 26 54 2 1815 44 140 2 1816 45 290 2 1817 25 63 2 1818 26 65 2 1819 240 633 2 1820 122 1602 2 1821 42 99 2 1822 334 1690 2 1823 105 464 2 1824 46 142 2 1825 38 197 2 1826 33 104 2 1827 24 37 2 1828 72 172 2 1829 87 241 2 1830 185 332 2 1831 28 63 2 1832 401 1506 2 1833 27 97 2 1834 33 75 2 1835 24 78 2 1836 26 51 2 1837 23 37 2 1838 30 48 2 1839 26 54 2 1840 22 36 2 1841 99 299 2 1842 38 126 2 1843 28 68 2 1844 26 51 2 1845 32 61 2 1846 27 81 2 1847 85 139 2 1848 55 90 2 1849 93 406 2 1850 70 173 2 1851 44 241 2 1852 23 46 2 1853 25 56 2 1854 26 64 2 1855 24 46 2 1856 21 36 2 1857 63 301 2 1858 40 177 2 1859 181 1143 2 1860 26 39 2 1861 30 344 2 1862 22 45 2 1863 30 41 2 1864 43 134 2 1865 90 479 2 1866 38 120 2 1867 49 372 2 1868 31 48 2 1869 87 243 2 1870 527 2725 2 1871 30 149 2 1872 36 393 2 1873 138 419 2 1874 34 89 2 1875 78 110 2 1876 112 202 2 1877 36 86 2 1878 35 90 2 1879 49 159 2 1880 33 84 2 1881 52 80 2 1882 35 205 2 1883 26 55 2 1884 80 376 2 1885 35 115 2 1886 136 821 2 1887 43 135 2 1888 27 65 2 1889 39 63 2 1890 86 452 2 1891 53 272 2 1892 35 115 2 1893 27 47 2 1894 23 94 2 1895 76 186 2 1896 24 46 2 1897 171 828 2 1898 217 1011 2 1899 102 626 2 1900 47 571 2 1901 460 4835 2 1902 25 77 2 1903 108 140 2 1904 32 38 2 1905 51 312 2 1906 137 364 2 1907 26 70 2 1908 111 312 2 1909 221 721 2 1910 33 119 2 1911 36 79 2 1912 61 381 2 1913 28 69 2 1914 61 159 2 1915 33 41 2 1916 24 42 2 1917 65 1052 2 1918 34 61 2 1919 27 46 2 1920 47 627 2 1921 77 377 2 1922 28 76 2 1923 58 138 2 1924 181 621 2 1925 29 216 2 1926 40 92 2 1927 72 255 2 1928 34 120 2 1929 35 45 2 1930 61 541 2 1931 52 260 2 1932 54 234 2 1933 24 56 2 1934 202 122 2 1935 25 38 2 1936 355 164 2 1937 26 58 2 1938 81 274 2 1939 730 2620 2 1940 63 235 2 1941 94 840 2 1942 119 579 2 1943 58 185 2 1944 30 77 2 1945 102 765 2 1946 132 618 2 1947 21 39 2 1948 30 79 2 1949 37 80 2 1950 89 145 2 1951 27 153 2 1952 25 57 2 1953 25 45 2 1954 438 1141 2 1955 193 587 2 1956 88 420 2 1957 32 110 2 1958 60 99 2 1959 50 581 2 1960 158 472 2 1961 24 36 2 1962 429 1095 2 1963 26 38 2 1964 26 57 2 1965 31 69 2 1966 29 185 2 1967 30 52 2 1968 28 112 2 1969 28 76 2 1970 105 148 2 1971 62 258 2 1972 48 528 2 1973 443 3059 2 1974 73 238 2 1975 72 539 2 1976 60 287 2 1977 28 88 2 1978 52 498 2 1979 39 187 2 1980 51 155 2 1981 52 1879 2 1982 47 106 2 1983 66 450 2 1984 22 34 2 1985 129 1390 2 1986 22 43 2 1987 132 447 2 1988 52 385 2 1989 58 150 2 1990 60 769 2 1991 98 905 2 1992 75 739 2 1993 25 61 2 1994 23 36 2 1995 40 182 2 1996 36 438 2 1997 169 1015 2 1998 42 100 2 1999 2248 26323 2 2000 33 396 2 2001 64 246 2 2002 53 229 2 2003 109 181 2 2004 97 167 2 2005 25 104 2 2006 83 222 2 2007 43 62 2 2008 248 559 2 2009 25 31 2 2010 93 590 2 2011 27 30 2 2012 228 1417 2 2013 40 92 2 2014 75 760 2 2015 319 347 2 2016 103 512 2 2017 268 1523 2 2018 24 43 2 2019 26 43 2 2020 58 348 2 2021 21 45 2 2022 83 609 2 2023 45 108 2 2024 720 5999 2 2025 22 41 2 2026 77 270 2 2027 33 88 2 2028 973 3079 2 2029 51 233 2 2030 97 269 2 2031 22 93 2 2032 24 82 2 2033 153 678 2 2034 24 121 2 2035 25 87 2 2036 28 107 2 2037 28 111 2 2038 62 127 2 2039 22 32 2 2040 31 87 2 2041 22 33 2 2042 24 50 2 2043 37 214 2 2044 37 170 2 2045 27 90 2 2046 36 103 2 2047 25 108 2 2048 4113 19264 2 2049 27 71 2 2050 52 190 2 2051 5894 36736 2 2052 26 117 2 2053 25 49 2 2054 35 141 2 2055 80 667 2 2056 40 105 2 2057 25 40 2 2058 23 53 2 2059 35 96 2 2060 31 92 2 2061 23 43 2 2062 47 167 2 2063 23 103 2 2064 80 293 2 2065 23 95 2 2066 33 226 2 2067 26 124 2 2068 24 165 2 2069 22 57 2 2070 93 545 2 2071 26 81 2 2072 94 252 2 2073 22 53 2 2074 24 33 2 2075 52 199 2 2076 36 57 2 2077 20 76 2 2078 22 43 2 2079 62 179 2 2080 23 40 2 2081 143 653 2 2082 289 1658 2 2083 36 116 2 2084 28 157 2 2085 29 166 2 2086 516 2887 2 2087 22 36 2 2088 37 164 2 2089 22 32 2 2090 155 943 2 2091 22 37 2 2092 56 1004 2 2093 57 271 2 2094 56 212 2 2095 117 453 2 2096 77 248 2 2097 347 1640 2 2098 45 183 2 2099 231 2646 2 2100 454 2330 2 2101 47 173 2 2102 78 551 2 2103 40 227 2 2104 28 91 2 2105 93 660 2 2106 26 143 2 2107 21 50 2 2108 22 56 2 2109 25 44 2 2110 35 127 2 2111 31 105 2 2112 41 110 2 2113 194 951 2 2114 75 163 2 2115 31 126 2 2116 44 508 2 2117 319 1212 2 2118 125 290 2 2119 46 794 2 2120 104 487 2 2121 50 215 2 2122 39 187 2 2123 26 77 2 2124 165 684 2 2125 423 2168 2 2126 82 174 2 2127 27 180 2 2128 22 35 2 2129 47 443 2 2130 55 150 2 2131 37 290 2 2132 22 56 2 2133 40 125 2 2134 31 135 2 2135 21 184 2 2136 49 286 2 2137 90 523 2 2138 45 201 2 2139 61 184 2 2140 62 229 2 2141 32 110 2 2142 26 144 2 2143 27 2405 2 2144 73 101 2 2145 87 282 2 2146 33 95 2 2147 34 143 2 2148 21 56 2 2149 220 793 2 2150 127 522 2 2151 580 2226 2 2152 25 144 2 2153 172 850 2 2154 25 183 2 2155 58 441 2 2156 30 84 2 2157 31 62 2 2158 46 294 2 2159 72 254 2 2160 98 385 2 2161 61 184 2 2162 24 62 2 2163 35 136 2 2164 22 76 2 2165 220 408 2 2166 84 117 2 2167 584 3187 2 2168 28 158 2 2169 47 357 2 2170 70 579 2 2171 270 1452 2 2172 36 212 2 2173 58 430 2 2174 50 409 2 2175 25 32 2 2176 26 54 2 2177 35 85 2 2178 27 44 2 2179 72 433 2 2180 26 44 2 2181 31 128 2 2182 22 72 2 2183 89 560 2 2184 46 257 2 2185 36 329 2 2186 82 242 2 2187 341 4017 2 2188 71 250 2 2189 134 672 2 2190 152 494 2 2191 132 609 2 2192 26 59 2 2193 31 127 2 2194 23 92 2 2195 204 1030 2 2196 210 678 2 2197 92 609 2 2198 36 54 2 2199 32 96 2 2200 41 113 2 2201 36 146 2 2202 31 182 2 2203 147 894 2 2204 71 420 2 2205 257 1508 2 2206 22 69 2 2207 440 2757 2 2208 40 214 2 2209 98 407 2 2210 1696 8455 2 2211 31 74 2 2212 22 32 2 2213 152 1563 2 2214 60 166 2 2215 22 43 2 2216 23 38 2 2217 48 317 2 2218 23 64 2 2219 310 4357 2 2220 26 124 2 2221 24 125 2 2222 25 89 2 2223 23 115 2 2224 46 288 2 2225 28 100 2 2226 45 158 2 2227 23 59 2 2228 24 738 2 2229 59 208 2 2230 47 141 2 2231 231 363 2 2232 271 6424 2 2233 77 192 2 2234 82 533 2 2235 28 87 2 2236 301 679 2 2237 33 163 2 2238 279 1447 2 2239 206 2141 2 2240 24 85 2 2241 30 162 2 2242 206 861 2 2243 115 505 2 2244 36 278 2 2245 23 35 2 2246 49 238 2 2247 39 177 2 2248 2330 16880 2 2249 79 292 2 2250 147 891 2 2251 24 52 2 2252 333 2138 2 2253 24 57 2 2254 96 411 2 2255 49 269 2 2256 184 1846 2 2257 29 135 2 2258 588 731 2 2259 40 534 2 2260 225 681 2 2261 25 71 2 2262 25 87 2 2263 57 41 2 2264 22 52 2 2265 143 485 2 2266 24 37 2 2267 25 45 2 2268 41 152 2 2269 23 42 2 2270 54 218 2 2271 93 446 2 2272 167 636 2 2273 42 102 2 2274 25 85 2 2275 97 371 2 2276 53 235 2 2277 389 1843 2 2278 60 262 2 2279 121 1134 2 2280 45 1560 2 2281 28 143 2 2282 59 552 2 2283 337 1840 2 2284 88 449 2 2285 27 72 2 2286 23 55 2 2287 46 162 2 2288 22 59 2 2289 25 133 2 2290 23 85 2 2291 22 91 2 2292 21 70 2 2293 50 243 2 2294 64 256 2 2295 25 142 2 2296 29 57 2 2297 78 508 2 2298 24 31 2 2299 88 535 2 2300 40 204 2 2301 54 412 2 2302 37 85 2 2303 146 964 2 2304 239 2216 2 2305 205 646 2 2306 31 277 2 2307 114 811 2 2308 111 616 2 2309 34 77 2 2310 24 57 2 2311 245 1435 2 2312 30 66 2 2313 792 5968 2 2314 862 3546 2 2315 1369 2791 2 2316 1742 3671 2 2317 21 31 2 2318 25 89 2 2319 27 54 2 2320 21 82 2 2321 24 50 2 2322 22 32 2 2323 95 358 2 2324 34 101 2 2325 23 39 2 2326 28 137 2 2327 23 49 2 2328 1509 8123 2 2329 122 305 2 2330 883 3864 2 2331 22 34 2 2332 269 302 2 2333 22 118 2 2334 921 2342 2 2335 29 95 2 2336 24 79 2 2337 22 42 2 2338 23 49 2 2339 37 133 2 2340 41 116 2 2341 23 125 2 2342 22 69 2 2343 22 63 2 2344 23 55 2 2345 22 39 2 2346 21 31 2 2347 24 109 2 2348 22 107 2 2349 23 108 2 2350 45 365 2 2351 467 5105 2 2352 26 106 2 2353 26 127 2 2354 25 118 2 2355 48 202 2 2356 20 68 2 2357 28 82 2 2358 10375 34171 2 2359 98 497 2 2360 12622 33844 2 2361 28 47 2 2362 28 85 2 2363 407 1130 2 2364 28 72 2 2365 48 167 2 2366 29 114 2 2367 23 44 2 2368 24 40 2 2369 39 139 2 2370 33 108 2 2371 25 63 2 2372 26 99 2 2373 25 85 2 2374 31 54 2 2375 676 5818 2 2376 22 29 2 2377 35 107 2 2378 28 56 2 2379 372 2148 2 2380 21 27 2 2381 26 64 2 2382 66 139 2 2383 23 88 2 2384 31 98 2 2385 34 115 2 2386 38 104 2 2387 24 61 2 2388 47 277 2 2389 91 302 2 2390 25 40 2 2391 130 147 2 2392 28 79 2 2393 28 37 2 2394 34 100 2 2395 28 65 2 2396 24 139 2 2397 25 56 2 2398 24 44 2 2399 23 39 2 2400 22 62 2 2401 26 83 2 2402 24 69 2 2403 25 64 2 2404 42 124 2 2405 25 72 2 2406 25 63 2 2407 32 70 2 2408 21 44 2 2409 21 38 2 2410 27 75 2 2411 23 37 2 2412 20 33 2 2413 21 32 2 2414 27 46 2 2415 21 36 2 2416 22 40 2 2417 22 38 2 2418 71 162 2 2419 22 26 2 2420 28 74 2 2421 22 36 2 2422 45 160 2 2423 22 58 2 2424 24 80 2 2425 22 41 2 2426 23 51 2 2427 75 307 2 2428 76 440 2 2429 27 56 2 2430 27 74 2 2431 22 56 2 2432 34 107 2 2433 36 95 2 2434 23 51 2 2435 21 34 2 2436 41 149 2 2437 23 42 2 2438 32 75 2 2439 47 193 2 2440 26 32 2 2441 27 73 2 2442 37 69 2 2443 66 300 2 2444 87 138 2 2445 32 46 2 2446 23 44 2 2447 46 221 2 2448 41 160 2 2449 31 111 2 2450 25 83 2 2451 21 40 2 2452 45 254 2 2453 38 85 2 2454 38 158 2 2455 47 315 2 2456 25 63 2 2457 36 102 2 2458 57 300 2 2459 27 111 2 2460 33 191 2 2461 123 405 2 2462 999 4585 2 2463 24 42 2 2464 30 79 2 2465 30 166 2 2466 29 881 2 2467 22 43 2 2468 25 43 2 2469 21 27 2 2470 101 18844 2 2471 22 36 2 2472 25 61 2 2473 20 29 2 2474 54 225 2 2475 30 77 2 2476 94 164 2 2477 22 36 2 2478 41 414 2 2479 21 35 2 2480 41 140 2 2481 21 36 2 2482 119 336 2 2483 24 56 2 2484 24 79 2 2485 32 113 2 2486 149 875 2 2487 23 49 2 2488 27 47 2 2489 91 180 2 2490 26 58 2 2491 40 140 2 2492 22 41 2 2493 29 67 2 2494 25 101 2 2495 20 39 2 2496 20 43 2 2497 27 57 2 2498 53 354 2 2499 31 106 2 2500 34 137 2 2501 23 28 2 2502 55 162 2 2503 49 160 2 2504 49 136 2 2505 28 155 2 2506 29 62 2 2507 28 114 2 2508 25 64 2 2509 27 59 2 2510 36 167 2 2511 143 508 2 2512 44 117 2 2513 28 60 2 2514 105 881 2 2515 37 84 2 2516 25 46 2 2517 132 683 2 2518 23 72 2 2519 65 408 2 2520 26 46 2 2521 31 171 2 2522 30 70 2 2523 143 977 2 2524 22 34 2 2525 95 410 2 2526 21 35 2 2527 115 517 2 2528 20 40 2 2529 21 32 2 2530 21 36 2 2531 75 573 2 2532 51 276 2 2533 66 214 2 2534 24 121 2 2535 23 43 2 2536 29 50 2 2537 106 492 2 2538 23 39 2 2539 21 42 2 2540 22 58 2 2541 32 46 2 2542 120 891 2 2543 432 644 2 2544 26 74 2 2545 22 38 2 2546 59 376 2 2547 21 39 2 2548 24 82 2 2549 67 240 2 2550 33 189 2 2551 31 78 2 2552 22 85 2 2553 22 52 2 2554 20 33 2 2555 23 51 2 2556 30 42 2 2557 38 178 2 2558 30 49 2 2559 50 233 2 2560 26 40 2 2561 45 350 2 2562 27 73 2 2563 56 230 2 2564 35 72 2 2565 41 224 2 2566 23 36 2 2567 151 293 2 2568 24 54 2 2569 30 103 2 2570 65 227 2 2571 22 43 2 2572 45 887 2 2573 44 93 2 2574 34 45 2 2575 30 109 2 2576 32 129 2 2577 22 33 2 2578 52 385 2 2579 47 264 2 2580 32 181 2 2581 25 53 2 2582 30 100 2 2583 42 124 2 2584 32 47 2 2585 23 26 2 2586 22 91 2 2587 52 141 2 2588 37 239 2 2589 20 32 2 2590 36 189 2 2591 22 40 2 2592 29 146 2 2593 22 50 2 2594 23 52 2 2595 28 79 2 2596 52 333 2 2597 24 51 2 2598 39 357 2 2599 20 33 2 2600 24 53 2 2601 58 119 2 2602 603 5991 2 2603 1774 8407 2 2604 566 278 2 2605 129 653 2 2606 28 107 2 2607 27 58 2 2608 784 1994 2 2609 431 1930 2 2610 25 99 2 2611 28 109 2 2612 538 2207 2 2613 88 393 2 2614 136 628 2 2615 26 83 2 2616 90 748 2 2617 23 31 2 2618 61 167 2 2619 1386 7343 2 2620 22 31 2 2621 417 1996 2 2622 24 107 2 2623 123 283 2 2624 71 257 2 2625 279 1285 2 2626 38 181 2 2627 23 120 2 2628 3605 6744 2 2629 147 319 2 2630 450 1684 2 2631 24 37 2 2632 452 1149 2 2633 45 252 2 2634 25 93 2 2635 610 2038 2 2636 27 65 2 2637 33 72 2 2638 80 245 2 2639 35 64 2 2640 117 886 2 2641 391 2223 2 2642 78 129 2 2643 79 275 2 2644 440 5201 2 2645 556 2926 2 2646 709 2146 2 2647 107 302 2 2648 24 68 2 2649 251 520 2 2650 25 145 2 2651 27 56 2 2652 24 51 2 2653 22 56 2 2654 63 245 2 2655 65 175 2 2656 27 81 2 2657 89 336 2 2658 22 63 2 2659 119 450 2 2660 20 42 2 2661 485 1787 2 2662 34 107 2 2663 428 1450 2 2664 6243 36305 2 2665 23 31 2 2666 22 41 2 2667 24 32 2 2668 27 69 2 2669 25 27 2 2670 22 43 2 2671 46 86 2 2672 81 520 2 2673 30 110 2 2674 49 76 2 2675 442 1303 2 2676 39 164 2 2677 32 180 2 2678 41 187 2 2679 31 136 2 2680 43 161 2 2681 64 173 2 2682 111 652 2 2683 56 287 2 2684 87 362 2 2685 23 52 2 2686 136 310 2 2687 32 99 2 2688 30 74 2 2689 26 73 2 2690 34 86 2 2691 51 139 2 2692 33 97 2 2693 28 74 2 2694 147 194 2 2695 23 50 2 2696 49 357 2 2697 31 139 2 2698 61 244 2 2699 41 119 2 2700 30 91 2 2701 24 40 2 2702 29 95 2 2703 36 69 2 2704 34 117 2 2705 91 564 2 2706 24 48 2 2707 23 48 2 2708 78 681 2 2709 94 532 2 2710 1801 7182 2 2711 184 461 2 2712 116 336 2 2713 265 911 2 2714 29 129 2 2715 36 60 2 2716 48 211 2 2717 47 118 2 2718 25 71 2 2719 34 157 2 2720 42 66 2 2721 24 40 2 2722 31 67 2 2723 24 79 2 2724 95 511 2 2725 207 705 2 2726 62 274 2 2727 24 48 2 2728 50 269 2 2729 24 121 2 2730 97 422 2 2731 45 130 2 2732 49 198 2 2733 58 182 2 2734 78 342 2 2735 25 49 2 2736 33 219 2 2737 93 253 2 2738 74 189 2 2739 21 38 2 2740 22 43 2 2741 50 252 2 2742 25 71 2 2743 47 216 2 2744 76 378 2 2745 60 487 2 2746 27 95 2 2747 30 411 2 2748 962 5008 2 2749 192 341 2 2750 21 53 2 2751 38 147 2 2752 81 261 2 2753 47 224 2 2754 34 89 2 2755 44 114 2 2756 35 142 2 2757 35 156 2 2758 33 87 2 2759 75 163 2 2760 28 57 2 2761 108 831 2 2762 77 466 2 2763 25 38 2 2764 25 63 2 2765 27 50 2 2766 33 105 2 2767 154 1250 2 2768 22 38 2 2769 66 216 2 2770 101 135 2 2771 70 465 2 2772 23 43 2 2773 28 66 2 2774 26 63 2 2775 250 1410 2 2776 23 65 2 2777 126 472 2 2778 24 63 2 2779 62 205 2 2780 22 38 2 2781 24 42 2 2782 25 100 2 2783 133 752 2 2784 32 49 2 2785 51 226 2 2786 135 755 2 2787 23 48 2 2788 27 73 2 2789 25 129 2 2790 31 60 2 2791 61 92 2 2792 28 60 2 2793 193 1397 2 2794 33 73 2 2795 157 1290 2 2796 25 58 2 2797 31 118 2 2798 29 81 2 2799 27 41 2 2800 47 549 2 2801 23 36 2 2802 26 59 2 2803 24 36 2 2804 117 795 2 2805 23 81 2 2806 28 105 2 2807 28 51 2 2808 41 158 2 2809 69 370 2 2810 689 3335 2 2811 25 32 2 2812 57 265 2 2813 30 80 2 2814 63 428 2 2815 34 217 2 2816 49 304 2 2817 385 2215 2 2818 112 1868 2 2819 23 52 2 2820 34 149 2 2821 36 84 2 2822 34 210 2 2823 31 282 2 2824 28 95 2 2825 25 92 2 2826 59 291 2 2827 41 423 2 2828 33 121 2 2829 39 89 2 2830 788 2038 2 2831 25 52 2 2832 99 783 2 2833 46 382 2 2834 61 112 2 2835 34 244 2 2836 27 33 2 2837 24 41 2 2838 695 2183 2 2839 228 1340 2 2840 24 43 2 2841 35 130 2 2842 35 300 2 2843 31 124 2 2844 27 66 2 2845 32 83 2 2846 48 284 2 2847 23 42 2 2848 80 287 2 2849 73 364 2 2850 35 119 2 2851 25 59 2 2852 134 767 2 2853 34 122 2 2854 34 127 2 2855 21 44 2 2856 22 32 2 2857 29 299 2 2858 25 79 2 2859 29 94 2 2860 28 51 2 2861 45 533 2 2862 58 391 2 2863 34 220 2 2864 27 59 2 2865 30 92 2 2866 24 45 2 2867 38 148 2 2868 22 39 2 2869 184 780 2 2870 32 51 2 2871 33 53 2 2872 50 176 2 2873 21 42 2 2874 31 255 2 2875 27 165 2 2876 22 30 2 2877 80 348 2 2878 34 109 2 2879 30 69 2 2880 25 43 2 2881 53 203 2 2882 23 47 2 2883 42 261 2 2884 22 40 2 2885 788 2517 2 2886 21 32 2 2887 547 5022 2 2888 23 37 2 2889 54 297 2 2890 45 94 2 2891 873 6257 2 2892 30 46 2 2893 30 64 2 2894 50 194 2 2895 65 150 2 2896 62 219 2 2897 66 244 2 2898 22 35 2 2899 45 212 2 2900 135 407 2 2901 96 282 2 2902 50 149 2 2903 40 158 2 2904 26 83 2 2905 34 88 2 2906 89 218 2 2907 187 641 2 2908 26 46 2 2909 25 41 2 2910 23 60 2 2911 49 186 2 2912 82 299 2 2913 27 125 2 2914 433 800 2 2915 33 234 2 2916 25 75 2 2917 29 49 2 2918 23 88 2 2919 22 60 2 2920 63 186 2 2921 301 2690 2 2922 137 844 2 2923 2565 16796 2 2924 33 80 2 2925 30 62 2 2926 37 139 2 2927 25 99 2 2928 293 545 2 2929 97 405 2 2930 7631 41063 2 2931 28 80 2 2932 41 108 2 2933 158 618 2 2934 574 3153 2 2935 43 121 2 2936 5736 18709 2 2937 94 247 2 2938 239 1397 2 2939 46 102 2 2940 33 93 2 2941 1195 3245 2 2942 28 71 2 2943 49 238 2 2944 30 77 2 2945 23 45 2 2946 90 283 2 2947 46 61 2 2948 25 51 2 2949 30 71 2 2950 27 91 2 2951 33 230 2 2952 40 174 2 2953 27 101 2 2954 26 26 2 2955 1064 8033 2 2956 26 27 2 2957 135 362 2 2958 24 25 2 2959 59 194 2 2960 55 467 2 2961 31 156 2 2962 36 124 2 2963 25 55 2 2964 25 44 2 2965 27 61 2 2966 28 391 2 2967 23 31 2 2968 40 279 2 2969 27 99 2 2970 47 320 2 2971 25 62 2 2972 159 566 2 2973 45 207 2 2974 83 433 2 2975 38 157 2 2976 23 33 2 2977 34 81 2 2978 27 68 2 2979 31 168 2 2980 117 179 2 2981 21 47 2 2982 42 151 2 2983 28 54 2 2984 23 48 2 2985 24 43 2 2986 24 70 2 2987 39 148 2 2988 23 33 2 2989 24 43 2 2990 89 549 2 2991 24 50 2 2992 25 41 2 2993 55 168 2 2994 29 175 2 2995 24 46 2 2996 25 2047 2 2997 25 44 2 2998 24 34 2 2999 121 739 2 3000 56 176 2 3001 43 234 2 3002 84 3735 2 3003 191 536 2 3004 42 172 2 3005 304 851 2 3006 133 201 2 3007 32 294 2 3008 39 160 2 3009 25 54 2 3010 33 243 2 3011 36 97 2 3012 42 180 2 3013 25 34 2 3014 31 71 2 3015 219 2414 2 3016 31 73 2 3017 22 31 2 3018 95 302 2 3019 87 446 2 3020 36 144 2 3021 419 610 2 3022 25 62 2 3023 68 252 2 3024 95 1176 2 3025 29 71 2 3026 22 101 2 3027 26 107 2 3028 62 228 2 3029 37 98 2 3030 342 874 2 3031 25 69 2 3032 48 196 2 3033 35 172 2 3034 32 164 2 3035 44 242 2 3036 27 62 2 3037 30 50 2 3038 53 166 2 3039 32 127 2 3040 145 444 2 3041 902 3723 2 3042 92 263 2 3043 53 432 2 3044 24 32 2 3045 51 334 2 3046 27 47 2 3047 39 164 2 3048 65 336 2 3049 104 304 2 3050 25 41 2 3051 23 32 2 3052 38 103 2 3053 52 137 2 3054 64 792 2 3055 32 119 2 3056 143 721 2 3057 25 72 2 3058 82 482 2 3059 68 411 2 3060 36 137 2 3061 39 187 2 3062 27 84 2 3063 74 256 2 3064 90 518 2 3065 76 421 2 3066 184 1308 2 3067 28 57 2 3068 36 62 2 3069 23 39 2 3070 24 45 2 3071 321 4465 2 3072 35 106 2 3073 49 302 2 3074 20 44 2 3075 26 38 2 3076 34 269 2 3077 23 53 2 3078 34 121 2 3079 33 128 2 3080 129 450 2 3081 44 656 2 3082 73 6361 2 3083 45 131 2 3084 26 95 2 3085 24 34 2 3086 48 221 2 3087 22 29 2 3088 49 140 2 3089 59 224 2 3090 23 54 2 3091 37 277 2 3092 56 216 2 3093 24 51 2 3094 27 36 2 3095 30 79 2 3096 22 33 2 3097 74 120 2 3098 24 59 2 3099 87 601 2 3100 65 757 2 3101 596 1168 2 3102 32 76 2 3103 801 1311 2 3104 30 79 2 3105 149 320 2 3106 22 33 2 3107 67 156 2 3108 171 1000 2 3109 74 580 2 3110 23 39 2 3111 24 43 2 3112 47 252 2 3113 27 82 2 3114 34 305 2 3115 34 54 2 3116 81 355 2 3117 24 111 2 3118 49 127 2 3119 392 3149 2 3120 27 53 2 3121 25 1055 2 3122 44 221 2 3123 34 115 2 3124 79 732 2 3125 34 98 2 3126 31 155 2 3127 1534 14302 2 3128 28 62 2 3129 24 72 2 3130 22 40 2 3131 33 107 2 3132 76 407 2 3133 31 64 2 3134 72 596 2 3135 36 242 2 3136 90 459 2 3137 91 257 2 3138 22 37 2 3139 66 296 2 3140 26 60 2 3141 22 38 2 3142 29 78 2 3143 51 207 2 3144 64 74 2 3145 30 116 2 3146 112 2537 2 3147 36 401 2 3148 24 42 2 3149 200 891 2 3150 29 41 2 3151 57 517 2 3152 77 193 2 3153 29 74 2 3154 107 709 2 3155 93 661 2 3156 105 69 2 3157 28 123 2 3158 31 156 2 3159 30 105 2 3160 52 611 2 3161 26 40 2 3162 118 467 2 3163 84 1270 2 3164 57 483 2 3165 22 38 2 3166 90 455 2 3167 28 29 2 3168 77 312 2 3169 331 1560 2 3170 146 656 2 3171 58 470 2 3172 22 37 2 3173 55 213 2 3174 31 108 2 3175 22 35 2 3176 63 392 2 3177 71 349 2 3178 87 1150 2 3179 45 363 2 3180 813 6471 2 3181 26 70 2 3182 26 54 2 3183 27 131 2 3184 26 82 2 3185 25 73 2 3186 47 88 2 3187 143 379 2 3188 28 67 2 3189 216 706 2 3190 26 128 2 3191 23 127 2 3192 35 165 2 3193 31 157 2 3194 24 68 2 3195 23 31 2 3196 196 806 2 3197 23 45 2 3198 20 35 2 3199 98 471 2 3200 75 574 2 3201 59 312 2 3202 64 417 2 3203 28 134 2 3204 24 60 2 3205 82 339 2 3206 24 77 2 3207 923 5109 2 3208 23 65 2 3209 48 188 2 3210 26 86 2 3211 26 143 2 3212 1667 6199 2 3213 7532 24434 2 3214 32 162 2 3215 28 85 2 3216 36 118 2 3217 54 300 2 3218 75 213 2 3219 34 123 2 3220 27 46 2 3221 36 171 2 3222 39 160 2 3223 2131 9684 2 3224 102 282 2 3225 10009 50296 2 3226 48 186 2 3227 70 245 2 3228 25 51 2 3229 24 73 2 3230 29 248 2 3231 27 106 2 3232 136 513 2 3233 267 365 2 3234 293 2568 2 3235 88 383 2 3236 26 94 2 3237 23 55 2 3238 28 98 2 3239 234 440 2 3240 22 50 2 3241 93 329 2 3242 630 2734 2 3243 23 108 2 3244 99 508 2 3245 21 41 2 3246 37 88 2 3247 23 35 2 3248 22 74 2 3249 24 40 2 3250 449 4031 2 3251 29 121 2 3252 47 270 2 3253 30 89 2 3254 27 67 2 3255 32 146 2 3256 30 128 2 3257 63 173 2 3258 59 190 2 3259 36 190 2 3260 33 128 2 3261 237 546 2 3262 191 658 2 3263 32 87 2 3264 22 70 2 3265 22 67 2 3266 30 82 2 3267 23 54 2 3268 28 244 2 3269 23 43 2 3270 37 76 2 3271 22 61 2 3272 32 439 2 3273 25 53 2 3274 28 112 2 3275 24 117 2 3276 25 102 2 3277 23 119 2 3278 53 216 2 3279 60 212 2 3280 145 629 2 3281 37 159 2 3282 24 42 2 3283 50 164 2 3284 24 77 2 3285 118 1548 2 3286 23 51 2 3287 44 320 2 3288 80 321 2 3289 22 59 2 3290 122 429 2 3291 46 285 2 3292 28 144 2 3293 24 81 2 3294 42 194 2 3295 23 74 2 3296 21 42 2 3297 47 142 2 3298 92 385 2 3299 26 56 2 3300 24 44 2 3301 26 766 2 3302 241 1089 2 3303 404 991 2 3304 44 210 2 3305 39 154 2 3306 24 62 2 3307 32 150 2 3308 146 998 2 3309 38 530 2 3310 23 85 2 3311 38 139 2 3312 22 49 2 3313 101 337 2 3314 28 173 2 3315 41 180 2 3316 43 98 2 3317 50 183 2 3318 48 182 2 3319 25 52 2 3320 36 57 2 3321 46 113 2 3322 45 191 2 3323 52 230 2 3324 189 945 2 3325 45 245 2 3326 92 309 2 3327 48 73 2 3328 65 312 2 3329 41 101 2 3330 85 227 2 3331 566 1970 2 3332 277 1282 2 3333 86 272 2 3334 22 35 2 3335 31 436 2 3336 74 156 2 3337 317 3783 2 3338 24 67 2 3339 90 1344 2 3340 31 89 2 3341 23 89 2 3342 121 654 2 3343 30 143 2 3344 21 62 2 3345 184 583 2 3346 137 329 2 3347 58 421 2 3348 24 42 2 3349 90 327 2 3350 22 37 2 3351 51 222 2 3352 22 46 2 3353 24 71 2 3354 28 101 2 3355 24 135 2 3356 23 40 2 3357 25 104 2 3358 25 66 2 3359 24 103 2 3360 124 385 2 3361 34 95 2 3362 215 1382 2 3363 46 110 2 3364 96 241 2 3365 25 74 2 3366 48 179 2 3367 3092 8574 2 3368 38 268 2 3369 2004 3115 2 3370 24 63 2 3371 28 143 2 3372 23 74 2 3373 24 43 2 3374 29 138 2 3375 44 547 2 3376 25 78 2 3377 447 2439 2 3378 28 132 2 3379 60 337 2 3380 26 116 2 3381 1187 4470 2 3382 89 573 2 3383 69 324 2 3384 45 107 2 3385 25 66 2 3386 52 309 2 3387 22 33 2 3388 51 116 2 3389 31 104 2 3390 83 265 2 3391 40 204 2 3392 76 369 2 3393 66 94 2 3394 179 463 2 3395 34 131 2 3396 170 777 2 3397 112 425 2 3398 101 452 2 3399 118 102 2 3400 356 1792 2 3401 46 136 2 3402 33 64 2 3403 35 105 2 3404 33 295 2 3405 22 49 2 3406 120 801 2 3407 25 45 2 3408 83 269 2 3409 26 82 2 3410 39 96 2 3411 21 72 2 3412 45 254 2 3413 74 1003 2 3414 196 1081 2 3415 74 85 2 3416 35 63 2 3417 45 122 2 3418 50 196 2 3419 104 359 2 3420 249 913 2 3421 47 155 2 3422 140 880 2 3423 75 1453 2 3424 36 197 2 3425 22 51 2 3426 55 254 2 3427 35 255 2 3428 119 663 2 3429 32 260 2 3430 57 377 2 3431 34 150 2 3432 27 57 2 3433 36 124 2 3434 98 339 2 3435 47 359 2 3436 97 361 2 3437 61 386 2 3438 26 73 2 3439 62 406 2 3440 83 153 2 3441 24 54 2 3442 78 404 2 3443 44 157 2 3444 59 599 2 3445 27 144 2 3446 29 259 2 3447 23 315 2 3448 30 117 2 3449 42 149 2 3450 25 51 2 3451 100 682 2 3452 29 64 2 3453 110 736 2 3454 27 47 2 3455 274 2163 2 3456 24 33 2 3457 156 836 2 3458 22 45 2 3459 36 145 2 3460 26 930 2 3461 88 2965 2 3462 27 199 2 3463 84 589 2 3464 22 50 2 3465 41 95 2 3466 35 273 2 3467 52 133 2 3468 50 67 2 3469 675 6401 2 3470 532 2600 2 3471 22 40 2 3472 23 86 2 3473 22 56 2 3474 25 54 2 3475 32 71 2 3476 21 52 2 3477 33 106 2 3478 26 47 2 3479 20 52 2 3480 22 126 2 3481 21 35 2 3482 26 62 2 3483 118 1358 2 3484 57 242 2 3485 75 323 2 3486 914 3620 2 3487 31 66 2 3488 21 34 2 3489 20 36 2 3490 21 52 2 3491 184 651 2 3492 219 419 2 3493 43 267 2 3494 347 2191 2 3495 36 128 2 3496 80 395 2 3497 36 93 2 3498 56 687 2 3499 21 45 2 3500 33 149 2 3501 38 148 2 3502 35 147 2 3503 77 324 2 3504 24 49 2 3505 30 72 2 3506 21 145 2 3507 21 36 2 3508 37 265 2 3509 22 49 2 3510 425 6273 2 3511 31 133 2 3512 48 206 2 3513 26 102 2 3514 23 47 2 3515 22 47 2 3516 33 185 2 3517 53 274 2 3518 32 136 2 3519 31 221 2 3520 21 31 2 3521 61 253 2 3522 27 65 2 3523 24 33 2 3524 22 38 2 3525 24 81 2 3526 22 79 2 3527 60 345 2 3528 20 25 2 3529 72 200 2 3530 44 278 2 3531 33 107 2 3532 21 76 2 3533 41 145 2 3534 37 166 2 3535 24 47 2 3536 22 27 2 3537 26 94 2 3538 32 92 2 3539 33 110 2 3540 23 38 2 3541 24 70 2 3542 22 50 2 3543 24 73 2 3544 75 146 2 3545 59 313 2 3546 20 30 2 3547 32 154 2 3548 75 134 2 3549 37 70 2 3550 23 98 2 3551 20 37 2 3552 55 335 2 3553 21 56 2 3554 23 100 2 3555 26 89 2 3556 35 214 2 3557 21 48 2 3558 25 66 2 3559 21 34 2 3560 322 979 2 3561 22 48 2 3562 74 295 2 3563 24 59 2 3564 25 79 2 3565 28 66 2 3566 33 157 2 3567 29 107 2 3568 37 347 2 3569 28 109 2 3570 91 415 2 3571 194 852 2 3572 21 36 2 3573 58 265 2 3574 37 60 2 3575 21 25 2 3576 20 42 2 3577 95 792 2 3578 28 154 2 3579 838 1823 2 3580 21 31 2 3581 23 49 2 3582 26 77 2 3583 21 46 2 3584 23 35 2 3585 26 76 2 3586 31 143 2 3587 31 74 2 3588 24 52 2 3589 23 34 2 3590 23 57 2 3591 23 46 2 3592 32 138 2 3593 27 51 2 3594 76 495 2 3595 24 39 2 3596 24 66 2 3597 24 62 2 3598 32 97 2 3599 26 145 2 3600 45 153 2 3601 23 83 2 3602 26 62 2 3603 22 31 2 3604 26 112 2 3605 27 59 2 3606 47 163 2 3607 23 66 2 3608 20 37 2 3609 144 786 2 3610 21 45 2 3611 23 84 2 3612 28 63 2 3613 25 77 2 3614 22 34 2 3615 20 57 2 3616 68 326 2 3617 24 95 2 3618 36 112 2 3619 29 70 2 3620 40 220 2 3621 22 80 2 3622 28 113 2 3623 26 63 2 3624 21 40 2 3625 52 301 2 3626 29 105 2 3627 78 535 2 3628 61 216 2 3629 29 154 2 3630 38 99 2 3631 29 84 2 3632 32 91 2 3633 102 439 2 3634 22 45 2 3635 200 487 2 3636 30 84 2 3637 318 1587 2 3638 28 92 2 3639 27 91 2 3640 24 95 2 3641 25 41 2 3642 105 422 2 3643 22 180 2 3644 71 331 2 3645 113 446 2 3646 34 257 2 3647 26 99 2 3648 98 320 2 3649 28 147 2 3650 58 294 2 3651 119 987 2 3652 21 37 2 3653 25 72 2 3654 37 502 2 3655 488 3006 2 3656 21 40 2 3657 4726 8538 2 3658 62 110 2 3659 22 35 2 3660 102 970 2 3661 21 67 2 3662 21 40 2 3663 28 67 2 3664 43 244 2 3665 24 76 2 3666 21 43 2 3667 24 38 2 3668 333 928 2 3669 22 43 2 3670 53 310 2 3671 22 32 2 3672 48 234 2 3673 21 74 2 3674 30 83 2 3675 21 44 2 3676 25 91 2 3677 57 147 2 3678 23 42 2 3679 146 1030 2 3680 27 84 2 3681 90 318 2 3682 27 273 2 3683 102 160 2 3684 593 5176 2 3685 26 107 2 3686 30 78 2 3687 25 56 2 3688 22 56 2 3689 38 240 2 3690 30 96 2 3691 23 30 2 3692 21 97 2 3693 95 377 2 3694 21 40 2 3695 22 35 2 3696 29 124 2 3697 26 51 2 3698 20 53 2 3699 588 822 2 3700 22 61 2 3701 21 41 2 3702 89 238 2 3703 21 35 2 3704 40 455 2 3705 38 152 2 3706 46 192 2 3707 21 55 2 3708 21 39 2 3709 27 79 2 3710 21 37 2 3711 24 78 2 3712 49 42 2 3713 26 70 2 3714 20 34 2 3715 27 185 2 3716 21 29 2 3717 27 72 2 3718 26 190 2 3719 24 128 2 3720 74 178 2 3721 26 74 2 3722 22 43 2 3723 31 105 2 3724 26 62 2 3725 31 514 2 3726 25 90 2 3727 64 328 2 3728 27 75 2 3729 42 415 2 3730 21 42 2 3731 29 110 2 3732 42 385 2 3733 23 57 2 3734 31 121 2 3735 33 324 2 3736 86 555 2 3737 41 55 2 3738 29 101 2 3739 44 311 2 3740 22 70 2 3741 22 28 2 3742 42 101 2 3743 22 31 2 3744 33 217 2 3745 20 38 2 3746 32 443 2 3747 22 36 2 3748 357 2089 2 3749 31 116 2 3750 32 118 2 3751 28 146 2 3752 145 1581 2 3753 22 31 2 3754 38 119 2 3755 22 36 2 3756 35 169 2 3757 59 155 2 3758 481 4176 2 3759 1411 7522 2 3760 38 101 2 3761 45 211 2 3762 23 70 2 3763 1483 4530 2 3764 22 31 2 3765 29 76 2 3766 33 105 2 3767 37 179 2 3768 25 67 2 3769 23 43 2 3770 28 124 2 3771 55 198 2 3772 30 148 2 3773 25 28 2 3774 5528 21592 2 3775 805 5636 2 3776 22 51 2 3777 75 156 2 3778 312 3561 2 3779 25 67 2 3780 25 83 2 3781 33 147 2 3782 62 260 2 3783 55 125 2 3784 27 65 2 3785 22 29 2 3786 25 60 2 3787 22 41 2 3788 31 67 2 3789 29 82 2 3790 51 238 2 3791 30 83 2 3792 35 187 2 3793 26 31 2 3794 45 192 2 3795 26 76 2 3796 33 89 2 3797 23 93 2 3798 24 88 2 3799 523 2322 2 3800 26 55 2 3801 123 688 2 3802 66 260 2 3803 468 1329 2 3804 58 320 2 3805 24 47 2 3806 25 81 2 3807 23 70 2 3808 21 39 2 3809 24 33 2 3810 58 625 2 3811 28 51 2 3812 62 172 2 3813 34 86 2 3814 24 62 2 3815 28 81 2 3816 61 370 2 3817 32 69 2 3818 24 1169 2 3819 48 135 2 3820 3134 17629 2 3821 23 30 2 3822 3475 21712 2 3823 24 32 2 3824 54 247 2 3825 23 29 2 3826 40 72 2 3827 24 47 2 3828 32 88 2 3829 50 155 2 3830 289 1164 2 3831 30 182 2 3832 39 151 2 3833 71 714 2 3834 52 167 2 3835 48 203 2 3836 97 241 2 3837 82 514 2 3838 53 318 2 3839 66 287 2 3840 46 141 2 3841 35 191 2 3842 130 523 2 3843 30 126 2 3844 27 50 2 3845 25 58 2 3846 34 143 2 3847 31 249 2 3848 24 54 2 3849 33 136 2 3850 111 312 2 3851 39 243 2 3852 50 205 2 3853 22 47 2 3854 31 162 2 3855 82 219 2 3856 30 98 2 3857 41 89 2 3858 23 38 2 3859 44 119 2 3860 26 58 2 3861 21 33 2 3862 44 621 2 3863 29 86 2 3864 363 314 2 3865 22 35 2 3866 53 120 2 3867 33 74 2 3868 168 603 2 3869 29 213 2 3870 44 158 2 3871 73 945 2 3872 33 95 2 3873 65 291 2 3874 43 210 2 3875 24 58 2 3876 34 125 2 3877 28 63 2 3878 62 171 2 3879 41 267 2 3880 24 83 2 3881 38 135 2 3882 21 37 2 3883 37 109 2 3884 22 36 2 3885 33 132 2 3886 166 745 2 3887 43 340 2 3888 45 298 2 3889 284 1112 2 3890 21 30 2 3891 42 187 2 3892 27 77 2 3893 24 46 2 3894 43 157 2 3895 55 98 2 3896 31 77 2 3897 26 117 2 3898 23 48 2 3899 25 57 2 3900 27 79 2 3901 28 41 2 3902 22 64 2 3903 40 129 2 3904 24 59 2 3905 29 124 2 3906 22 45 2 3907 35 80 2 3908 93 615 2 3909 190 469 2 3910 28 94 2 3911 25 72 2 3912 190 1868 2 3913 58 265 2 3914 30 42 2 3915 31 121 2 3916 34 247 2 3917 124 983 2 3918 24 41 2 3919 24 156 2 3920 25 122 2 3921 60 327 2 3922 24 34 2 3923 43 165 2 3924 27 104 2 3925 27 66 2 3926 28 49 2 3927 270 1098 2 3928 59 393 2 3929 22 32 2 3930 22 38 2 3931 25 54 2 3932 46 346 2 3933 32 240 2 3934 68 155 2 3935 72 349 2 3936 33 210 2 3937 23 59 2 3938 47 163 2 3939 169 543 2 3940 29 81 2 3941 152 555 2 3942 24 88 2 3943 200 1074 2 3944 30 90 2 3945 56 214 2 3946 27 81 2 3947 35 160 2 3948 23 54 2 3949 35 226 2 3950 32 176 2 3951 23 49 2 3952 23 64 2 3953 26 74 2 3954 42 256 2 3955 57 542 2 3956 26 72 2 3957 30 71 2 3958 23 45 2 3959 32 150 2 3960 78 318 2 3961 22 42 2 3962 37 87 2 3963 28 73 2 3964 21 46 2 3965 22 72 2 3966 184 491 2 3967 28 65 2 3968 51 227 2 3969 25 52 2 3970 59 60 2 3971 53 70 2 3972 33 167 2 3973 25 90 2 3974 57 448 2 3975 31 100 2 3976 25 47 2 3977 37 211 2 3978 27 140 2 3979 28 170 2 3980 54 241 2 3981 23 54 2 3982 61 282 2 3983 23 45 2 3984 100 323 2 3985 33 60 2 3986 236 229 2 3987 23 49 2 3988 228 753 2 3989 61 418 2 3990 130 1056 2 3991 25 39 2 3992 117 310 2 3993 23 91 2 3994 52 399 2 3995 27 58 2 3996 22 38 2 3997 93 797 2 3998 48 152 2 3999 38 213 2 4000 35 228 2 4001 41 270 2 4002 26 58 2 4003 41 168 2 4004 34 108 2 4005 40 145 2 4006 49 141 2 4007 23 37 2 4008 27 103 2 4009 25 32 2 4010 73 261 2 4011 39 106 2 4012 28 252 2 4013 267 1421 2 4014 31 80 2 4015 33 79 2 4016 39 81 2 4017 30 159 2 4018 34 277 2 4019 23 84 2 4020 39 80 2 4021 22 176 2 4022 67 329 2 4023 72 793 2 4024 25 33 2 4025 25 41 2 4026 35 226 2 4027 24 78 2 4028 54 783 2 4029 32 174 2 4030 70 479 2 4031 42 349 2 4032 30 100 2 4033 24 73 2 4034 23 28 2 4035 31 219 2 4036 3359 32522 2 4037 30 79 2 4038 22 28 2 4039 36 156 2 4040 55 391 2 4041 34 279 2 4042 23 43 2 4043 25 83 2 4044 24 28 2 4045 49 281 2 4046 21 74 2 4047 599 5075 2 4048 33 78 2 4049 22 67 2 4050 22 30 2 4051 30 112 2 4052 25 67 2 4053 25 63 2 4054 21 36 2 4055 664 3733 2 4056 75 2473 2 4057 25 70 2 4058 25 49 2 4059 28 82 2 4060 22 97 2 4061 25 82 2 4062 50 279 2 4063 25 66 2 4064 34 97 2 4065 63 180 2 4066 26 59 2 4067 348 2462 2 4068 33 133 2 4069 106 735 2 4070 36 231 2 4071 56 182 2 4072 25 159 2 4073 28 56 2 4074 368 2964 2 4075 322 1347 2 4076 117 1623 2 4077 26 78 2 4078 44 143 2 4079 36 91 2 4080 441 3515 2 4081 27 71 2 4082 26 48 2 4083 39 94 2 4084 29 126 2 4085 25 45 2 4086 31 119 2 4087 23 35 2 4088 25 1246 2 4089 41 146 2 4090 36 116 2 4091 32 86 2 4092 25 120 2 4093 34 101 2 4094 22 96 2 4095 22 32 2 4096 28 88 2 4097 23 55 2 4098 26 103 2 4099 35 324 2 4100 24 49 2 4101 23 44 2 4102 28 61 2 4103 39 153 2 4104 32 108 2 4105 25 105 2 4106 23 37 2 4107 128 459 2 4108 47 326 2 4109 26 99 2 4110 53 223 2 4111 34 96 2 4112 49 818 2 4113 25 89 2 4114 23 30 2 4115 80 310 2 4116 61 214 2 4117 57 119 2 4118 35 107 2 4119 23 49 2 4120 29 202 2 4121 23 26 2 4122 52 374 2 4123 197 1078 2 4124 41 142 2 4125 29 71 2 4126 22 45 2 4127 49 145 2 4128 219 747 2 4129 25 53 2 4130 22 49 2 4131 52 94 2 4132 25 67 2 4133 22 65 2 4134 36 78 2 4135 48 265 2 4136 27 123 2 4137 22 31 2 4138 60 434 2 4139 22 36 2 4140 70 473 2 4141 35 69 2 4142 65 133 2 4143 20 34 2 4144 26 39 2 4145 22 34 2 4146 35 85 2 4147 34 63 2 4148 45 198 2 4149 86 668 2 4150 36 265 2 4151 22 40 2 4152 31 52 2 4153 26 959 2 4154 23 49 2 4155 21 30 2 4156 22 38 2 4157 22 31 2 4158 26 131 2 4159 23 53 2 4160 24 54 2 4161 217 2510 2 4162 67 149 2 4163 23 35 2 4164 22 62 2 4165 22 34 2 4166 27 158 2 4167 27 42 2 4168 23 61 2 4169 34 314 2 4170 28 87 2 4171 77 264 2 4172 127 496 2 4173 22 49 2 4174 30 139 2 4175 50 400 2 4176 32 92 2 4177 54 413 2 4178 168 269 2 4179 410 1393 2 4180 23 41 2 4181 63 61 2 4182 33 156 2 4183 26 56 2 4184 31 77 2 4185 31 137 2 4186 246 1638 2 4187 25 100 2 4188 23 70 2 4189 22 52 2 4190 131 344 2 4191 22 50 2 4192 54 49 2 4193 45 212 2 4194 25 47 2 4195 63 548 2 4196 40 217 2 4197 23 48 2 4198 39 273 2 4199 93 527 2 4200 90 219 2 4201 25 33 2 4202 25 64 2 4203 87 663 2 4204 105 948 2 4205 23 81 2 4206 22 32 2 4207 98 280 2 4208 105 213 2 4209 46 409 2 4210 82 479 2 4211 52 188 2 4212 33 116 2 4213 31 39 2 4214 49 225 2 4215 21 54 2 4216 30 139 2 4217 201 1898 2 4218 36 156 2 4219 40 150 2 4220 25 53 2 4221 27 152 2 4222 24 76 2 4223 179 878 2 4224 63 800 2 4225 80 321 2 4226 44 171 2 4227 496 1118 2 4228 91 173 2 4229 69 495 2 4230 24 54 2 4231 24 34 2 4232 111 908 2 4233 74 822 2 4234 32 148 2 4235 31 87 2 4236 72 1653 2 4237 38 125 2 4238 178 999 2 4239 47 1272 2 4240 190 1154 2 4241 69 153 2 4242 248 1113 2 4243 21 48 2 4244 33 67 2 4245 22 36 2 4246 23 58 2 4247 25 32 2 4248 32 127 2 4249 26 38 2 4250 38 222 2 4251 34 112 2 4252 25 44 2 4253 38 119 2 4254 22 41 2 4255 51 349 2 4256 23 76 2 4257 28 348 2 4258 33 248 2 4259 36 330 2 4260 27 55 2 4261 54 261 2 4262 54 142 2 4263 22 58 2 4264 22 42 2 4265 38 213 2 4266 33 433 2 4267 242 1807 2 4268 30 109 2 4269 81 765 2 4270 49 402 2 4271 29 48 2 4272 24 45 2 4273 22 66 2 4274 25 107 2 4275 276 2072 2 4276 97 477 2 4277 22 983 2 4278 25 106 2 4279 25 224 2 4280 32 99 2 4281 31 65 2 4282 82 442 2 4283 1546 13202 2 4284 38 74 2 4285 27 103 2 4286 24 34 2 4287 55 99 2 4288 41 112 2 4289 23 40 2 4290 25 77 2 4291 40 225 2 4292 23 54 2 4293 72 49 2 4294 24 34 2 4295 51 368 2 4296 25 79 2 4297 34 188 2 4298 24 43 2 4299 41 288 2 4300 21 40 2 4301 167 680 2 4302 21 36 2 4303 41 318 2 4304 48 348 2 4305 49 395 2 4306 28 55 2 4307 28 65 2 4308 79 358 2 4309 76 1025 2 4310 47 524 2 4311 38 247 2 4312 24 99 2 4313 283 820 2 4314 30 118 2 4315 28 33 2 4316 23 230 2 4317 27 387 2 4318 23 35 2 4319 23 28 2 4320 73 258 2 4321 40 143 2 4322 54 448 2 4323 113 363 2 4324 60 141 2 4325 32 159 2 4326 36 720 2 4327 27 48 2 4328 49 144 2 4329 27 40 2 4330 124 955 2 4331 28 109 2 4332 87 1485 2 4333 25 40 2 4334 66 290 2 4335 46 194 2 4336 359 3242 2 4337 24 44 2 4338 32 95 2 4339 21 62 2 4340 22 39 2 4341 332 859 2 4342 22 105 2 4343 22 114 2 4344 22 108 2 4345 23 78 2 4346 34 130 2 4347 29 95 2 4348 38 165 2 4349 35 149 2 4350 23 54 2 4351 22 36 2 4352 322 920 2 4353 22 37 2 4354 22 44 2 4355 25 413 2 4356 28 128 2 4357 22 71 2 4358 224 965 2 4359 115 449 2 4360 28 70 2 4361 24 131 2 4362 23 101 2 4363 25 87 2 4364 99 513 2 4365 21 53 2 4366 437 2568 2 4367 24 57 2 4368 33 77 2 4369 24 73 2 4370 60 466 2 4371 39 128 2 4372 23 41 2 4373 22 45 2 4374 22 63 2 4375 36 106 2 4376 38 92 2 4377 24 86 2 4378 25 120 2 4379 23 87 2 4380 24 74 2 4381 25 189 2 4382 73 409 2 4383 189 2183 2 4384 26 65 2 4385 21 61 2 4386 61 213 2 4387 26 76 2 4388 29 43 2 4389 22 45 2 4390 23 41 2 4391 30 210 2 4392 100 321 2 4393 44 173 2 4394 21 61 2 4395 36 179 2 4396 22 91 2 4397 38 216 2 4398 437 2194 2 4399 22 43 2 4400 23 74 2 4401 21 33 2 4402 308 2373 2 4403 22 37 2 4404 25 89 2 4405 79 769 2 4406 49 164 2 4407 22 50 2 4408 34 89 2 4409 50 460 2 4410 40 80 2 4411 84 464 2 4412 109 725 2 4413 213 1688 2 4414 146 500 2 4415 26 112 2 4416 27 109 2 4417 75 1188 2 4418 63 478 2 4419 36 106 2 4420 28 73 2 4421 20 36 2 4422 83 420 2 4423 27 63 2 4424 28 96 2 4425 228 1663 2 4426 67 128 2 4427 25 105 2 4428 22 69 2 4429 341 1054 2 4430 1097 10758 2 4431 32 204 2 4432 22 53 2 4433 23 61 2 4434 24 85 2 4435 22 104 2 4436 36 134 2 4437 35 179 2 4438 54 226 2 4439 22 36 2 4440 36 72 2 4441 22 26 2 4442 25 32 2 4443 24 46 2 4444 246 2968 2 4445 28 93 2 4446 45 124 2 4447 85 713 2 4448 25 91 2 4449 34 96 2 4450 23 84 2 4451 23 44 2 4452 48 361 2 4453 23 29 2 4454 22 53 2 4455 27 88 2 4456 107 326 2 4457 24 191 2 4458 71 917 2 4459 52 265 2 4460 24 46 2 4461 29 122 2 4462 24 48 2 4463 177 719 2 4464 29 99 2 4465 56 276 2 4466 31 98 2 4467 23 62 2 4468 22 40 2 4469 100 310 2 4470 23 41 2 4471 87 431 2 4472 24 81 2 4473 23 47 2 4474 22 46 2 4475 27 80 2 4476 23 49 2 4477 143 391 2 4478 25 50 2 4479 26 183 2 4480 28 73 2 4481 50 225 2 4482 305 1223 2 4483 40 130 2 4484 32 110 2 4485 33 5032 2 4486 37 321 2 4487 35 155 2 4488 20 42 2 4489 31 81 2 4490 26 50 2 4491 23 42 2 4492 21 34 2 4493 57 279 2 4494 67 491 2 4495 21 46 2 4496 28 123 2 4497 48 192 2 4498 22 143 2 4499 116 648 2 4500 31 103 2 4501 63 352 2 4502 23 57 2 4503 83 845 2 4504 61 192 2 4505 32 253 2 4506 20 46 2 4507 27 74 2 4508 26 56 2 4509 44 241 2 4510 66 225 2 4511 47 292 2 4512 22 50 2 4513 21 59 2 4514 23 91 2 4515 29 129 2 4516 27 273 2 4517 190 962 2 4518 24 89 2 4519 115 424 2 4520 25 60 2 4521 52 218 2 4522 68 290 2 4523 24 71 2 4524 32 75 2 4525 26 139 2 4526 28 47 2 4527 42 51 2 4528 29 96 2 4529 26 80 2 4530 31 78 2 4531 29 154 2 4532 21 73 2 4533 151 1144 2 4534 40 172 2 4535 62 437 2 4536 41 149 2 4537 24 42 2 4538 20 54 2 4539 28 70 2 4540 314 3506 2 4541 33 191 2 4542 88 358 2 4543 21 38 2 4544 129 559 2 4545 24 41 2 4546 74 969 2 4547 23 86 2 4548 22 77 2 4549 23 64 2 4550 45 231 2 4551 35 165 2 4552 58 322 2 4553 32 82 2 4554 50 98 2 4555 33 80 2 4556 185 1241 2 4557 26 53 2 4558 26 88 2 4559 30 191 2 4560 141 465 2 4561 57 454 2 4562 295 1144 2 4563 46 215 2 4564 70 658 2 4565 27 97 2 4566 24 75 2 4567 37 198 2 4568 25 102 2 4569 227 1426 2 4570 42 86 2 4571 25 65 2 4572 77 379 2 4573 26 77 2 4574 24 156 2 4575 27 50 2 4576 34 391 2 4577 29 130 2 4578 69 467 2 4579 25 54 2 4580 37 113 2 4581 29 126 2 4582 30 128 2 4583 21 52 2 4584 31 167 2 4585 24 66 2 4586 31 69 2 4587 31 145 2 4588 24 72 2 4589 51 78 2 4590 27 172 2 4591 39 438 2 4592 45 549 2 4593 25 86 2 4594 43 366 2 4595 51 737 2 4596 28 142 2 4597 22 67 2 4598 40 142 2 4599 33 185 2 4600 30 136 2 4601 34 306 2 4602 22 43 2 4603 28 75 2 4604 26 71 2 4605 52 252 2 4606 24 44 2 4607 23 33 2 4608 22 26 2 4609 24 71 2 4610 47 122 2 4611 26 61 2 4612 23 33 2 4613 21 53 2 4614 190 1167 2 4615 27 89 2 4616 21 44 2 4617 90 658 2 4618 21 48 2 4619 25 112 2 4620 62 254 2 4621 41 189 2 4622 21 32 2 4623 23 38 2 4624 20 43 3 1 1679 18404 3 2 254 923 3 3 47 362 3 4 724 4878 3 5 44 341 3 6 31 447 3 7 43 392 3 8 39 232 3 9 7681 65535 3 10 48 262 3 11 3445 10555 3 12 50 442 3 13 56 224 3 14 1264 5763 3 15 35 470 3 16 37 405 3 17 61 427 3 18 216 886 3 19 31 74 3 20 30 128 3 21 610 6344 3 22 66 385 3 23 43 188 3 24 288 2411 3 25 79 467 3 26 45 279 3 27 2657 9970 3 28 38 169 3 29 39 177 3 30 44 253 3 31 38 241 3 32 39 256 3 33 1356 10832 3 34 53 277 3 35 34 88 3 36 38 181 3 37 36 127 3 38 40 251 3 39 43 177 3 40 35 140 3 41 85 387 3 42 189 748 3 43 104 1010 3 44 59 383 3 45 96 674 3 46 90 1004 3 47 36 112 3 48 41 295 3 49 38 112 3 50 55 260 3 51 37 71 3 52 80 275 3 53 128 414 3 54 79 230 3 55 177 858 3 56 56 311 3 57 66 277 3 58 65 269 3 59 37 191 3 60 339 1670 3 61 58 229 3 62 142 542 3 63 7853 52000 3 64 30 75 3 65 4931 38766 3 66 35 72 3 67 25 90 3 68 30 64 3 69 117 881 3 70 292 1273 3 71 38 118 3 72 37 137 3 73 159 766 3 74 32 110 3 75 37 93 3 76 153 874 3 77 106 407 3 78 64 241 3 79 108 776 3 80 40 173 3 81 48 130 3 82 48 238 3 83 29 46 3 84 42 117 3 85 48 430 3 86 37 124 3 87 41 139 3 88 140 802 3 89 28 101 3 90 43 142 3 91 37 187 3 92 96 579 3 93 42 312 3 94 31 136 3 95 41 205 3 96 37 140 3 97 31 129 3 98 444 723 3 99 38 81 3 100 67 797 3 101 41 129 3 102 83 189 3 103 36 127 3 104 33 104 3 105 44 151 3 106 59 389 3 107 43 121 3 108 36 148 3 109 52 142 3 110 175 644 3 111 37 135 3 112 128 664 3 113 60 156 3 114 2593 10307 3 115 65 129 3 116 125 1040 3 117 139 794 3 118 55 129 3 119 44 239 3 120 33 76 3 121 124 880 3 122 31 98 3 123 38 113 3 124 62 293 3 125 49 140 3 126 103 434 3 127 28 64 3 128 558 1129 3 129 45 125 3 130 48 177 3 131 60 653 3 132 76 1223 3 133 4211 20741 3 134 36 105 3 135 72 454 3 136 73 431 3 137 220 717 3 138 55 297 3 139 193 1272 3 140 130 562 3 141 711 2976 3 142 45 370 3 143 47 834 3 144 32 194 3 145 36 227 3 146 349 686 3 147 83 485 3 148 63 181 3 149 69 305 3 150 97 1387 3 151 185 782 3 152 71 376 3 153 27 111 3 154 29 113 3 155 72 227 3 156 60 130 3 157 104 509 3 158 747 2633 3 159 71 330 3 160 34 238 3 161 63 405 3 162 61 244 3 163 47 178 3 164 521 2165 3 165 44 263 3 166 146 890 3 167 35 155 3 168 631 1969 3 169 103 1006 3 170 164 298 3 171 67 383 3 172 38 142 3 173 98 451 3 174 184 1281 3 175 34 308 3 176 455 1253 3 177 40 93 3 178 41 205 3 179 156 704 3 180 61 193 3 181 184 200 3 182 33 86 3 183 46 330 3 184 20 43 3 185 34 84 3 186 95 323 3 187 180 621 3 188 217 542 3 189 77 264 3 190 40 120 3 191 178 283 3 192 54 171 3 193 211 832 3 194 55 394 3 195 39 150 3 196 60 217 3 197 43 135 3 198 362 2744 3 199 278 1851 3 200 503 10090 3 201 35 338 3 202 35 62 3 203 85 317 3 204 318 898 3 205 39 151 3 206 113 528 3 207 284 574 3 208 37 232 3 209 398 2817 3 210 674 5738 3 211 31 65 3 212 59 94 3 213 160 552 3 214 123 425 3 215 127 940 3 216 219 921 3 217 242 2027 3 218 95 447 3 219 193 327 3 220 342 803 3 221 162 2096 3 222 63 238 3 223 45 163 3 224 60 389 3 225 42 160 3 226 789 4449 3 227 30 84 3 228 85 555 3 229 44 99 3 230 57 183 3 231 57 260 3 232 54 152 3 233 36 74 3 234 250 965 3 235 35 71 3 236 37 166 3 237 34 76 3 238 647 1113 3 239 61 207 3 240 59 216 3 241 84 226 3 242 101 379 3 243 310 850 3 244 123 790 3 245 38 171 3 246 65 277 3 247 74 386 3 248 80 329 3 249 136 900 3 250 53 413 3 251 281 1724 3 252 43 111 3 253 34 194 3 254 146 910 3 255 44 146 3 256 109 397 3 257 54 246 3 258 94 420 3 259 82 314 3 260 123 651 3 261 97 398 3 262 46 192 3 263 66 386 3 264 51 129 3 265 99 605 3 266 284 1632 3 267 52 138 3 268 55 138 3 269 62 414 3 270 44 79 3 271 296 956 3 272 107 370 3 273 31 54 3 274 34 57 3 275 53 154 3 276 281 1261 3 277 35 57 3 278 39 47 3 279 427 1124 3 280 122 2966 3 281 130 890 3 282 30 57 3 283 30 68 3 284 31 62 3 285 581 1751 3 286 30 56 3 287 112 591 3 288 56 264 3 289 100 137 3 290 1164 13050 3 291 773 2841 3 292 16725 35409 3 293 50 335 3 294 73 285 3 295 58 297 3 296 101 621 3 297 67 315 3 298 178 796 3 299 33 151 3 300 299 1433 3 301 2213 5289 3 302 228 1010 3 303 171 784 3 304 43 354 3 305 35 84 3 306 28 468 3 307 444 2150 3 308 34 63 3 309 38 72 3 310 78 572 3 311 93 592 3 312 306 1903 3 313 53 318 3 314 218 454 3 315 2542 15660 3 316 43 164 3 317 37 260 3 318 6279 35220 3 319 35 158 3 320 105 360 3 321 49 217 3 322 49 168 3 323 13396 27589 3 324 36 72 3 325 45 166 3 326 36 78 3 327 56 250 3 328 56 284 3 329 49 186 3 330 61 205 3 331 108 422 3 332 43 264 3 333 214 927 3 334 6619 26940 3 335 57 168 3 336 172 563 3 337 38 125 3 338 349 3237 3 339 52 323 3 340 90 523 3 341 124 539 3 342 41 88 3 343 56 435 3 344 40 127 3 345 162 1129 3 346 40 117 3 347 104 454 3 348 430 3004 3 349 51 160 3 350 56 286 3 351 71 266 3 352 286 1076 3 353 35 73 3 354 119 454 3 355 40 55 3 356 49 71 3 357 32 63 3 358 50 158 3 359 110 1024 3 360 79 343 3 361 31 107 3 362 129 352 3 363 189 292 3 364 310 1076 3 365 52 122 3 366 49 203 3 367 31 43 3 368 57 385 3 369 39 193 3 370 159 601 3 371 4069 4846 3 372 59 186 3 373 36 128 3 374 33 189 3 375 159 754 3 376 44 220 3 377 35 94 3 378 126 626 3 379 39 81 3 380 63 280 3 381 383 1941 3 382 97 643 3 383 49 211 3 384 180 1479 3 385 397 2939 3 386 35 101 3 387 93 245 3 388 97 307 3 389 43 166 3 390 695 2923 3 391 51 168 3 392 48 202 3 393 109 235 3 394 73 231 3 395 474 1403 3 396 99 330 3 397 66 273 3 398 284 2141 3 399 131 316 3 400 64 322 3 401 73 384 3 402 37 128 3 403 31 93 3 404 736 3670 3 405 60 137 3 406 95 531 3 407 795 2415 3 408 232 2888 3 409 35 106 3 410 32 101 3 411 30 114 3 412 805 1664 3 413 454 2133 3 414 1180 1520 3 415 51 201 3 416 39 122 3 417 122 395 3 418 39 92 3 419 1014 1676 3 420 42 195 3 421 87 468 3 422 32 138 3 423 62 199 3 424 540 4811 3 425 45 123 3 426 91 204 3 427 152 1152 3 428 1002 5201 3 429 203 1485 3 430 78 216 3 431 58 355 3 432 70 420 3 433 380 1194 3 434 765 2323 3 435 528 1772 3 436 38 105 3 437 305 505 3 438 38 152 3 439 93 369 3 440 181 932 3 441 51 249 3 442 56 202 3 443 39 112 3 444 40 128 3 445 146 312 3 446 40 117 3 447 138 446 3 448 59 314 3 449 112 550 3 450 56 229 3 451 44 113 3 452 32 61 3 453 1455 6005 3 454 49 123 3 455 1023 1986 3 456 92 641 3 457 54 127 3 458 55 168 3 459 104 604 3 460 66 253 3 461 1377 10268 3 462 40 142 3 463 156 923 3 464 36 119 3 465 196 914 3 466 30 88 3 467 54 151 3 468 330 1233 3 469 32 82 3 470 60 449 3 471 46 193 3 472 50 145 3 473 125 401 3 474 181 988 3 475 51 130 3 476 82 213 3 477 65 407 3 478 57 209 3 479 64 310 3 480 44 209 3 481 533 2337 3 482 31 67 3 483 34 436 3 484 45 228 3 485 48 137 3 486 30 105 3 487 52 202 3 488 49 137 3 489 80 228 3 490 50 107 3 491 47 1768 3 492 104 593 3 493 67 309 3 494 197 1581 3 495 40 57 3 496 650 2395 3 497 41 106 3 498 59 424 3 499 84 487 3 500 142 2440 3 501 111 512 3 502 518 3270 3 503 205 855 3 504 96 838 3 505 101 892 3 506 43 86 3 507 44 378 3 508 43 119 3 509 425 104 3 510 55 1126 3 511 44 157 3 512 80 270 3 513 751 5680 3 514 337 1802 3 515 99 1294 3 516 788 2741 3 517 260 1548 3 518 125 735 3 519 144 472 3 520 163 274 3 521 110 359 3 522 59 156 3 523 1042 6544 3 524 2101 6246 3 525 46 124 3 526 40 75 3 527 227 1051 3 528 29 118 3 529 40 316 3 530 51 114 3 531 180 416 3 532 49 331 3 533 73 637 3 534 32 235 3 535 133 1142 3 536 37 70 3 537 387 1836 3 538 321 766 3 539 92 1488 3 540 416 2674 3 541 75 291 3 542 161 685 3 543 29 78 3 544 727 3924 3 545 39 118 3 546 414 3476 3 547 487 3715 3 548 39 80 3 549 161 333 3 550 161 437 3 551 139 430 3 552 183 1996 3 553 111 387 3 554 37 88 3 555 51 108 3 556 95 169 3 557 48 245 3 558 216 685 3 559 685 3279 3 560 46 107 3 561 356 1898 3 562 43 90 3 563 228 902 3 564 130 561 3 565 1351 4652 3 566 362 2595 3 567 320 2332 3 568 60 138 3 569 42 71 3 570 46 165 3 571 93 662 3 572 35 68 3 573 373 2964 3 574 34 74 3 575 123 1040 3 576 48 197 3 577 149 1007 3 578 93 68 3 579 2603 26059 3 580 49 175 3 581 49 544 3 582 1997 15417 3 583 8297 38393 3 584 43 134 3 585 46 380 3 586 40 505 3 587 42 191 3 588 4600 11906 3 589 189 1727 3 590 43 483 3 591 43 599 3 592 36 506 3 593 184 778 3 594 35 154 3 595 57 398 3 596 38 178 3 597 38 108 3 598 47 6849 3 599 172 673 3 600 35 252 3 601 327 1285 3 602 107 1138 3 603 47 614 3 604 48 536 3 605 56 324 3 606 1379 5644 3 607 30 89 3 608 112 793 3 609 223 638 3 610 51 294 3 611 277 1590 3 612 68 189 3 613 42 76 3 614 37 265 3 615 55 283 3 616 35 177 3 617 108 425 3 618 88 639 3 619 66 302 3 620 116 359 3 621 125 397 3 622 9586 63879 3 623 8145 51546 3 624 9521 59657 3 625 46 115 3 626 42 359 3 627 283 1359 3 628 213 787 3 629 32 69 3 630 127 784 3 631 109 573 3 632 212 781 3 633 57 199 3 634 68 247 3 635 44 93 3 636 29 87 3 637 31 133 3 638 55 254 3 639 93 469 3 640 49 231 3 641 100 1710 3 642 37 56 3 643 9296 55062 3 644 42 55 3 645 502 973 3 646 37 65 3 647 100 430 3 648 242 733 3 649 109 746 3 650 64 153 3 651 69 403 3 652 48 101 3 653 28 73 3 654 80 189 3 655 252 1572 3 656 88 390 3 657 222 1223 3 658 1072 3810 3 659 336 887 3 660 104 495 3 661 52 159 3 662 37 93 3 663 37 209 3 664 47 97 3 665 53 394 3 666 34 297 3 667 200 779 3 668 81 371 3 669 49 167 3 670 288 1295 3 671 1989 40374 3 672 91 307 3 673 38 158 3 674 41 112 3 675 93 412 3 676 40 94 3 677 34 84 3 678 38 211 3 679 58 327 3 680 41 98 3 681 36 79 3 682 31 101 3 683 89 568 3 684 56 307 3 685 69 164 3 686 355 1439 3 687 38 98 3 688 49 202 3 689 80 532 3 690 175 527 3 691 65 144 3 692 92 879 3 693 98 335 3 694 193 554 3 695 118 691 3 696 49 230 3 697 46 267 3 698 58 226 3 699 40 69 3 700 44 139 3 701 97 241 3 702 86 302 3 703 285 852 3 704 54 166 3 705 38 129 3 706 134 433 3 707 41 89 3 708 103 840 3 709 187 463 3 710 51 201 3 711 365 906 3 712 37 176 3 713 47 84 3 714 567 16239 3 715 124 161 3 716 34 94 3 717 338 1901 3 718 218 940 3 719 31 108 3 720 42 163 3 721 31 127 3 722 65 268 3 723 89 668 3 724 348 4569 3 725 71 496 3 726 181 814 3 727 102 391 3 728 52 209 3 729 241 601 3 730 669 4214 3 731 464 614 3 732 207 3291 3 733 147 520 3 734 423 2347 3 735 193 748 3 736 1319 2771 3 737 48 142 3 738 201 491 3 739 49 102 3 740 224 436 3 741 178 744 3 742 369 804 3 743 175 236 3 744 264 1483 3 745 31 102 3 746 356 188 3 747 458 2163 3 748 321 1731 3 749 164 586 3 750 202 425 3 751 274 1629 3 752 534 2050 3 753 293 1887 3 754 270 2366 3 755 122 738 3 756 58 401 3 757 50 386 3 758 138 1116 3 759 291 890 3 760 58 493 3 761 38 339 3 762 58 293 3 763 241 1531 3 764 126 395 3 765 70 270 3 766 2116 8459 3 767 48 168 3 768 1085 768 3 769 655 17182 3 770 67 433 3 771 43 192 3 772 169 1484 3 773 33 73 3 774 218 1725 3 775 39 125 3 776 140 1538 3 777 296 2435 3 778 10465 31658 3 779 40 142 3 780 272 1419 3 781 49 571 3 782 1100 3526 3 783 478 1892 3 784 175 971 3 785 167 466 3 786 124 540 3 787 1075 3884 3 788 40 207 3 789 491 484 3 790 39 119 3 791 881 2704 3 792 52 271 3 793 328 1545 3 794 134 369 3 795 680 2459 3 796 1416 14469 3 797 39 82 3 798 158 710 3 799 111 494 3 800 185 880 3 801 168 1745 3 802 221 1057 3 803 103 1447 3 804 328 888 3 805 39 75 3 806 45 115 3 807 34 74 3 808 37 280 3 809 112 401 3 810 43 109 3 811 54 185 3 812 221 875 3 813 88 263 3 814 128 642 3 815 259 828 3 816 144 1010 3 817 54 140 3 818 161 1171 3 819 165 426 3 820 59 239 3 821 179 1826 3 822 68 301 3 823 40 68 3 824 52 239 3 825 481 1519 3 826 146 499 3 827 265 2505 3 828 61 305 3 829 44 110 3 830 81 141 3 831 204 626 3 832 111 895 3 833 153 340 3 834 175 771 3 835 1810 3579 3 836 39 446 3 837 255 570 3 838 231 1801 3 839 594 3752 3 840 178 976 3 841 40 56 3 842 138 483 3 843 167 1121 3 844 213 1464 3 845 115 1052 3 846 744 2338 3 847 343 1644 3 848 67 218 3 849 236 1018 3 850 83 247 3 851 81 110 3 852 384 1747 3 853 41 242 3 854 267 480 3 855 32 324 3 856 46 203 3 857 33 121 3 858 553 6834 3 859 46 66 3 860 67 269 3 861 52 167 3 862 149 1040 3 863 50 69 3 864 136 340 3 865 31 196 3 866 154 1713 3 867 46 152 3 868 2050 19240 3 869 34 166 3 870 153 616 3 871 53 327 3 872 54 232 3 873 225 860 3 874 70 670 3 875 45 622 3 876 2041 59483 3 877 70 484 3 878 86 525 3 879 33 198 3 880 120 506 3 881 55 473 3 882 37 110 3 883 30 70 3 884 91 324 3 885 32 209 3 886 38 125 3 887 40 337 3 888 63 330 3 889 48 487 3 890 42 242 3 891 6961 33558 3 892 59 120 3 893 157 721 3 894 228 970 3 895 253 859 3 896 7380 28626 3 897 87 453 3 898 987 10295 3 899 42 246 3 900 79 297 3 901 186 883 3 902 39 127 3 903 39 303 3 904 41 141 3 905 110 607 3 906 44 444 3 907 105 856 3 908 2193 12065 3 909 37 123 3 910 36 484 3 911 98 433 3 912 35 174 3 913 47 211 3 914 123 1790 3 915 4709 31123 3 916 191 1048 3 917 122 693 3 918 36 62 3 919 61 361 3 920 149 1067 3 921 230 1283 3 922 199 845 3 923 92 462 3 924 7582 29801 3 925 97 584 3 926 56 339 3 927 100 301 3 928 958 5738 3 929 59 391 3 930 137 733 3 931 40 81 3 932 52 132 3 933 45 90 3 934 62 174 3 935 32 66 3 936 86 370 3 937 59 342 3 938 234 751 3 939 174 1039 3 940 81 574 3 941 95 586 3 942 39 126 3 943 1311 2781 3 944 33 132 3 945 147 902 3 946 82 278 3 947 110 839 3 948 177 794 3 949 106 603 3 950 110 350 3 951 40 339 3 952 94 450 3 953 163 815 3 954 103 683 3 955 36 736 3 956 92 380 3 957 823 2597 3 958 45 229 3 959 419 1339 3 960 55 314 3 961 38 406 3 962 295 1215 3 963 130 580 3 964 125 745 3 965 143 652 3 966 127 621 3 967 46 384 3 968 173 587 3 969 743 3642 3 970 176 1106 3 971 62 259 3 972 261 1999 3 973 37 462 3 974 548 1814 3 975 171 912 3 976 341 1920 3 977 104 368 3 978 67 305 3 979 38 353 3 980 155 1113 3 981 124 1447 3 982 173 877 3 983 108 806 3 984 359 1011 3 985 50 837 3 986 227 1518 3 987 93 426 3 988 62 464 3 989 91 8249 3 990 4211 5689 3 991 159 800 3 992 39 216 3 993 261 2720 3 994 37 161 3 995 349 435 3 996 80 575 3 997 87 555 3 998 82 608 3 999 70 1004 3 1000 40 297 3 1001 42 124 3 1002 72 317 3 1003 73 987 3 1004 755 1133 3 1005 228 941 3 1006 41 1159 3 1007 120 359 3 1008 40 434 3 1009 46 145 3 1010 1011 1982 3 1011 123 838 3 1012 40 500 3 1013 95 604 3 1014 50 677 3 1015 47 229 3 1016 36 243 3 1017 470 3001 3 1018 146 837 3 1019 893 34400 3 1020 78 173 3 1021 53 184 3 1022 123 623 3 1023 40 116 3 1024 49 295 3 1025 260 1626 3 1026 56 230 3 1027 53 1270 3 1028 91 445 3 1029 179 1566 3 1030 40 300 3 1031 39 264 3 1032 37 212 3 1033 87 242 3 1034 167 803 3 1035 142 553 3 1036 42 196 3 1037 2006 12313 3 1038 45 228 3 1039 416 965 3 1040 57 231 3 1041 58 355 3 1042 52 235 3 1043 102 436 3 1044 74 305 3 1045 100 505 3 1046 53 380 3 1047 41 430 3 1048 278 840 3 1049 84 386 3 1050 72 435 3 1051 216 1288 3 1052 78 531 3 1053 35 184 3 1054 147 882 3 1055 141 519 3 1056 80 216 3 1057 35 76 3 1058 39 288 3 1059 809 6971 3 1060 64 434 3 1061 56 123 3 1062 45 279 3 1063 204 1816 3 1064 84 623 3 1065 2156 14823 3 1066 56 503 3 1067 66 466 3 1068 434 2535 3 1069 4048 18735 3 1070 48 221 3 1071 590 3680 3 1072 1654 21416 3 1073 61 110 3 1074 119 886 3 1075 45 138 3 1076 40 55 3 1077 226 1279 3 1078 47 195 3 1079 30 176 3 1080 121 3617 3 1081 110 461 3 1082 157 8195 3 1083 592 3945 3 1084 104 688 3 1085 37 144 3 1086 116 381 3 1087 69 482 3 1088 118 205 3 1089 65 148 3 1090 82 64 3 1091 52 200 3 1092 81 230 3 1093 83 372 3 1094 777 1132 3 1095 40 156 3 1096 102 473 3 1097 138 3127 3 1098 360 4028 3 1099 54 222 3 1100 39 352 3 1101 94 392 3 1102 296 2467 3 1103 66 370 3 1104 219 915 3 1105 105 170 3 1106 553 2648 3 1107 37 630 3 1108 129 1055 3 1109 111 867 3 1110 103 553 3 1111 77 440 3 1112 38 156 3 1113 53 578 3 1114 199 830 3 1115 128 629 3 1116 69 518 3 1117 98 373 3 1118 31 196 3 1119 274 2244 3 1120 29 311 3 1121 227 1727 3 1122 99 688 3 1123 181 514 3 1124 118 601 3 1125 257 1601 3 1126 410 1680 3 1127 116 875 3 1128 171 1441 3 1129 98 326 3 1130 665 2981 3 1131 225 1510 3 1132 122 807 3 1133 148 759 3 1134 50 189 3 1135 63 251 3 1136 164 1257 3 1137 61 287 3 1138 35 110 3 1139 29 106 3 1140 30 68 3 1141 86 244 3 1142 44 57 3 1143 1259 4473 3 1144 34 68 3 1145 61 280 3 1146 39 75 3 1147 186 1113 3 1148 154 260 3 1149 203 819 3 1150 32 176 3 1151 587 1534 3 1152 41 124 3 1153 124 356 3 1154 88 249 3 1155 47 161 3 1156 54 152 3 1157 2961 20929 3 1158 624 1219 3 1159 984 1643 3 1160 9101 26616 3 1161 3304 9228 3 1162 38 173 3 1163 10619 54742 3 1164 86 390 3 1165 116 645 3 1166 28 559 3 1167 49 453 3 1168 42 223 3 1169 57 178 3 1170 51 201 3 1171 30 100 3 1172 56 387 3 1173 224 962 3 1174 482 1108 3 1175 34 81 3 1176 684 9276 3 1177 41 159 3 1178 33 99 3 1179 89 298 3 1180 1445 6996 3 1181 41 560 3 1182 66 341 3 1183 67 332 3 1184 37 180 3 1185 48 298 3 1186 44 233 3 1187 49 291 3 1188 9573 27784 3 1189 60 227 3 1190 34 250 3 1191 30 61 3 1192 228 802 3 1193 32 53 3 1194 51 249 3 1195 33 184 3 1196 97 432 3 1197 52 173 3 1198 106 626 3 1199 37 187 3 1200 2944 10851 3 1201 36 206 3 1202 74 281 3 1203 76 302 3 1204 32 82 3 1205 172 1347 3 1206 146 1560 3 1207 40 120 3 1208 45 97 3 1209 134 464 3 1210 180 388 3 1211 34 86 3 1212 172 404 3 1213 1396 9546 3 1214 41 70 3 1215 73 446 3 1216 85 586 3 1217 501 1173 3 1218 48 123 3 1219 93 506 3 1220 59 299 3 1221 87 404 3 1222 91 260 3 1223 37 95 3 1224 37 52 3 1225 117 392 3 1226 45 92 3 1227 39 327 3 1228 97 621 3 1229 34 356 3 1230 28 261 3 1231 34 95 3 1232 100 415 3 1233 143 301 3 1234 54 212 3 1235 51 166 3 1236 4741 24037 3 1237 281 1016 3 1238 40 180 3 1239 41 128 3 1240 96 395 3 1241 144 831 3 1242 211 991 3 1243 35 119 3 1244 405 1198 3 1245 38 85 3 1246 44 190 3 1247 31 83 3 1248 36 166 3 1249 40 288 3 1250 27 300 3 1251 53 151 3 1252 65 138 3 1253 32 86 3 1254 68 320 3 1255 26 52 3 1256 81 366 3 1257 40 80 3 1258 35 82 3 1259 33 100 3 1260 46 108 3 1261 203 422 3 1262 38 109 3 1263 152 798 3 1264 31 82 3 1265 36 83 3 1266 37 235 3 1267 30 118 3 1268 49 204 3 1269 36 95 3 1270 177 530 3 1271 53 240 3 1272 38 173 3 1273 65 305 3 1274 5012 44616 3 1275 38 126 3 1276 36 64 3 1277 40 282 3 1278 372 2076 3 1279 33 117 3 1280 89 286 3 1281 32 163 3 1282 103 903 3 1283 45 222 3 1284 53 160 3 1285 34 52 3 1286 58 129 3 1287 64 294 3 1288 629 954 3 1289 45 156 3 1290 37 82 3 1291 71 368 3 1292 42 118 3 1293 81 238 3 1294 51 125 3 1295 93 262 3 1296 292 994 3 1297 69 362 3 1298 40 76 3 1299 105 490 3 1300 37 77 3 1301 77 479 3 1302 64 165 3 1303 30 123 3 1304 115 529 3 1305 47 311 3 1306 35 265 3 1307 76 512 3 1308 201 626 3 1309 84 112 3 1310 66 163 3 1311 30 84 3 1312 326 3052 3 1313 182 866 3 1314 168 795 3 1315 80 363 3 1316 76 298 3 1317 316 1885 3 1318 62 297 3 1319 31 93 3 1320 101 453 3 1321 112 944 3 1322 36 88 3 1323 216 1282 3 1324 85 341 3 1325 3548 9309 3 1326 30 100 3 1327 91 427 3 1328 888 7127 3 1329 37 85 3 1330 91 545 3 1331 28 70 3 1332 93 416 3 1333 77 299 3 1334 180 412 3 1335 39 134 3 1336 69 181 3 1337 65 324 3 1338 78 197 3 1339 42 179 3 1340 83 365 3 1341 67 224 3 1342 129 960 3 1343 47 235 3 1344 36 320 3 1345 92 464 3 1346 43 107 3 1347 28 61 3 1348 103 661 3 1349 40 144 3 1350 116 314 3 1351 152 454 3 1352 137 519 3 1353 60 144 3 1354 159 780 3 1355 53 153 3 1356 219 2176 3 1357 35 108 3 1358 85 263 3 1359 35 80 3 1360 40 87 3 1361 129 525 3 1362 90 338 3 1363 83 419 3 1364 65 272 3 1365 210 730 3 1366 222 1365 3 1367 379 1351 3 1368 50 229 3 1369 46 167 3 1370 624 2495 3 1371 37 2834 3 1372 35 91 3 1373 61 301 3 1374 50 144 3 1375 91 285 3 1376 35 88 3 1377 32 79 3 1378 35 142 3 1379 45 180 3 1380 114 838 3 1381 39 155 3 1382 40 152 3 1383 31 51 3 1384 63 214 3 1385 42 84 3 1386 143 197 3 1387 50 144 3 1388 160 631 3 1389 34 66 3 1390 44 163 3 1391 32 68 3 1392 58 433 3 1393 30 81 3 1394 70 203 3 1395 869 2955 3 1396 44 129 3 1397 26 58 3 1398 43 121 3 1399 39 218 3 1400 75 236 3 1401 132 800 3 1402 98 189 3 1403 71 347 3 1404 40 476 3 1405 91 1975 3 1406 55 173 3 1407 48 416 3 1408 39 493 3 1409 33 876 3 1410 30 112 3 1411 374 1412 3 1412 73 515 3 1413 35 89 3 1414 63 182 3 1415 144 605 3 1416 49 188 3 1417 52 278 3 1418 53 141 3 1419 43 279 3 1420 36 75 3 1421 172 1743 3 1422 116 981 3 1423 145 231 3 1424 137 923 3 1425 73 553 3 1426 55 330 3 1427 486 1854 3 1428 59 201 3 1429 38 159 3 1430 112 283 3 1431 62 191 3 1432 132 1553 3 1433 35 115 3 1434 49 194 3 1435 37 81 3 1436 149 1143 3 1437 65 200 3 1438 83 482 3 1439 33 77 3 1440 477 2329 3 1441 45 146 3 1442 104 472 3 1443 32 79 3 1444 218 458 3 1445 79 218 3 1446 277 4649 3 1447 536 2114 3 1448 43 89 3 1449 112 549 3 1450 105 303 3 1451 7382 35686 3 1452 179 2554 3 1453 36 194 3 1454 122 1096 3 1455 89 311 3 1456 733 7976 3 1457 5362 27117 3 1458 47 221 3 1459 69 431 3 1460 159 1040 3 1461 38 56 3 1462 84 259 3 1463 125 206 3 1464 45 123 3 1465 46 179 3 1466 99 915 3 1467 35 138 3 1468 3418 9829 3 1469 180 843 3 1470 53 326 3 1471 196 920 3 1472 1389 4085 3 1473 142 469 3 1474 155 2469 3 1475 163 856 3 1476 1731 7468 3 1477 73 239 3 1478 111 578 3 1479 47 275 3 1480 40 55 3 1481 56 186 3 1482 41 48 3 1483 453 1352 3 1484 353 775 3 1485 1623 10124 3 1486 232 713 3 1487 63 282 3 1488 63 253 3 1489 43 343 3 1490 318 1520 3 1491 210 1661 3 1492 40 120 3 1493 42 170 3 1494 31 280 3 1495 4169 20220 3 1496 37 60 3 1497 67 90 3 1498 160 869 3 1499 41 86 3 1500 45 207 3 1501 193 466 3 1502 42 105 3 1503 83 330 3 1504 31 1549 3 1505 41 107 3 1506 1123 3234 3 1507 44 159 3 1508 46 129 3 1509 35 49 3 1510 121 1112 3 1511 35 62 3 1512 791 1945 3 1513 37 55 3 1514 37 60 3 1515 105 1104 3 1516 35 70 3 1517 91 380 3 1518 316 1479 3 1519 264 2152 3 1520 54 184 3 1521 62 354 3 1522 34 44 3 1523 83 465 3 1524 981 2667 3 1525 39 64 3 1526 141 720 3 1527 55 169 3 1528 76 375 3 1529 37 106 3 1530 74 319 3 1531 34 77 3 1532 43 149 3 1533 153 697 3 1534 39 87 3 1535 32 65 3 1536 33 83 3 1537 1883 5699 3 1538 148 2326 3 1539 188 6718 3 1540 260 1753 3 1541 32 157 3 1542 184 2265 3 1543 75 795 3 1544 37 85 3 1545 62 289 3 1546 108 922 3 1547 1456 7522 3 1548 115 740 3 1549 62 154 3 1550 210 278 3 1551 59 306 3 1552 392 331 3 1553 67 261 3 1554 157 997 3 1555 43 128 3 1556 81 248 3 1557 29 105 3 1558 62 145 3 1559 96 519 3 1560 58 219 3 1561 164 338 3 1562 157 540 3 1563 72 292 3 1564 505 2511 3 1565 56 112 3 1566 108 909 3 1567 63 213 3 1568 131 626 3 1569 73 374 3 1570 41 87 3 1571 36 83 3 1572 46 335 3 1573 3231 7001 3 1574 338 3331 3 1575 322 1429 3 1576 64 258 3 1577 86 241 3 1578 57 265 3 1579 63 403 3 1580 33 100 3 1581 50 238 3 1582 41 127 3 1583 176 916 3 1584 91 627 3 1585 48 68 3 1586 175 610 3 1587 185 830 3 1588 219 1224 3 1589 116 810 3 1590 71 269 3 1591 55 191 3 1592 69 204 3 1593 143 961 3 1594 47 169 3 1595 414 2589 3 1596 47 353 3 1597 51 129 3 1598 1216 2721 3 1599 35 70 3 1600 154 1288 3 1601 95 417 3 1602 327 1167 3 1603 268 1982 3 1604 45 248 3 1605 316 991 3 1606 109 424 3 1607 113 534 3 1608 108 443 3 1609 5119 8861 3 1610 36 67 3 1611 504 2528 3 1612 252 1442 3 1613 447 1358 3 1614 59 691 3 1615 52 205 3 1616 35 68 3 1617 33 60 3 1618 54 130 3 1619 108 839 3 1620 33 74 3 1621 117 808 3 1622 53 231 3 1623 55 166 3 1624 36 76 3 1625 76 353 3 1626 44 360 3 1627 667 2180 3 1628 37 110 3 1629 916 4901 3 1630 68 211 3 1631 2102 9606 3 1632 329 2621 3 1633 38 50 3 1634 46 307 3 1635 36 59 3 1636 42 124 3 1637 426 2070 3 1638 43 129 3 1639 28 67 3 1640 43 59 3 1641 85 292 3 1642 49 222 3 1643 93 408 3 1644 92 188 3 1645 54 152 3 1646 37 98 3 1647 63 275 3 1648 86 366 3 1649 36 81 3 1650 46 75 3 1651 154 614 3 1652 939 5611 3 1653 585 3257 3 1654 64 166 3 1655 31 183 3 1656 877 698 3 1657 38 98 3 1658 709 2154 3 1659 32 212 3 1660 134 1317 3 1661 50 139 3 1662 1084 2679 3 1663 88 827 3 1664 61 252 3 1665 195 842 3 1666 360 2684 3 1667 74 975 3 1668 100 322 3 1669 229 2989 3 1670 4558 9428 3 1671 40 133 3 1672 905 4715 3 1673 39 103 3 1674 249 1456 3 1675 34 126 3 1676 37 117 3 1677 143 1152 3 1678 119 1001 3 1679 109 821 3 1680 50 556 3 1681 31 78 3 1682 2261 8157 3 1683 35 114 3 1684 32 61 3 1685 126 494 3 1686 417 1036 3 1687 83 468 3 1688 85 575 3 1689 47 150 3 1690 455 2144 3 1691 394 881 3 1692 141 1525 3 1693 60 494 3 1694 43 328 3 1695 42 91 3 1696 45 221 3 1697 60 158 3 1698 40 258 3 1699 135 893 3 1700 44 184 3 1701 50 88 3 1702 57 379 3 1703 97 769 3 1704 50 192 3 1705 274 1656 3 1706 71 340 3 1707 290 1733 3 1708 106 736 3 1709 365 4281 3 1710 799 2935 3 1711 66 168 3 1712 35 75 3 1713 45 108 3 1714 57 98 3 1715 68 286 3 1716 95 664 3 1717 76 326 3 1718 34 59 3 1719 73 459 3 1720 32 60 3 1721 116 1014 3 1722 44 242 3 1723 126 734 3 1724 115 1462 3 1725 100 440 3 1726 45 67 3 1727 535 1481 3 1728 609 9948 3 1729 355 1919 3 1730 50 89 3 1731 46 106 3 1732 110 1480 3 1733 64 716 3 1734 127 791 3 1735 3886 27037 3 1736 51 114 3 1737 750 2131 3 1738 40 137 3 1739 39 170 3 1740 104 144 3 1741 42 130 3 1742 74 282 3 1743 80 435 3 1744 63 329 3 1745 34 75 3 1746 43 92 3 1747 38 65 3 1748 50 97 3 1749 174 682 3 1750 64 272 3 1751 95 361 3 1752 34 119 3 1753 37 77 3 1754 130 554 3 1755 110 525 3 1756 1562 14003 3 1757 171 1103 3 1758 47 216 3 1759 929 2285 3 1760 77 317 3 1761 44 85 3 1762 10728 59122 3 1763 115 221 3 1764 50 243 3 1765 114 194 3 1766 928 2164 3 1767 164 450 3 1768 58 258 3 1769 50 454 3 1770 46 186 3 1771 61 204 3 1772 105 1089 3 1773 83 547 3 1774 1028 2530 3 1775 38 92 3 1776 4541 46667 3 1777 107 556 3 1778 43 242 3 1779 164 533 3 1780 47 116 3 1781 630 6686 3 1782 729 1059 3 1783 470 2293 3 1784 58 401 3 1785 40 54 3 1786 53 221 3 1787 52 162 3 1788 223 1424 3 1789 130 694 3 1790 57 291 3 1791 175 516 3 1792 48 128 3 1793 405 1042 3 1794 163 668 3 1795 292 844 3 1796 86 310 3 1797 156 805 3 1798 132 464 3 1799 78 491 3 1800 228 705 3 1801 1326 13247 3 1802 42 59 3 1803 551 836 3 1804 27 97 3 1805 66 360 3 1806 59 229 3 1807 43 194 3 1808 138 1231 3 1809 352 1087 3 1810 276 2043 3 1811 72 551 3 1812 51 122 3 1813 58 176 3 1814 40 120 3 1815 65 400 3 1816 111 838 3 1817 42 148 3 1818 51 194 3 1819 694 2026 3 1820 308 5002 3 1821 111 296 3 1822 934 4985 3 1823 285 1570 3 1824 85 421 3 1825 102 621 3 1826 68 287 3 1827 30 122 3 1828 150 440 3 1829 252 667 3 1830 526 1003 3 1831 41 186 3 1832 1126 4568 3 1833 60 323 3 1834 61 196 3 1835 32 201 3 1836 38 79 3 1837 41 78 3 1838 66 145 3 1839 49 130 3 1840 34 67 3 1841 257 920 3 1842 107 334 3 1843 48 203 3 1844 46 157 3 1845 55 203 3 1846 41 253 3 1847 232 423 3 1848 144 238 3 1849 202 1163 3 1850 159 525 3 1851 86 698 3 1852 35 128 3 1853 31 147 3 1854 42 134 3 1855 39 98 3 1856 46 52 3 1857 159 1022 3 1858 85 647 3 1859 559 3460 3 1860 36 98 3 1861 61 1007 3 1862 35 105 3 1863 53 92 3 1864 99 336 3 1865 225 1244 3 1866 91 257 3 1867 112 960 3 1868 68 107 3 1869 211 738 3 1870 1534 8358 3 1871 54 379 3 1872 80 933 3 1873 362 1264 3 1874 65 272 3 1875 203 309 3 1876 329 537 3 1877 64 319 3 1878 58 208 3 1879 92 457 3 1880 59 179 3 1881 92 178 3 1882 76 627 3 1883 50 105 3 1884 207 1124 3 1885 67 280 3 1886 396 2629 3 1887 78 342 3 1888 45 168 3 1889 79 174 3 1890 194 1294 3 1891 131 665 3 1892 67 284 3 1893 35 157 3 1894 39 245 3 1895 187 486 3 1896 34 126 3 1897 424 2404 3 1898 562 2987 3 1899 271 1778 3 1900 98 1659 3 1901 1317 15769 3 1902 49 174 3 1903 285 386 3 1904 55 88 3 1905 144 832 3 1906 425 952 3 1907 44 145 3 1908 300 1001 3 1909 522 2282 3 1910 64 333 3 1911 62 158 3 1912 199 1066 3 1913 54 228 3 1914 142 396 3 1915 50 125 3 1916 47 72 3 1917 163 3308 3 1918 75 180 3 1919 34 91 3 1920 100 1972 3 1921 211 1170 3 1922 50 258 3 1923 114 350 3 1924 525 1797 3 1925 54 766 3 1926 82 251 3 1927 186 832 3 1928 74 302 3 1929 84 120 3 1930 154 1610 3 1931 111 698 3 1932 126 708 3 1933 44 111 3 1934 630 331 3 1935 35 95 3 1936 989 400 3 1937 48 130 3 1938 215 655 3 1939 2129 7954 3 1940 145 789 3 1941 231 2475 3 1942 265 1689 3 1943 109 483 3 1944 45 197 3 1945 302 2471 3 1946 367 1965 3 1947 33 92 3 1948 46 219 3 1949 68 184 3 1950 225 521 3 1951 41 477 3 1952 40 142 3 1953 42 133 3 1954 1128 3801 3 1955 406 1695 3 1956 192 1154 3 1957 75 289 3 1958 102 239 3 1959 112 1829 3 1960 510 1415 3 1961 35 67 3 1962 1195 3176 3 1963 46 78 3 1964 41 111 3 1965 52 163 3 1966 61 425 3 1967 64 168 3 1968 62 350 3 1969 64 205 3 1970 212 370 3 1971 172 729 3 1972 117 1587 3 1973 1220 9241 3 1974 206 695 3 1975 176 1445 3 1976 109 785 3 1977 49 279 3 1978 127 1373 3 1979 81 566 3 1980 122 579 3 1981 113 5958 3 1982 114 328 3 1983 165 1258 3 1984 39 77 3 1985 425 4279 3 1986 28 100 3 1987 436 1503 3 1988 117 1045 3 1989 153 460 3 1990 136 2318 3 1991 263 2642 3 1992 269 2625 3 1993 54 170 3 1994 34 77 3 1995 88 461 3 1996 70 1359 3 1997 431 3338 3 1998 82 280 3 1999 4825 45913 3 2000 57 1255 3 2001 143 616 3 2002 110 527 3 2003 259 499 3 2004 283 511 3 2005 44 269 3 2006 142 615 3 2007 122 299 3 2008 810 1820 3 2009 33 49 3 2010 240 1914 3 2011 42 51 3 2012 669 4537 3 2013 123 237 3 2014 166 1798 3 2015 655 796 3 2016 267 1705 3 2017 779 4935 3 2018 36 133 3 2019 34 73 3 2020 187 963 3 2021 34 93 3 2022 202 2264 3 2023 97 440 3 2024 2116 18583 3 2025 37 69 3 2026 197 796 3 2027 66 264 3 2028 2924 9388 3 2029 134 625 3 2030 292 839 3 2031 32 250 3 2032 39 203 3 2033 582 2333 3 2034 42 364 3 2035 39 168 3 2036 54 285 3 2037 49 282 3 2038 104 324 3 2039 32 47 3 2040 87 235 3 2041 37 74 3 2042 39 169 3 2043 101 593 3 2044 96 506 3 2045 48 228 3 2046 79 340 3 2047 39 305 3 2048 7573 27116 3 2049 44 179 3 2050 143 566 3 2051 13133 65535 3 2052 49 358 3 2053 39 126 3 2054 69 290 3 2055 184 1901 3 2056 66 400 3 2057 35 106 3 2058 35 116 3 2059 78 233 3 2060 65 252 3 2061 35 143 3 2062 127 451 3 2063 33 261 3 2064 265 971 3 2065 45 283 3 2066 57 533 3 2067 39 295 3 2068 56 569 3 2069 34 142 3 2070 241 1718 3 2071 48 251 3 2072 267 732 3 2073 35 106 3 2074 36 57 3 2075 113 584 3 2076 87 86 3 2077 33 225 3 2078 31 107 3 2079 160 547 3 2080 42 102 3 2081 372 1986 3 2082 843 5095 3 2083 68 517 3 2084 57 465 3 2085 63 431 3 2086 1440 8954 3 2087 45 117 3 2088 49 406 3 2089 49 67 3 2090 448 2859 3 2091 41 71 3 2092 159 3248 3 2093 109 778 3 2094 115 615 3 2095 279 1349 3 2096 228 786 3 2097 970 4742 3 2098 91 477 3 2099 804 7760 3 2100 1245 7371 3 2101 103 517 3 2102 209 1709 3 2103 76 593 3 2104 37 224 3 2105 245 1893 3 2106 42 418 3 2107 31 113 3 2108 34 128 3 2109 46 111 3 2110 83 346 3 2111 59 338 3 2112 99 354 3 2113 562 3257 3 2114 180 455 3 2115 44 342 3 2116 91 1659 3 2117 949 4240 3 2118 441 970 3 2119 126 2525 3 2120 285 1403 3 2121 153 701 3 2122 91 434 3 2123 47 186 3 2124 446 2310 3 2125 1188 7104 3 2126 245 584 3 2127 50 551 3 2128 30 86 3 2129 137 1068 3 2130 134 394 3 2131 73 717 3 2132 28 157 3 2133 81 312 3 2134 48 283 3 2135 29 528 3 2136 90 887 3 2137 230 1646 3 2138 114 612 3 2139 192 533 3 2140 170 546 3 2141 69 288 3 2142 50 459 3 2143 38 6873 3 2144 171 233 3 2145 195 895 3 2146 63 384 3 2147 59 417 3 2148 32 180 3 2149 572 2141 3 2150 348 1433 3 2151 1663 7112 3 2152 41 365 3 2153 509 2378 3 2154 45 530 3 2155 140 1357 3 2156 59 219 3 2157 55 160 3 2158 114 775 3 2159 163 766 3 2160 239 1208 3 2161 130 516 3 2162 34 167 3 2163 83 321 3 2164 31 143 3 2165 494 1343 3 2166 170 336 3 2167 1759 9480 3 2168 50 504 3 2169 144 1018 3 2170 154 1635 3 2171 758 3727 3 2172 69 496 3 2173 143 1248 3 2174 117 1333 3 2175 35 83 3 2176 33 143 3 2177 70 177 3 2178 45 125 3 2179 224 1189 3 2180 42 156 3 2181 78 365 3 2182 41 167 3 2183 203 1600 3 2184 97 738 3 2185 61 1041 3 2186 214 890 3 2187 986 13487 3 2188 166 755 3 2189 381 2084 3 2190 428 1448 3 2191 358 1966 3 2192 36 103 3 2193 69 315 3 2194 36 201 3 2195 540 2924 3 2196 624 1939 3 2197 241 1754 3 2198 95 133 3 2199 64 265 3 2200 83 268 3 2201 67 370 3 2202 69 601 3 2203 540 2544 3 2204 165 1181 3 2205 683 4365 3 2206 45 196 3 2207 1224 8747 3 2208 79 593 3 2209 349 1108 3 2210 5565 24709 3 2211 70 205 3 2212 30 83 3 2213 418 4912 3 2214 128 550 3 2215 38 74 3 2216 39 92 3 2217 116 1005 3 2218 30 175 3 2219 900 14109 3 2220 42 351 3 2221 51 358 3 2222 49 338 3 2223 31 289 3 2224 96 832 3 2225 56 211 3 2226 87 448 3 2227 29 124 3 2228 39 1965 3 2229 136 631 3 2230 94 374 3 2231 581 1099 3 2232 773 20251 3 2233 160 609 3 2234 188 1293 3 2235 38 175 3 2236 948 2118 3 2237 65 567 3 2238 759 4184 3 2239 563 6313 3 2240 38 361 3 2241 68 588 3 2242 519 2572 3 2243 347 1552 3 2244 96 947 3 2245 36 68 3 2246 121 791 3 2247 93 566 3 2248 5167 41027 3 2249 191 851 3 2250 415 2499 3 2251 41 115 3 2252 1276 6811 3 2253 47 119 3 2254 254 1290 3 2255 122 840 3 2256 518 4560 3 2257 51 396 3 2258 1839 1875 3 2259 70 1879 3 2260 689 2201 3 2261 49 213 3 2262 51 246 3 2263 147 105 3 2264 33 122 3 2265 418 1148 3 2266 34 64 3 2267 29 107 3 2268 126 521 3 2269 35 98 3 2270 131 763 3 2271 289 1523 3 2272 513 2137 3 2273 107 379 3 2274 34 277 3 2275 247 1101 3 2276 144 867 3 2277 1085 5464 3 2278 189 789 3 2279 347 3127 3 2280 93 4611 3 2281 49 281 3 2282 149 1721 3 2283 797 6477 3 2284 239 1246 3 2285 35 179 3 2286 36 100 3 2287 102 455 3 2288 35 120 3 2289 35 387 3 2290 39 253 3 2291 31 348 3 2292 29 143 3 2293 119 682 3 2294 157 725 3 2295 45 445 3 2296 44 86 3 2297 205 1705 3 2298 33 80 3 2299 199 1464 3 2300 72 573 3 2301 126 1250 3 2302 117 200 3 2303 341 2636 3 2304 737 6808 3 2305 556 1282 3 2306 80 863 3 2307 342 2521 3 2308 298 1784 3 2309 55 197 3 2310 35 108 3 2311 735 4565 3 2312 55 137 3 2313 2225 18140 3 2314 2468 10830 3 2315 3541 7800 3 2316 4994 10297 3 2317 30 59 3 2318 43 288 3 2319 37 173 3 2320 30 187 3 2321 31 92 3 2322 34 72 3 2323 250 1310 3 2324 54 269 3 2325 36 87 3 2326 47 440 3 2327 35 86 3 2328 4025 23636 3 2329 270 1037 3 2330 2546 11604 3 2331 41 84 3 2332 768 997 3 2333 37 282 3 2334 2587 6927 3 2335 45 206 3 2336 45 281 3 2337 35 88 3 2338 37 99 3 2339 55 419 3 2340 72 390 3 2341 33 418 3 2342 38 157 3 2343 32 103 3 2344 36 170 3 2345 30 75 3 2346 32 83 3 2347 38 287 3 2348 30 245 3 2349 33 229 3 2350 92 1084 3 2351 1197 14581 3 2352 46 216 3 2353 44 393 3 2354 32 379 3 2355 98 552 3 2356 29 199 3 2357 57 278 3 2358 8559 52784 3 2359 206 1473 3 2360 8590 49658 3 2361 48 86 3 2362 44 194 3 2363 1125 3563 3 2364 47 190 3 2365 106 453 3 2366 58 335 3 2367 32 99 3 2368 30 90 3 2369 74 400 3 2370 55 325 3 2371 37 156 3 2372 52 279 3 2373 44 174 3 2374 58 173 3 2375 1902 19267 3 2376 29 59 3 2377 63 274 3 2378 41 137 3 2379 959 6842 3 2380 39 32 3 2381 43 180 3 2382 143 439 3 2383 41 252 3 2384 56 258 3 2385 76 319 3 2386 75 280 3 2387 38 118 3 2388 97 796 3 2389 264 941 3 2390 40 97 3 2391 427 434 3 2392 47 268 3 2393 38 122 3 2394 79 298 3 2395 64 179 3 2396 35 337 3 2397 29 119 3 2398 36 144 3 2399 32 114 3 2400 31 114 3 2401 49 213 3 2402 36 93 3 2403 42 238 3 2404 79 338 3 2405 27 141 3 2406 37 97 3 2407 79 219 3 2408 27 122 3 2409 26 89 3 2410 45 133 3 2411 40 100 3 2412 30 54 3 2413 32 80 3 2414 33 116 3 2415 30 71 3 2416 27 79 3 2417 33 114 3 2418 157 413 3 2419 24 65 3 2420 44 171 3 2421 32 55 3 2422 106 425 3 2423 35 126 3 2424 37 146 3 2425 33 107 3 2426 37 133 3 2427 207 840 3 2428 212 1605 3 2429 42 96 3 2430 56 215 3 2431 30 155 3 2432 68 283 3 2433 51 206 3 2434 39 135 3 2435 38 77 3 2436 84 347 3 2437 36 72 3 2438 68 208 3 2439 101 540 3 2440 41 78 3 2441 48 148 3 2442 68 153 3 2443 129 858 3 2444 226 390 3 2445 63 176 3 2446 41 103 3 2447 98 599 3 2448 70 397 3 2449 55 267 3 2450 49 186 3 2451 27 56 3 2452 118 707 3 2453 62 285 3 2454 102 567 3 2455 120 850 3 2456 46 168 3 2457 62 227 3 2458 133 695 3 2459 53 226 3 2460 84 538 3 2461 356 1425 3 2462 2872 13314 3 2463 42 103 3 2464 46 177 3 2465 49 392 3 2466 59 2595 3 2467 34 75 3 2468 44 104 3 2469 35 58 3 2470 255 53989 3 2471 31 70 3 2472 36 189 3 2473 31 47 3 2474 127 663 3 2475 68 215 3 2476 247 487 3 2477 33 98 3 2478 83 1056 3 2479 29 91 3 2480 120 386 3 2481 32 57 3 2482 314 1077 3 2483 38 164 3 2484 35 208 3 2485 48 296 3 2486 404 2559 3 2487 28 110 3 2488 40 89 3 2489 254 432 3 2490 44 182 3 2491 106 383 3 2492 30 110 3 2493 59 180 3 2494 32 270 3 2495 31 86 3 2496 36 90 3 2497 33 125 3 2498 117 1206 3 2499 55 279 3 2500 86 474 3 2501 30 72 3 2502 128 484 3 2503 120 438 3 2504 93 411 3 2505 49 533 3 2506 50 152 3 2507 48 316 3 2508 36 95 3 2509 40 120 3 2510 63 450 3 2511 402 1419 3 2512 89 275 3 2513 48 147 3 2514 229 2793 3 2515 66 196 3 2516 55 116 3 2517 489 1793 3 2518 31 193 3 2519 136 1118 3 2520 41 82 3 2521 56 393 3 2522 59 154 3 2523 442 3134 3 2524 31 67 3 2525 241 1293 3 2526 35 69 3 2527 422 1445 3 2528 36 51 3 2529 28 72 3 2530 30 74 3 2531 208 1493 3 2532 118 839 3 2533 141 710 3 2534 43 354 3 2535 31 96 3 2536 56 132 3 2537 283 1408 3 2538 34 94 3 2539 36 104 3 2540 44 156 3 2541 56 128 3 2542 404 2866 3 2543 988 1558 3 2544 57 196 3 2545 32 74 3 2546 157 1072 3 2547 36 81 3 2548 42 185 3 2549 133 613 3 2550 69 542 3 2551 55 105 3 2552 47 246 3 2553 36 96 3 2554 42 60 3 2555 30 116 3 2556 47 73 3 2557 99 517 3 2558 54 156 3 2559 112 594 3 2560 41 78 3 2561 117 1030 3 2562 44 200 3 2563 147 796 3 2564 61 250 3 2565 103 515 3 2566 30 65 3 2567 408 949 3 2568 41 156 3 2569 54 254 3 2570 137 560 3 2571 33 131 3 2572 100 2997 3 2573 107 230 3 2574 59 142 3 2575 59 200 3 2576 74 511 3 2577 31 83 3 2578 141 1322 3 2579 107 1097 3 2580 93 529 3 2581 38 233 3 2582 43 320 3 2583 91 414 3 2584 97 109 3 2585 27 65 3 2586 37 277 3 2587 99 227 3 2588 67 835 3 2589 30 49 3 2590 101 663 3 2591 37 50 3 2592 43 378 3 2593 33 100 3 2594 42 114 3 2595 44 183 3 2596 102 1195 3 2597 48 93 3 2598 96 1052 3 2599 25 72 3 2600 39 131 3 2601 169 292 3 2602 1799 18656 3 2603 5121 25399 3 2604 1546 908 3 2605 322 2028 3 2606 51 308 3 2607 45 175 3 2608 2288 6043 3 2609 1247 5563 3 2610 35 310 3 2611 43 276 3 2612 1378 6238 3 2613 220 1164 3 2614 334 2032 3 2615 44 230 3 2616 199 1826 3 2617 32 50 3 2618 172 461 3 2619 3904 22570 3 2620 29 80 3 2621 1265 6193 3 2622 31 305 3 2623 381 898 3 2624 200 656 3 2625 821 4004 3 2626 80 500 3 2627 34 262 3 2628 10350 21115 3 2629 373 874 3 2630 1327 5138 3 2631 31 71 3 2632 1214 3527 3 2633 78 740 3 2634 43 253 3 2635 1772 6626 3 2636 47 146 3 2637 58 183 3 2638 204 853 3 2639 74 179 3 2640 367 2801 3 2641 1081 6940 3 2642 199 406 3 2643 176 826 3 2644 1102 16363 3 2645 1522 8694 3 2646 2308 6105 3 2647 248 914 3 2648 36 126 3 2649 714 1876 3 2650 44 405 3 2651 35 151 3 2652 34 162 3 2653 34 127 3 2654 132 618 3 2655 163 442 3 2656 44 143 3 2657 238 958 3 2658 32 196 3 2659 301 1492 3 2660 26 89 3 2661 1524 5224 3 2662 88 358 3 2663 1293 4337 3 2664 16094 65535 3 2665 27 66 3 2666 33 67 3 2667 29 56 3 2668 45 195 3 2669 43 62 3 2670 36 106 3 2671 113 281 3 2672 224 1788 3 2673 49 319 3 2674 93 213 3 2675 1242 3783 3 2676 90 469 3 2677 58 537 3 2678 96 520 3 2679 61 424 3 2680 115 471 3 2681 129 593 3 2682 251 1909 3 2683 118 827 3 2684 225 1101 3 2685 34 108 3 2686 327 973 3 2687 56 344 3 2688 51 209 3 2689 34 163 3 2690 62 243 3 2691 104 407 3 2692 92 287 3 2693 60 205 3 2694 381 558 3 2695 31 134 3 2696 125 1104 3 2697 60 387 3 2698 141 639 3 2699 94 319 3 2700 68 284 3 2701 35 85 3 2702 55 231 3 2703 87 219 3 2704 69 333 3 2705 270 1604 3 2706 42 130 3 2707 39 57 3 2708 188 2039 3 2709 303 1600 3 2710 4883 22193 3 2711 418 1310 3 2712 320 1029 3 2713 728 2958 3 2714 44 388 3 2715 60 188 3 2716 118 646 3 2717 102 397 3 2718 38 175 3 2719 58 374 3 2720 124 213 3 2721 39 98 3 2722 53 212 3 2723 50 192 3 2724 249 1668 3 2725 603 2169 3 2726 136 784 3 2727 41 117 3 2728 102 655 3 2729 39 345 3 2730 273 1281 3 2731 101 341 3 2732 94 585 3 2733 116 521 3 2734 170 870 3 2735 36 67 3 2736 61 730 3 2737 217 673 3 2738 183 565 3 2739 35 89 3 2740 39 77 3 2741 105 622 3 2742 49 225 3 2743 116 662 3 2744 167 1089 3 2745 122 1292 3 2746 50 203 3 2747 52 1253 3 2748 2930 15560 3 2749 468 1076 3 2750 43 123 3 2751 74 393 3 2752 175 695 3 2753 86 691 3 2754 47 186 3 2755 91 347 3 2756 60 394 3 2757 61 445 3 2758 70 212 3 2759 213 453 3 2760 49 139 3 2761 274 2296 3 2762 206 1648 3 2763 43 104 3 2764 36 130 3 2765 46 119 3 2766 84 325 3 2767 394 4062 3 2768 28 76 3 2769 148 592 3 2770 286 331 3 2771 135 1406 3 2772 44 112 3 2773 48 161 3 2774 55 174 3 2775 731 4024 3 2776 40 178 3 2777 305 1387 3 2778 40 229 3 2779 150 569 3 2780 36 117 3 2781 44 84 3 2782 48 244 3 2783 369 1939 3 2784 45 116 3 2785 114 511 3 2786 355 2402 3 2787 40 95 3 2788 47 195 3 2789 48 383 3 2790 53 135 3 2791 143 283 3 2792 44 131 3 2793 557 4189 3 2794 54 147 3 2795 471 3254 3 2796 40 122 3 2797 53 379 3 2798 54 207 3 2799 44 103 3 2800 111 1744 3 2801 33 79 3 2802 39 172 3 2803 34 90 3 2804 333 2233 3 2805 36 229 3 2806 66 374 3 2807 40 103 3 2808 111 480 3 2809 171 1231 3 2810 1946 10099 3 2811 37 75 3 2812 135 733 3 2813 50 195 3 2814 145 1238 3 2815 60 580 3 2816 148 930 3 2817 1100 6796 3 2818 328 5216 3 2819 38 133 3 2820 64 648 3 2821 69 208 3 2822 64 705 3 2823 64 684 3 2824 57 327 3 2825 37 259 3 2826 126 872 3 2827 107 1506 3 2828 55 276 3 2829 81 251 3 2830 2456 6027 3 2831 42 150 3 2832 275 2428 3 2833 77 1135 3 2834 137 285 3 2835 73 533 3 2836 48 68 3 2837 39 92 3 2838 2416 7670 3 2839 604 4423 3 2840 37 93 3 2841 56 387 3 2842 67 845 3 2843 62 360 3 2844 50 114 3 2845 56 195 3 2846 92 816 3 2847 42 88 3 2848 183 831 3 2849 202 1206 3 2850 71 365 3 2851 48 143 3 2852 335 2420 3 2853 61 335 3 2854 60 429 3 2855 29 81 3 2856 37 56 3 2857 48 631 3 2858 44 258 3 2859 55 234 3 2860 55 111 3 2861 92 1465 3 2862 130 1088 3 2863 95 619 3 2864 41 107 3 2865 46 297 3 2866 40 90 3 2867 47 204 3 2868 36 67 3 2869 438 2495 3 2870 65 125 3 2871 58 176 3 2872 107 537 3 2873 36 128 3 2874 70 730 3 2875 36 557 3 2876 31 64 3 2877 199 924 3 2878 85 217 3 2879 50 241 3 2880 41 69 3 2881 114 417 3 2882 38 130 3 2883 85 997 3 2884 36 60 3 2885 1888 9692 3 2886 31 68 3 2887 1560 14441 3 2888 36 76 3 2889 114 1392 3 2890 71 281 3 2891 2546 19347 3 2892 40 90 3 2893 43 160 3 2894 93 536 3 2895 161 385 3 2896 173 615 3 2897 142 666 3 2898 40 76 3 2899 104 668 3 2900 372 1274 3 2901 250 784 3 2902 83 461 3 2903 83 385 3 2904 40 262 3 2905 69 241 3 2906 221 795 3 2907 462 1823 3 2908 36 104 3 2909 39 86 3 2910 41 171 3 2911 102 523 3 2912 176 888 3 2913 54 412 3 2914 1276 2398 3 2915 67 597 3 2916 42 214 3 2917 55 109 3 2918 43 262 3 2919 36 147 3 2920 136 593 3 2921 820 8604 3 2922 333 2434 3 2923 7206 46772 3 2924 52 246 3 2925 53 189 3 2926 87 310 3 2927 40 251 3 2928 905 1753 3 2929 302 1192 3 2930 19114 65535 3 2931 58 174 3 2932 110 317 3 2933 431 1746 3 2934 1590 9093 3 2935 116 412 3 2936 11919 39426 3 2937 247 780 3 2938 702 4220 3 2939 91 250 3 2940 58 264 3 2941 3419 10111 3 2942 55 197 3 2943 104 751 3 2944 53 216 3 2945 34 83 3 2946 255 826 3 2947 111 208 3 2948 34 131 3 2949 51 208 3 2950 56 271 3 2951 64 578 3 2952 83 521 3 2953 53 218 3 2954 36 43 3 2955 3477 24579 3 2956 39 59 3 2957 331 1140 3 2958 32 97 3 2959 135 585 3 2960 121 1384 3 2961 53 470 3 2962 79 427 3 2963 37 106 3 2964 36 108 3 2965 38 178 3 2966 56 1157 3 2967 40 48 3 2968 91 727 3 2969 65 352 3 2970 92 1006 3 2971 40 114 3 2972 437 1857 3 2973 115 559 3 2974 187 1425 3 2975 97 356 3 2976 33 71 3 2977 57 205 3 2978 55 142 3 2979 69 458 3 2980 317 525 3 2981 33 108 3 2982 76 439 3 2983 42 172 3 2984 38 107 3 2985 33 78 3 2986 39 140 3 2987 71 450 3 2988 37 64 3 2989 36 108 3 2990 244 1606 3 2991 33 154 3 2992 36 118 3 2993 142 445 3 2994 61 426 3 2995 33 139 3 2996 45 5746 3 2997 43 94 3 2998 33 56 3 2999 309 2235 3 3000 108 535 3 3001 78 659 3 3002 214 11695 3 3003 574 1437 3 3004 85 626 3 3005 800 2619 3 3006 358 559 3 3007 60 916 3 3008 87 425 3 3009 40 97 3 3010 65 703 3 3011 82 272 3 3012 91 356 3 3013 36 78 3 3014 65 170 3 3015 663 7540 3 3016 65 207 3 3017 34 64 3 3018 254 949 3 3019 238 1219 3 3020 70 449 3 3021 1172 1893 3 3022 34 185 3 3023 145 773 3 3024 235 3880 3 3025 61 183 3 3026 39 309 3 3027 46 339 3 3028 138 574 3 3029 76 292 3 3030 858 2623 3 3031 44 168 3 3032 85 470 3 3033 59 544 3 3034 63 491 3 3035 91 792 3 3036 60 156 3 3037 50 100 3 3038 113 484 3 3039 80 285 3 3040 378 1050 3 3041 2699 10989 3 3042 248 737 3 3043 102 1193 3 3044 38 81 3 3045 109 872 3 3046 52 104 3 3047 66 488 3 3048 174 937 3 3049 228 832 3 3050 37 102 3 3051 36 62 3 3052 83 217 3 3053 108 332 3 3054 143 2461 3 3055 56 311 3 3056 328 1906 3 3057 40 167 3 3058 207 1458 3 3059 155 1182 3 3060 71 486 3 3061 79 412 3 3062 49 200 3 3063 167 714 3 3064 191 1543 3 3065 188 1394 3 3066 588 3723 3 3067 57 134 3 3068 61 170 3 3069 40 100 3 3070 33 74 3 3071 806 15949 3 3072 58 225 3 3073 127 763 3 3074 27 117 3 3075 37 90 3 3076 59 922 3 3077 38 156 3 3078 64 342 3 3079 60 310 3 3080 378 1311 3 3081 87 1891 3 3082 203 21510 3 3083 99 467 3 3084 45 250 3 3085 37 55 3 3086 99 680 3 3087 33 72 3 3088 113 372 3 3089 149 677 3 3090 34 134 3 3091 89 844 3 3092 106 586 3 3093 44 142 3 3094 40 57 3 3095 53 227 3 3096 36 59 3 3097 176 426 3 3098 38 140 3 3099 209 2024 3 3100 169 2154 3 3101 1597 3667 3 3102 46 203 3 3103 2224 3837 3 3104 54 253 3 3105 399 979 3 3106 31 90 3 3107 191 465 3 3108 486 3045 3 3109 169 1861 3 3110 35 75 3 3111 55 111 3 3112 124 1008 3 3113 64 259 3 3114 83 862 3 3115 61 141 3 3116 194 1028 3 3117 35 244 3 3118 98 384 3 3119 1233 9696 3 3120 33 107 3 3121 38 2972 3 3122 95 640 3 3123 72 347 3 3124 175 1877 3 3125 62 202 3 3126 56 400 3 3127 3902 44730 3 3128 53 131 3 3129 47 206 3 3130 39 57 3 3131 73 297 3 3132 197 1170 3 3133 48 151 3 3134 168 1557 3 3135 65 591 3 3136 236 1456 3 3137 205 770 3 3138 34 67 3 3139 151 844 3 3140 40 152 3 3141 35 70 3 3142 54 186 3 3143 101 621 3 3144 146 207 3 3145 46 378 3 3146 321 6728 3 3147 76 1235 3 3148 38 118 3 3149 388 2286 3 3150 47 59 3 3151 143 1366 3 3152 153 717 3 3153 45 174 3 3154 290 2384 3 3155 264 2134 3 3156 245 158 3 3157 57 241 3 3158 74 493 3 3159 60 268 3 3160 102 1863 3 3161 41 70 3 3162 307 1402 3 3163 201 3653 3 3164 125 1530 3 3165 36 103 3 3166 262 1426 3 3167 41 73 3 3168 229 1401 3 3169 1115 7595 3 3170 384 1645 3 3171 134 962 3 3172 32 109 3 3173 161 1941 3 3174 55 196 3 3175 34 65 3 3176 146 984 3 3177 194 1067 3 3178 192 3372 3 3179 93 1212 3 3180 2361 19767 3 3181 52 150 3 3182 40 123 3 3183 39 306 3 3184 37 164 3 3185 40 195 3 3186 76 252 3 3187 369 1039 3 3188 56 186 3 3189 579 2243 3 3190 48 358 3 3191 38 412 3 3192 58 364 3 3193 70 468 3 3194 31 184 3 3195 29 53 3 3196 499 2491 3 3197 42 100 3 3198 33 66 3 3199 268 1177 3 3200 228 1679 3 3201 139 1001 3 3202 178 1154 3 3203 40 333 3 3204 42 222 3 3205 201 975 3 3206 40 248 3 3207 2857 15614 3 3208 39 231 3 3209 102 559 3 3210 40 289 3 3211 46 310 3 3212 5300 18876 3 3213 19498 63673 3 3214 74 495 3 3215 43 267 3 3216 58 440 3 3217 128 701 3 3218 178 671 3 3219 71 345 3 3220 41 121 3 3221 65 464 3 3222 111 532 3 3223 6368 29171 3 3224 258 728 3 3225 22000 63702 3 3226 115 624 3 3227 156 851 3 3228 33 127 3 3229 34 186 3 3230 68 845 3 3231 47 212 3 3232 389 1482 3 3233 684 1082 3 3234 840 8128 3 3235 230 1350 3 3236 49 244 3 3237 39 166 3 3238 47 251 3 3239 627 1339 3 3240 33 110 3 3241 295 954 3 3242 1855 8872 3 3243 29 350 3 3244 236 1455 3 3245 42 69 3 3246 88 222 3 3247 34 65 3 3248 39 202 3 3249 39 90 3 3250 1270 11827 3 3251 58 269 3 3252 93 679 3 3253 46 275 3 3254 44 134 3 3255 70 402 3 3256 57 371 3 3257 169 469 3 3258 115 604 3 3259 83 490 3 3260 60 349 3 3261 603 1525 3 3262 524 1881 3 3263 72 236 3 3264 50 218 3 3265 45 123 3 3266 44 232 3 3267 36 168 3 3268 42 796 3 3269 40 82 3 3270 80 221 3 3271 41 161 3 3272 61 1228 3 3273 45 134 3 3274 53 289 3 3275 38 342 3 3276 42 257 3 3277 42 386 3 3278 110 693 3 3279 155 587 3 3280 389 1930 3 3281 69 448 3 3282 35 84 3 3283 109 442 3 3284 37 172 3 3285 377 4987 3 3286 36 81 3 3287 112 892 3 3288 207 1025 3 3289 39 149 3 3290 278 1512 3 3291 106 911 3 3292 46 421 3 3293 39 280 3 3294 101 530 3 3295 28 199 3 3296 31 83 3 3297 107 463 3 3298 233 995 3 3299 41 134 3 3300 32 75 3 3301 42 2297 3 3302 723 3290 3 3303 1206 2847 3 3304 82 597 3 3305 92 478 3 3306 48 156 3 3307 64 395 3 3308 411 3241 3 3309 77 1803 3 3310 31 215 3 3311 75 405 3 3312 34 106 3 3313 274 1019 3 3314 57 430 3 3315 98 416 3 3316 101 260 3 3317 95 478 3 3318 90 475 3 3319 60 104 3 3320 67 157 3 3321 95 293 3 3322 103 544 3 3323 93 572 3 3324 549 2781 3 3325 116 745 3 3326 228 883 3 3327 110 207 3 3328 160 859 3 3329 94 285 3 3330 220 707 3 3331 1692 5801 3 3332 736 3827 3 3333 208 835 3 3334 39 71 3 3335 67 1377 3 3336 185 452 3 3337 1092 11264 3 3338 36 127 3 3339 211 4021 3 3340 76 280 3 3341 33 290 3 3342 311 2072 3 3343 44 424 3 3344 34 139 3 3345 474 1650 3 3346 375 1090 3 3347 137 1227 3 3348 35 68 3 3349 232 881 3 3350 29 83 3 3351 119 599 3 3352 44 137 3 3353 44 199 3 3354 56 272 3 3355 37 348 3 3356 40 71 3 3357 37 291 3 3358 42 104 3 3359 30 222 3 3360 339 1119 3 3361 59 284 3 3362 589 4505 3 3363 100 303 3 3364 265 639 3 3365 41 227 3 3366 92 482 3 3367 9264 26713 3 3368 85 630 3 3369 5899 9042 3 3370 33 186 3 3371 69 442 3 3372 52 197 3 3373 35 97 3 3374 53 441 3 3375 89 1750 3 3376 35 209 3 3377 1217 7947 3 3378 45 406 3 3379 179 1035 3 3380 44 336 3 3381 3869 12176 3 3382 237 1592 3 3383 178 951 3 3384 76 270 3 3385 39 146 3 3386 103 759 3 3387 34 75 3 3388 103 241 3 3389 65 256 3 3390 206 770 3 3391 72 656 3 3392 233 1270 3 3393 181 270 3 3394 588 1414 3 3395 72 323 3 3396 483 2137 3 3397 291 1153 3 3398 274 1252 3 3399 320 320 3 3400 1010 5298 3 3401 106 395 3 3402 64 216 3 3403 88 269 3 3404 67 820 3 3405 35 151 3 3406 279 2680 3 3407 40 94 3 3408 206 734 3 3409 37 193 3 3410 85 265 3 3411 36 156 3 3412 99 802 3 3413 185 3088 3 3414 489 3572 3 3415 197 260 3 3416 65 153 3 3417 66 302 3 3418 95 540 3 3419 237 1111 3 3420 727 2821 3 3421 84 454 3 3422 359 2400 3 3423 197 4454 3 3424 73 537 3 3425 41 85 3 3426 128 893 3 3427 62 771 3 3428 303 2327 3 3429 69 753 3 3430 159 1219 3 3431 85 447 3 3432 43 136 3 3433 73 295 3 3434 260 1111 3 3435 90 893 3 3436 226 985 3 3437 161 860 3 3438 49 187 3 3439 129 1407 3 3440 151 415 3 3441 26 102 3 3442 215 1232 3 3443 109 474 3 3444 120 1789 3 3445 56 349 3 3446 59 728 3 3447 40 534 3 3448 45 318 3 3449 101 391 3 3450 53 116 3 3451 223 2004 3 3452 66 177 3 3453 275 2109 3 3454 33 74 3 3455 770 6652 3 3456 31 69 3 3457 398 2418 3 3458 34 81 3 3459 72 361 3 3460 37 2627 3 3461 240 9748 3 3462 52 591 3 3463 247 1642 3 3464 38 112 3 3465 84 222 3 3466 70 889 3 3467 106 360 3 3468 92 272 3 3469 2006 18903 3 3470 1548 8268 3 3471 32 55 3 3472 32 194 3 3473 36 131 3 3474 47 198 3 3475 56 122 3 3476 34 125 3 3477 65 299 3 3478 45 134 3 3479 26 101 3 3480 41 283 3 3481 29 64 3 3482 44 190 3 3483 377 4336 3 3484 157 626 3 3485 179 949 3 3486 2553 11737 3 3487 48 186 3 3488 33 84 3 3489 29 69 3 3490 31 110 3 3491 520 1914 3 3492 605 1124 3 3493 92 847 3 3494 1127 7319 3 3495 73 318 3 3496 263 1207 3 3497 92 266 3 3498 119 1902 3 3499 35 112 3 3500 80 424 3 3501 91 492 3 3502 94 476 3 3503 171 966 3 3504 35 85 3 3505 61 209 3 3506 37 299 3 3507 28 82 3 3508 96 718 3 3509 31 176 3 3510 1447 18968 3 3511 62 326 3 3512 130 612 3 3513 38 338 3 3514 41 116 3 3515 36 121 3 3516 73 543 3 3517 110 758 3 3518 79 312 3 3519 55 620 3 3520 32 75 3 3521 173 722 3 3522 48 149 3 3523 37 84 3 3524 28 82 3 3525 43 144 3 3526 30 255 3 3527 139 1027 3 3528 35 75 3 3529 167 535 3 3530 104 818 3 3531 58 294 3 3532 34 166 3 3533 100 397 3 3534 81 478 3 3535 49 115 3 3536 29 51 3 3537 51 237 3 3538 65 256 3 3539 83 275 3 3540 40 103 3 3541 32 151 3 3542 26 111 3 3543 44 213 3 3544 170 320 3 3545 173 861 3 3546 24 96 3 3547 59 411 3 3548 171 382 3 3549 75 216 3 3550 29 236 3 3551 36 93 3 3552 118 957 3 3553 29 148 3 3554 36 299 3 3555 40 235 3 3556 50 563 3 3557 29 101 3 3558 34 168 3 3559 29 64 3 3560 1012 3153 3 3561 37 75 3 3562 186 1008 3 3563 33 138 3 3564 35 221 3 3565 44 230 3 3566 74 469 3 3567 42 283 3 3568 60 1149 3 3569 34 342 3 3570 229 1268 3 3571 532 2492 3 3572 37 58 3 3573 152 804 3 3574 74 165 3 3575 34 36 3 3576 30 108 3 3577 240 2046 3 3578 47 447 3 3579 2291 5235 3 3580 32 91 3 3581 32 89 3 3582 58 230 3 3583 36 109 3 3584 31 49 3 3585 37 167 3 3586 54 341 3 3587 49 191 3 3588 33 120 3 3589 28 89 3 3590 35 158 3 3591 37 126 3 3592 51 369 3 3593 29 109 3 3594 156 1665 3 3595 34 58 3 3596 38 140 3 3597 43 136 3 3598 61 227 3 3599 50 435 3 3600 123 452 3 3601 28 208 3 3602 41 177 3 3603 33 62 3 3604 39 265 3 3605 51 137 3 3606 93 568 3 3607 36 146 3 3608 27 59 3 3609 324 2469 3 3610 29 107 3 3611 34 236 3 3612 53 154 3 3613 47 147 3 3614 35 93 3 3615 25 145 3 3616 183 947 3 3617 36 238 3 3618 62 323 3 3619 48 191 3 3620 78 704 3 3621 27 194 3 3622 52 381 3 3623 41 175 3 3624 30 73 3 3625 138 938 3 3626 55 258 3 3627 197 1570 3 3628 137 510 3 3629 47 414 3 3630 78 311 3 3631 57 199 3 3632 52 270 3 3633 231 1334 3 3634 33 109 3 3635 586 1328 3 3636 55 227 3 3637 786 4524 3 3638 41 214 3 3639 53 239 3 3640 49 239 3 3641 28 63 3 3642 306 1273 3 3643 31 508 3 3644 189 891 3 3645 331 1136 3 3646 83 725 3 3647 41 227 3 3648 256 929 3 3649 48 483 3 3650 164 851 3 3651 304 3066 3 3652 32 62 3 3653 40 164 3 3654 82 1464 3 3655 1372 9866 3 3656 24 55 3 3657 12342 24789 3 3658 159 200 3 3659 30 78 3 3660 269 2600 3 3661 38 153 3 3662 34 123 3 3663 52 126 3 3664 119 530 3 3665 47 147 3 3666 32 70 3 3667 25 71 3 3668 896 2656 3 3669 32 121 3 3670 107 929 3 3671 28 63 3 3672 112 662 3 3673 40 210 3 3674 47 257 3 3675 34 120 3 3676 42 204 3 3677 129 401 3 3678 44 91 3 3679 417 3226 3 3680 47 238 3 3681 187 883 3 3682 37 855 3 3683 229 437 3 3684 1645 14389 3 3685 43 343 3 3686 45 241 3 3687 44 132 3 3688 43 115 3 3689 84 648 3 3690 57 287 3 3691 30 34 3 3692 29 333 3 3693 242 1213 3 3694 30 91 3 3695 33 71 3 3696 48 234 3 3697 65 172 3 3698 30 160 3 3699 1614 2756 3 3700 32 103 3 3701 29 83 3 3702 220 807 3 3703 34 80 3 3704 77 1270 3 3705 82 341 3 3706 145 532 3 3707 26 107 3 3708 30 76 3 3709 52 218 3 3710 32 40 3 3711 37 199 3 3712 96 78 3 3713 52 121 3 3714 34 84 3 3715 44 535 3 3716 28 75 3 3717 45 115 3 3718 51 514 3 3719 59 276 3 3720 146 518 3 3721 51 246 3 3722 37 63 3 3723 73 296 3 3724 48 256 3 3725 63 1904 3 3726 35 220 3 3727 177 1299 3 3728 54 215 3 3729 106 1618 3 3730 51 87 3 3731 76 386 3 3732 94 1110 3 3733 38 197 3 3734 50 468 3 3735 64 873 3 3736 219 1768 3 3737 124 111 3 3738 56 262 3 3739 103 700 3 3740 34 231 3 3741 37 49 3 3742 115 379 3 3743 26 52 3 3744 45 501 3 3745 38 86 3 3746 77 1541 3 3747 42 91 3 3748 1082 7772 3 3749 51 219 3 3750 62 287 3 3751 46 227 3 3752 316 3870 3 3753 27 51 3 3754 77 394 3 3755 33 57 3 3756 74 329 3 3757 180 547 3 3758 1351 13086 3 3759 3955 23756 3 3760 57 199 3 3761 86 677 3 3762 33 197 3 3763 4051 13283 3 3764 38 59 3 3765 56 188 3 3766 55 249 3 3767 66 587 3 3768 46 178 3 3769 32 89 3 3770 43 350 3 3771 122 550 3 3772 41 397 3 3773 32 50 3 3774 9196 42972 3 3775 2416 16748 3 3776 34 116 3 3777 195 502 3 3778 1011 11574 3 3779 37 147 3 3780 55 304 3 3781 59 432 3 3782 137 819 3 3783 165 404 3 3784 44 225 3 3785 28 55 3 3786 36 196 3 3787 33 78 3 3788 45 114 3 3789 49 201 3 3790 150 761 3 3791 56 251 3 3792 62 497 3 3793 40 57 3 3794 87 529 3 3795 59 215 3 3796 63 261 3 3797 35 218 3 3798 45 234 3 3799 1670 7188 3 3800 44 103 3 3801 344 1964 3 3802 159 667 3 3803 1269 4085 3 3804 145 992 3 3805 39 136 3 3806 53 203 3 3807 34 163 3 3808 35 88 3 3809 37 77 3 3810 124 1783 3 3811 40 128 3 3812 138 429 3 3813 75 223 3 3814 40 149 3 3815 42 218 3 3816 133 1086 3 3817 74 151 3 3818 42 3609 3 3819 101 330 3 3820 8226 51425 3 3821 30 48 3 3822 9506 65535 3 3823 36 58 3 3824 115 689 3 3825 36 50 3 3826 85 249 3 3827 48 160 3 3828 62 208 3 3829 131 416 3 3830 757 3363 3 3831 42 430 3 3832 102 387 3 3833 164 2228 3 3834 124 535 3 3835 103 486 3 3836 289 625 3 3837 184 1393 3 3838 133 894 3 3839 140 935 3 3840 94 475 3 3841 62 477 3 3842 354 1593 3 3843 58 403 3 3844 41 117 3 3845 45 192 3 3846 53 309 3 3847 61 853 3 3848 35 103 3 3849 54 375 3 3850 298 1064 3 3851 92 756 3 3852 126 556 3 3853 35 74 3 3854 59 412 3 3855 234 771 3 3856 52 254 3 3857 62 238 3 3858 34 79 3 3859 91 343 3 3860 54 140 3 3861 34 68 3 3862 87 1792 3 3863 56 210 3 3864 1119 960 3 3865 29 67 3 3866 105 351 3 3867 49 219 3 3868 455 1870 3 3869 51 627 3 3870 73 415 3 3871 227 2881 3 3872 56 247 3 3873 159 947 3 3874 85 584 3 3875 35 164 3 3876 77 369 3 3877 57 162 3 3878 163 494 3 3879 90 833 3 3880 38 200 3 3881 76 387 3 3882 33 74 3 3883 67 313 3 3884 31 113 3 3885 57 358 3 3886 483 2525 3 3887 93 1023 3 3888 86 889 3 3889 767 2679 3 3890 32 46 3 3891 93 561 3 3892 44 191 3 3893 43 101 3 3894 88 422 3 3895 141 201 3 3896 57 181 3 3897 54 251 3 3898 35 118 3 3899 39 112 3 3900 38 186 3 3901 47 80 3 3902 32 72 3 3903 87 265 3 3904 31 121 3 3905 61 325 3 3906 33 96 3 3907 76 179 3 3908 248 1930 3 3909 525 1477 3 3910 70 163 3 3911 44 159 3 3912 542 5697 3 3913 177 526 3 3914 60 100 3 3915 55 393 3 3916 56 729 3 3917 331 2925 3 3918 33 67 3 3919 45 437 3 3920 38 344 3 3921 155 834 3 3922 40 90 3 3923 85 508 3 3924 46 216 3 3925 52 225 3 3926 43 114 3 3927 829 3311 3 3928 157 1132 3 3929 30 64 3 3930 26 65 3 3931 49 108 3 3932 104 915 3 3933 50 486 3 3934 149 528 3 3935 203 1271 3 3936 67 502 3 3937 34 134 3 3938 90 407 3 3939 513 1506 3 3940 54 252 3 3941 455 1770 3 3942 56 171 3 3943 632 3471 3 3944 48 253 3 3945 143 575 3 3946 47 221 3 3947 57 342 3 3948 34 99 3 3949 61 509 3 3950 72 427 3 3951 35 132 3 3952 40 150 3 3953 44 182 3 3954 73 720 3 3955 118 1372 3 3956 58 202 3 3957 53 207 3 3958 33 109 3 3959 74 562 3 3960 188 852 3 3961 37 126 3 3962 77 249 3 3963 46 217 3 3964 33 79 3 3965 35 186 3 3966 515 1588 3 3967 39 166 3 3968 131 771 3 3969 43 108 3 3970 130 135 3 3971 125 123 3 3972 89 622 3 3973 47 290 3 3974 152 1385 3 3975 46 242 3 3976 30 106 3 3977 76 611 3 3978 61 422 3 3979 45 536 3 3980 124 628 3 3981 38 209 3 3982 130 761 3 3983 45 86 3 3984 237 1035 3 3985 58 187 3 3986 613 608 3 3987 41 111 3 3988 552 2472 3 3989 128 1157 3 3990 334 3147 3 3991 43 73 3 3992 381 1069 3 3993 35 179 3 3994 106 1065 3 3995 48 111 3 3996 33 99 3 3997 229 2444 3 3998 84 373 3 3999 63 588 3 4000 66 678 3 4001 92 703 3 4002 39 126 3 4003 70 305 3 4004 56 313 3 4005 73 434 3 4006 93 293 3 4007 40 84 3 4008 57 340 3 4009 37 97 3 4010 190 782 3 4011 92 251 3 4012 52 776 3 4013 903 4013 3 4014 56 315 3 4015 66 243 3 4016 74 181 3 4017 80 511 3 4018 57 876 3 4019 24 230 3 4020 63 160 3 4021 30 457 3 4022 148 471 3 4023 161 2413 3 4024 45 51 3 4025 38 113 3 4026 83 638 3 4027 38 145 3 4028 127 1941 3 4029 54 504 3 4030 211 1320 3 4031 104 1252 3 4032 48 207 3 4033 60 418 3 4034 29 53 3 4035 76 924 3 4036 7872 65535 3 4037 67 558 3 4038 34 80 3 4039 51 307 3 4040 86 1174 3 4041 64 729 3 4042 34 77 3 4043 37 348 3 4044 50 38 3 4045 125 796 3 4046 35 201 3 4047 1716 15533 3 4048 50 160 3 4049 39 164 3 4050 27 73 3 4051 50 267 3 4052 40 156 3 4053 46 187 3 4054 33 67 3 4055 1844 10899 3 4056 175 7428 3 4057 51 200 3 4058 27 85 3 4059 41 179 3 4060 34 319 3 4061 37 223 3 4062 120 724 3 4063 36 178 3 4064 65 229 3 4065 139 467 3 4066 40 167 3 4067 1024 7626 3 4068 59 402 3 4069 262 2168 3 4070 63 609 3 4071 157 545 3 4072 34 327 3 4073 45 189 3 4074 1011 9482 3 4075 966 4119 3 4076 314 4876 3 4077 38 187 3 4078 124 603 3 4079 73 226 3 4080 1124 12054 3 4081 51 179 3 4082 38 103 3 4083 82 243 3 4084 45 361 3 4085 40 127 3 4086 62 283 3 4087 32 75 3 4088 40 3413 3 4089 92 465 3 4090 68 267 3 4091 66 322 3 4092 44 314 3 4093 55 276 3 4094 35 244 3 4095 36 41 3 4096 56 267 3 4097 42 140 3 4098 50 276 3 4099 83 886 3 4100 35 106 3 4101 25 87 3 4102 48 198 3 4103 84 484 3 4104 57 281 3 4105 37 288 3 4106 33 66 3 4107 289 1474 3 4108 110 1115 3 4109 46 319 3 4110 127 597 3 4111 65 289 3 4112 105 2536 3 4113 32 288 3 4114 28 67 3 4115 204 1005 3 4116 144 625 3 4117 116 281 3 4118 60 260 3 4119 30 81 3 4120 58 612 3 4121 34 49 3 4122 127 1138 3 4123 599 3290 3 4124 80 416 3 4125 57 211 3 4126 33 111 3 4127 105 403 3 4128 683 2276 3 4129 41 190 3 4130 38 83 3 4131 130 283 3 4132 52 157 3 4133 32 199 3 4134 72 258 3 4135 108 680 3 4136 46 299 3 4137 28 51 3 4138 151 1290 3 4139 35 72 3 4140 169 1494 3 4141 67 153 3 4142 152 421 3 4143 33 94 3 4144 39 95 3 4145 30 63 3 4146 60 225 3 4147 54 200 3 4148 66 699 3 4149 218 1960 3 4150 84 800 3 4151 29 148 3 4152 71 158 3 4153 34 2745 3 4154 30 151 3 4155 33 61 3 4156 33 73 3 4157 28 72 3 4158 50 325 3 4159 39 135 3 4160 36 132 3 4161 606 7468 3 4162 152 408 3 4163 32 85 3 4164 31 124 3 4165 33 61 3 4166 62 477 3 4167 44 73 3 4168 32 130 3 4169 54 859 3 4170 52 287 3 4171 161 743 3 4172 381 1571 3 4173 29 111 3 4174 57 277 3 4175 106 1125 3 4176 60 190 3 4177 121 1189 3 4178 465 874 3 4179 1315 4078 3 4180 34 58 3 4181 160 119 3 4182 60 332 3 4183 46 140 3 4184 38 132 3 4185 54 397 3 4186 710 4483 3 4187 40 239 3 4188 41 156 3 4189 36 120 3 4190 374 1151 3 4191 37 85 3 4192 127 89 3 4193 101 593 3 4194 36 99 3 4195 197 1610 3 4196 88 683 3 4197 37 149 3 4198 84 476 3 4199 265 1598 3 4200 279 626 3 4201 41 78 3 4202 32 173 3 4203 221 2096 3 4204 278 2836 3 4205 38 188 3 4206 34 76 3 4207 296 855 3 4208 268 525 3 4209 103 1313 3 4210 186 1593 3 4211 126 645 3 4212 52 293 3 4213 63 210 3 4214 112 642 3 4215 32 95 3 4216 50 334 3 4217 519 5588 3 4218 77 460 3 4219 80 445 3 4220 35 134 3 4221 52 374 3 4222 43 235 3 4223 466 2533 3 4224 145 2506 3 4225 224 1085 3 4226 81 467 3 4227 1515 3546 3 4228 197 503 3 4229 138 1469 3 4230 38 148 3 4231 31 54 3 4232 285 2748 3 4233 193 2329 3 4234 62 330 3 4235 44 224 3 4236 198 5166 3 4237 72 382 3 4238 470 3098 3 4239 95 3835 3 4240 598 3742 3 4241 157 464 3 4242 540 3394 3 4243 32 81 3 4244 61 147 3 4245 31 91 3 4246 34 114 3 4247 38 94 3 4248 54 302 3 4249 37 139 3 4250 71 671 3 4251 65 305 3 4252 47 112 3 4253 72 289 3 4254 37 107 3 4255 111 990 3 4256 39 196 3 4257 59 950 3 4258 82 811 3 4259 77 997 3 4260 46 102 3 4261 103 826 3 4262 129 340 3 4263 32 85 3 4264 35 72 3 4265 94 618 3 4266 66 1371 3 4267 752 6066 3 4268 62 276 3 4269 208 2842 3 4270 90 1373 3 4271 48 84 3 4272 30 82 3 4273 36 134 3 4274 44 310 3 4275 758 7273 3 4276 261 1380 3 4277 34 2629 3 4278 31 286 3 4279 34 891 3 4280 56 605 3 4281 46 175 3 4282 200 1500 3 4283 4214 40541 3 4284 66 146 3 4285 43 280 3 4286 32 87 3 4287 97 262 3 4288 60 251 3 4289 34 121 3 4290 46 142 3 4291 67 670 3 4292 32 101 3 4293 184 89 3 4294 36 88 3 4295 128 1159 3 4296 47 140 3 4297 70 602 3 4298 37 87 3 4299 84 778 3 4300 27 104 3 4301 448 1936 3 4302 33 57 3 4303 85 903 3 4304 118 978 3 4305 106 972 3 4306 48 150 3 4307 43 215 3 4308 213 950 3 4309 182 3192 3 4310 86 1780 3 4311 80 702 3 4312 39 292 3 4313 790 2721 3 4314 56 358 3 4315 40 60 3 4316 30 638 3 4317 36 1275 3 4318 33 116 3 4319 33 41 3 4320 142 653 3 4321 82 339 3 4322 129 1372 3 4323 330 901 3 4324 198 532 3 4325 60 551 3 4326 70 2191 3 4327 54 189 3 4328 117 369 3 4329 53 120 3 4330 365 2927 3 4331 52 291 3 4332 272 3977 3 4333 43 63 3 4334 140 814 3 4335 84 453 3 4336 1112 9873 3 4337 42 96 3 4338 61 252 3 4339 33 178 3 4340 30 84 3 4341 1059 2762 3 4342 36 274 3 4343 32 328 3 4344 35 307 3 4345 31 244 3 4346 61 375 3 4347 38 259 3 4348 91 505 3 4349 64 429 3 4350 41 86 3 4351 31 51 3 4352 904 2714 3 4353 27 84 3 4354 29 85 3 4355 36 1306 3 4356 49 387 3 4357 38 155 3 4358 612 3059 3 4359 333 1217 3 4360 52 183 3 4361 42 344 3 4362 52 345 3 4363 37 207 3 4364 275 1481 3 4365 28 115 3 4366 1326 8394 3 4367 34 141 3 4368 91 305 3 4369 37 183 3 4370 142 1125 3 4371 71 320 3 4372 37 96 3 4373 33 93 3 4374 31 134 3 4375 62 364 3 4376 47 239 3 4377 41 237 3 4378 39 338 3 4379 52 259 3 4380 41 158 3 4381 50 517 3 4382 219 1249 3 4383 619 6831 3 4384 39 101 3 4385 33 214 3 4386 130 603 3 4387 46 183 3 4388 62 116 3 4389 34 71 3 4390 34 154 3 4391 72 631 3 4392 291 963 3 4393 88 517 3 4394 30 163 3 4395 76 648 3 4396 43 246 3 4397 78 580 3 4398 1183 6970 3 4399 30 81 3 4400 44 184 3 4401 34 68 3 4402 838 6928 3 4403 35 93 3 4404 38 236 3 4405 184 2414 3 4406 116 516 3 4407 44 142 3 4408 54 247 3 4409 129 1240 3 4410 92 213 3 4411 243 1321 3 4412 285 2143 3 4413 591 5419 3 4414 398 1354 3 4415 54 289 3 4416 45 313 3 4417 176 3334 3 4418 169 1374 3 4419 74 241 3 4420 49 208 3 4421 29 63 3 4422 236 1433 3 4423 45 154 3 4424 51 282 3 4425 680 5604 3 4426 146 393 3 4427 38 234 3 4428 38 208 3 4429 974 3113 3 4430 3549 33323 3 4431 65 673 3 4432 35 117 3 4433 36 162 3 4434 39 180 3 4435 36 285 3 4436 87 411 3 4437 78 435 3 4438 99 700 3 4439 32 64 3 4440 71 243 3 4441 35 57 3 4442 43 76 3 4443 37 73 3 4444 680 8416 3 4445 66 259 3 4446 100 299 3 4447 217 2001 3 4448 53 255 3 4449 56 318 3 4450 35 187 3 4451 36 101 3 4452 123 985 3 4453 27 64 3 4454 38 90 3 4455 54 217 3 4456 277 990 3 4457 39 548 3 4458 146 2852 3 4459 126 764 3 4460 40 142 3 4461 51 322 3 4462 39 136 3 4463 515 2031 3 4464 48 326 3 4465 133 899 3 4466 51 258 3 4467 43 152 3 4468 31 83 3 4469 280 1051 3 4470 38 92 3 4471 188 1506 3 4472 40 148 3 4473 42 103 3 4474 30 71 3 4475 52 267 3 4476 34 106 3 4477 405 1272 3 4478 41 141 3 4479 45 530 3 4480 45 235 3 4481 154 632 3 4482 814 3433 3 4483 78 396 3 4484 58 306 3 4485 65 15946 3 4486 76 1107 3 4487 71 442 3 4488 35 98 3 4489 43 235 3 4490 54 113 3 4491 40 76 3 4492 23 60 3 4493 117 693 3 4494 166 1378 3 4495 36 73 3 4496 51 354 3 4497 92 511 3 4498 38 389 3 4499 353 1921 3 4500 63 284 3 4501 131 1132 3 4502 37 188 3 4503 228 2561 3 4504 132 518 3 4505 66 719 3 4506 27 109 3 4507 42 151 3 4508 40 120 3 4509 114 624 3 4510 150 661 3 4511 75 998 3 4512 37 89 3 4513 40 130 3 4514 61 246 3 4515 41 383 3 4516 52 803 3 4517 487 2867 3 4518 39 258 3 4519 327 1221 3 4520 32 174 3 4521 124 537 3 4522 159 812 3 4523 35 201 3 4524 57 242 3 4525 52 368 3 4526 45 99 3 4527 101 148 3 4528 44 250 3 4529 49 194 3 4530 65 222 3 4531 54 455 3 4532 39 217 3 4533 413 3531 3 4534 75 519 3 4535 155 1345 3 4536 85 491 3 4537 35 102 3 4538 32 124 3 4539 59 217 3 4540 906 10386 3 4541 82 637 3 4542 221 1102 3 4543 37 71 3 4544 371 1834 3 4545 37 138 3 4546 188 3408 3 4547 40 231 3 4548 34 201 3 4549 39 169 3 4550 82 670 3 4551 76 410 3 4552 129 933 3 4553 64 183 3 4554 106 216 3 4555 68 249 3 4556 453 3197 3 4557 49 150 3 4558 38 314 3 4559 62 604 3 4560 445 1679 3 4561 141 1449 3 4562 947 3732 3 4563 64 679 3 4564 220 1938 3 4565 56 314 3 4566 30 185 3 4567 74 559 3 4568 36 314 3 4569 616 4133 3 4570 77 157 3 4571 44 202 3 4572 173 1213 3 4573 49 259 3 4574 45 431 3 4575 54 148 3 4576 90 1309 3 4577 69 369 3 4578 188 1194 3 4579 35 184 3 4580 74 326 3 4581 76 295 3 4582 70 306 3 4583 32 154 3 4584 67 547 3 4585 38 150 3 4586 64 240 3 4587 64 386 3 4588 34 122 3 4589 156 212 3 4590 44 497 3 4591 83 1395 3 4592 130 1782 3 4593 55 341 3 4594 88 632 3 4595 112 2167 3 4596 58 446 3 4597 31 143 3 4598 95 377 3 4599 61 417 3 4600 68 388 3 4601 61 938 3 4602 32 101 3 4603 62 118 3 4604 43 180 3 4605 114 862 3 4606 31 101 3 4607 31 85 3 4608 25 54 3 4609 40 183 3 4610 82 515 3 4611 59 160 3 4612 37 65 3 4613 37 118 3 4614 492 3223 3 4615 56 337 3 4616 34 114 3 4617 215 1936 3 4618 33 144 3 4619 40 259 3 4620 157 701 3 4621 91 536 3 4622 26 79 3 4623 33 101 3 4624 31 70 4 1 4038 46689 4 2 668 2610 4 3 98 914 4 4 1762 13187 4 5 92 676 4 6 100 1167 4 7 63 838 4 8 84 642 4 9 9609 65535 4 10 83 876 4 11 7646 26797 4 12 105 1105 4 13 90 648 4 14 3310 16363 4 15 74 1117 4 16 59 1225 4 17 138 1074 4 18 516 2125 4 19 56 187 4 20 64 328 4 21 1209 16117 4 22 122 717 4 23 81 505 4 24 769 7439 4 25 171 951 4 26 87 724 4 27 6545 24629 4 28 54 538 4 29 94 421 4 30 104 558 4 31 64 609 4 32 68 644 4 33 3241 29764 4 34 110 619 4 35 56 186 4 36 63 636 4 37 51 361 4 38 77 597 4 39 65 572 4 40 83 266 4 41 185 1099 4 42 543 1737 4 43 227 2364 4 44 125 994 4 45 267 1578 4 46 254 2460 4 47 93 214 4 48 64 822 4 49 76 326 4 50 131 747 4 51 55 143 4 52 176 614 4 53 358 1265 4 54 108 779 4 55 322 1868 4 56 153 776 4 57 147 769 4 58 126 849 4 59 62 323 4 60 968 3991 4 61 141 539 4 62 308 1632 4 63 15254 65535 4 64 60 185 4 65 8105 65466 4 66 74 157 4 67 62 225 4 68 47 147 4 69 228 2309 4 70 682 3404 4 71 47 234 4 72 72 399 4 73 452 2349 4 74 54 330 4 75 92 160 4 76 358 2154 4 77 266 1319 4 78 130 468 4 79 182 1642 4 80 75 504 4 81 78 309 4 82 129 428 4 83 73 162 4 84 79 246 4 85 125 1183 4 86 88 388 4 87 62 378 4 88 319 2494 4 89 72 196 4 90 102 344 4 91 84 510 4 92 144 1663 4 93 102 690 4 94 39 284 4 95 84 545 4 96 63 238 4 97 54 308 4 98 956 1655 4 99 47 246 4 100 175 2113 4 101 83 282 4 102 96 581 4 103 75 349 4 104 54 202 4 105 103 390 4 106 112 743 4 107 79 400 4 108 71 603 4 109 92 322 4 110 445 1839 4 111 72 500 4 112 345 1556 4 113 112 341 4 114 6224 27754 4 115 170 284 4 116 289 2172 4 117 369 1531 4 118 115 358 4 119 93 423 4 120 67 182 4 121 236 2131 4 122 62 280 4 123 82 277 4 124 114 793 4 125 62 308 4 126 246 1175 4 127 70 202 4 128 1166 2863 4 129 91 357 4 130 76 352 4 131 100 1917 4 132 190 3352 4 133 8398 49587 4 134 61 207 4 135 172 1180 4 136 145 846 4 137 422 2229 4 138 141 894 4 139 494 4005 4 140 321 1308 4 141 2065 7870 4 142 82 942 4 143 88 1960 4 144 77 321 4 145 81 642 4 146 876 1747 4 147 268 1262 4 148 170 453 4 149 132 942 4 150 283 3644 4 151 453 1967 4 152 172 921 4 153 70 245 4 154 72 234 4 155 135 433 4 156 127 335 4 157 231 1156 4 158 1862 6400 4 159 153 847 4 160 74 483 4 161 127 852 4 162 142 590 4 163 131 407 4 164 1346 5597 4 165 75 547 4 166 341 2225 4 167 64 692 4 168 1557 5324 4 169 204 2334 4 170 324 890 4 171 190 895 4 172 100 404 4 173 235 1103 4 174 497 3324 4 175 92 631 4 176 1213 3688 4 177 73 302 4 178 79 633 4 179 399 1659 4 180 131 593 4 181 416 485 4 182 78 266 4 183 139 864 4 184 62 159 4 185 64 175 4 186 250 746 4 187 434 1331 4 188 522 1379 4 189 214 701 4 190 84 443 4 191 408 764 4 192 111 236 4 193 451 1613 4 194 106 913 4 195 62 387 4 196 129 455 4 197 90 401 4 198 782 6214 4 199 675 5595 4 200 1261 27324 4 201 76 829 4 202 73 146 4 203 234 897 4 204 709 1969 4 205 52 276 4 206 333 1428 4 207 698 1509 4 208 85 542 4 209 1256 6749 4 210 1682 14253 4 211 54 184 4 212 95 217 4 213 344 1445 4 214 272 786 4 215 249 2238 4 216 531 2762 4 217 545 5384 4 218 160 1208 4 219 363 716 4 220 947 2245 4 221 452 6173 4 222 125 611 4 223 107 428 4 224 108 1075 4 225 90 425 4 226 2136 11030 4 227 43 206 4 228 234 1557 4 229 75 259 4 230 117 460 4 231 164 650 4 232 92 381 4 233 76 225 4 234 619 2533 4 235 63 104 4 236 73 470 4 237 67 176 4 238 1359 3441 4 239 129 376 4 240 150 492 4 241 173 633 4 242 273 1369 4 243 732 2444 4 244 369 1981 4 245 74 440 4 246 152 1070 4 247 152 876 4 248 188 794 4 249 272 2293 4 250 116 1126 4 251 681 4494 4 252 57 206 4 253 65 376 4 254 349 2281 4 255 70 412 4 256 257 1037 4 257 133 448 4 258 173 949 4 259 179 991 4 260 298 1483 4 261 220 909 4 262 75 373 4 263 126 654 4 264 90 281 4 265 243 1313 4 266 757 4421 4 267 133 236 4 268 147 418 4 269 121 956 4 270 60 227 4 271 747 2338 4 272 226 844 4 273 70 154 4 274 52 110 4 275 163 390 4 276 745 3427 4 277 47 144 4 278 88 109 4 279 973 3326 4 280 296 7049 4 281 269 2455 4 282 62 180 4 283 61 149 4 284 85 124 4 285 1378 4501 4 286 57 143 4 287 300 1464 4 288 123 600 4 289 213 354 4 290 3033 35244 4 291 1859 7718 4 292 35292 65535 4 293 117 737 4 294 158 1020 4 295 158 860 4 296 240 1532 4 297 167 868 4 298 479 1843 4 299 78 375 4 300 774 3659 4 301 5637 15474 4 302 501 2813 4 303 405 1986 4 304 78 673 4 305 71 218 4 306 81 1015 4 307 1097 5480 4 308 68 131 4 309 66 94 4 310 160 1061 4 311 189 1296 4 312 832 5480 4 313 130 712 4 314 666 1936 4 315 6545 39723 4 316 65 514 4 317 106 697 4 318 10998 51147 4 319 69 271 4 320 212 759 4 321 97 547 4 322 109 451 4 323 26301 50299 4 324 65 158 4 325 102 406 4 326 75 151 4 327 119 496 4 328 93 688 4 329 77 507 4 330 142 435 4 331 245 1018 4 332 81 657 4 333 574 2178 4 334 10887 40588 4 335 85 516 4 336 392 1182 4 337 61 380 4 338 918 8870 4 339 89 949 4 340 188 1286 4 341 312 1626 4 342 72 183 4 343 113 937 4 344 93 290 4 345 308 2896 4 346 71 201 4 347 265 1338 4 348 1113 7911 4 349 123 330 4 350 119 835 4 351 165 679 4 352 745 2674 4 353 56 134 4 354 386 1189 4 355 68 171 4 356 90 176 4 357 64 124 4 358 99 328 4 359 247 2947 4 360 168 1125 4 361 79 301 4 362 288 1000 4 363 479 584 4 364 825 2762 4 365 142 261 4 366 99 463 4 367 61 136 4 368 153 628 4 369 86 563 4 370 389 1507 4 371 10740 12803 4 372 162 647 4 373 67 273 4 374 66 633 4 375 393 2232 4 376 68 585 4 377 66 266 4 378 318 1649 4 379 64 152 4 380 99 663 4 381 909 4999 4 382 184 1336 4 383 104 523 4 384 433 3973 4 385 995 7626 4 386 58 318 4 387 153 664 4 388 195 955 4 389 90 434 4 390 1761 7936 4 391 105 466 4 392 129 518 4 393 259 551 4 394 154 671 4 395 1070 3626 4 396 254 829 4 397 131 836 4 398 686 5689 4 399 356 706 4 400 128 610 4 401 128 1039 4 402 92 339 4 403 55 129 4 404 1926 9476 4 405 139 346 4 406 243 1185 4 407 2185 6384 4 408 568 7439 4 409 68 339 4 410 64 147 4 411 74 227 4 412 1931 4177 4 413 1067 6011 4 414 2919 11490 4 415 94 518 4 416 79 270 4 417 324 1411 4 418 73 233 4 419 2723 4324 4 420 71 431 4 421 208 1172 4 422 50 479 4 423 126 495 4 424 1472 12359 4 425 74 217 4 426 154 530 4 427 261 2637 4 428 2615 13759 4 429 511 4122 4 430 201 678 4 431 142 897 4 432 140 868 4 433 898 3320 4 434 2066 6436 4 435 1380 5372 4 436 69 231 4 437 818 1495 4 438 68 415 4 439 224 899 4 440 467 2791 4 441 121 605 4 442 108 516 4 443 89 208 4 444 85 315 4 445 386 606 4 446 69 234 4 447 252 1065 4 448 178 905 4 449 268 1350 4 450 150 511 4 451 81 325 4 452 52 153 4 453 3642 16823 4 454 107 270 4 455 2395 4805 4 456 152 1549 4 457 98 311 4 458 136 296 4 459 220 1444 4 460 124 689 4 461 3472 27369 4 462 87 430 4 463 391 2730 4 464 76 410 4 465 461 2829 4 466 68 120 4 467 131 313 4 468 823 3422 4 469 62 180 4 470 144 1068 4 471 101 437 4 472 96 317 4 473 355 1053 4 474 396 2761 4 475 118 344 4 476 160 589 4 477 216 1268 4 478 100 330 4 479 169 647 4 480 96 414 4 481 1444 6818 4 482 62 157 4 483 57 1176 4 484 72 605 4 485 96 272 4 486 74 284 4 487 79 329 4 488 122 441 4 489 162 495 4 490 96 212 4 491 87 4812 4 492 270 1608 4 493 125 733 4 494 463 5238 4 495 60 186 4 496 1494 5937 4 497 93 212 4 498 90 1358 4 499 151 1188 4 500 489 6310 4 501 240 1215 4 502 1530 9347 4 503 500 2393 4 504 230 2443 4 505 205 2156 4 506 56 199 4 507 87 914 4 508 110 201 4 509 1429 279 4 510 102 2839 4 511 98 320 4 512 197 944 4 513 1834 15227 4 514 791 4416 4 515 254 3395 4 516 1857 7885 4 517 553 4069 4 518 311 1629 4 519 317 1197 4 520 241 932 4 521 258 895 4 522 107 398 4 523 2715 17738 4 524 5395 15932 4 525 106 193 4 526 70 175 4 527 587 2949 4 528 62 212 4 529 114 836 4 530 103 223 4 531 429 1471 4 532 109 630 4 533 166 1556 4 534 56 667 4 535 265 2706 4 536 72 165 4 537 926 4350 4 538 884 2450 4 539 234 3740 4 540 1111 5728 4 541 145 600 4 542 286 2057 4 543 57 213 4 544 1853 8904 4 545 66 246 4 546 1158 8969 4 547 1116 9670 4 548 78 149 4 549 326 984 4 550 366 939 4 551 301 1339 4 552 396 5007 4 553 262 1081 4 554 74 247 4 555 108 232 4 556 245 314 4 557 101 589 4 558 462 2853 4 559 1800 8776 4 560 77 408 4 561 767 5450 4 562 68 157 4 563 518 2654 4 564 354 1749 4 565 3825 14565 4 566 810 6230 4 567 743 6400 4 568 79 374 4 569 63 239 4 570 122 289 4 571 225 1745 4 572 67 172 4 573 900 7967 4 574 61 205 4 575 281 3077 4 576 80 484 4 577 301 1707 4 578 354 110 4 579 6453 65535 4 580 63 372 4 581 102 1444 4 582 4292 36641 4 583 7376 51922 4 584 85 231 4 585 86 1199 4 586 111 1452 4 587 92 397 4 588 7022 22440 4 589 485 5017 4 590 83 1547 4 591 109 1729 4 592 80 1273 4 593 290 1781 4 594 72 360 4 595 111 903 4 596 75 397 4 597 75 200 4 598 102 16078 4 599 391 1447 4 600 68 387 4 601 725 2658 4 602 244 2721 4 603 107 1589 4 604 112 1236 4 605 147 929 4 606 3282 13839 4 607 51 302 4 608 240 1777 4 609 497 1289 4 610 105 704 4 611 786 4327 4 612 107 635 4 613 63 201 4 614 88 984 4 615 105 920 4 616 89 547 4 617 213 1080 4 618 192 1464 4 619 118 922 4 620 395 1052 4 621 305 1047 4 622 18348 65535 4 623 10723 65535 4 624 21199 65535 4 625 85 263 4 626 63 944 4 627 595 3215 4 628 609 2354 4 629 47 115 4 630 251 1709 4 631 250 1488 4 632 574 2162 4 633 113 605 4 634 162 663 4 635 80 264 4 636 59 188 4 637 63 284 4 638 114 606 4 639 166 1143 4 640 114 579 4 641 206 4581 4 642 62 153 4 643 12153 65535 4 644 71 155 4 645 1286 2341 4 646 62 94 4 647 277 1240 4 648 577 1974 4 649 214 1835 4 650 122 425 4 651 187 1162 4 652 81 197 4 653 54 133 4 654 181 400 4 655 449 4254 4 656 207 932 4 657 486 3097 4 658 2982 10166 4 659 928 2182 4 660 230 1179 4 661 109 285 4 662 74 146 4 663 98 351 4 664 63 207 4 665 89 788 4 666 57 685 4 667 505 1926 4 668 200 930 4 669 66 272 4 670 712 3959 4 671 2994 64133 4 672 220 860 4 673 75 288 4 674 92 285 4 675 260 1085 4 676 73 198 4 677 70 135 4 678 61 494 4 679 142 972 4 680 53 168 4 681 64 185 4 682 87 236 4 683 327 1588 4 684 119 578 4 685 100 407 4 686 772 3589 4 687 73 259 4 688 100 390 4 689 152 1320 4 690 436 1241 4 691 152 330 4 692 173 2245 4 693 219 1204 4 694 488 1431 4 695 260 1672 4 696 95 573 4 697 89 841 4 698 108 580 4 699 75 161 4 700 81 376 4 701 179 726 4 702 211 825 4 703 672 2208 4 704 145 472 4 705 68 271 4 706 314 1142 4 707 65 239 4 708 266 2425 4 709 499 1287 4 710 102 481 4 711 792 2884 4 712 75 328 4 713 76 229 4 714 1385 42332 4 715 252 395 4 716 57 171 4 717 755 4806 4 718 401 2334 4 719 62 187 4 720 60 456 4 721 59 352 4 722 182 668 4 723 257 1863 4 724 860 12046 4 725 178 1331 4 726 287 1490 4 727 220 960 4 728 131 371 4 729 652 1511 4 730 1577 11625 4 731 980 1610 4 732 553 11235 4 733 396 1411 4 734 1156 6751 4 735 490 2021 4 736 3178 6917 4 737 83 249 4 738 583 1495 4 739 93 281 4 740 498 1195 4 741 364 1777 4 742 971 2151 4 743 481 776 4 744 631 3577 4 745 72 223 4 746 767 397 4 747 1124 5127 4 748 808 4349 4 749 387 1623 4 750 408 1209 4 751 629 4040 4 752 1331 6260 4 753 690 4683 4 754 610 5643 4 755 248 1950 4 756 88 911 4 757 79 927 4 758 389 2947 4 759 771 2434 4 760 87 1171 4 761 93 993 4 762 105 758 4 763 672 4485 4 764 282 2170 4 765 155 716 4 766 4765 21296 4 767 75 384 4 768 2625 2236 4 769 1396 42809 4 770 148 571 4 771 75 495 4 772 371 3915 4 773 66 142 4 774 523 3870 4 775 69 208 4 776 347 3901 4 777 804 6816 4 778 24226 65535 4 779 78 350 4 780 620 3919 4 781 98 1543 4 782 2603 9557 4 783 1023 4407 4 784 398 2375 4 785 396 941 4 786 275 1469 4 787 2536 9957 4 788 90 654 4 789 1381 1204 4 790 83 237 4 791 2004 6445 4 792 106 612 4 793 754 4747 4 794 306 762 4 795 1886 6674 4 796 3420 37425 4 797 90 212 4 798 345 1919 4 799 219 1344 4 800 498 2511 4 801 359 4537 4 802 809 3822 4 803 260 3970 4 804 916 2498 4 805 65 187 4 806 72 314 4 807 81 159 4 808 65 814 4 809 238 947 4 810 91 191 4 811 229 697 4 812 520 2530 4 813 243 687 4 814 297 1835 4 815 634 1939 4 816 357 2783 4 817 58 366 4 818 430 2888 4 819 362 1132 4 820 110 617 4 821 500 4573 4 822 164 736 4 823 63 236 4 824 113 696 4 825 1056 3736 4 826 310 1438 4 827 634 6330 4 828 115 968 4 829 61 204 4 830 159 316 4 831 500 1590 4 832 230 2161 4 833 341 839 4 834 391 1986 4 835 4304 9298 4 836 62 1145 4 837 616 2004 4 838 949 4969 4 839 1533 9224 4 840 444 2663 4 841 71 172 4 842 319 1183 4 843 462 3161 4 844 508 3888 4 845 306 2533 4 846 2023 6099 4 847 895 4473 4 848 118 703 4 849 483 2985 4 850 179 740 4 851 149 310 4 852 832 4399 4 853 72 536 4 854 522 1440 4 855 58 756 4 856 87 530 4 857 74 368 4 858 1222 23697 4 859 74 159 4 860 164 679 4 861 145 305 4 862 304 1652 4 863 91 209 4 864 235 712 4 865 64 485 4 866 458 4575 4 867 92 258 4 868 5033 50026 4 869 67 381 4 870 388 1651 4 871 84 710 4 872 102 500 4 873 579 2327 4 874 170 1499 4 875 96 1201 4 876 2972 65535 4 877 152 1353 4 878 184 1277 4 879 85 539 4 880 312 1512 4 881 137 1214 4 882 84 280 4 883 62 151 4 884 210 919 4 885 71 449 4 886 79 278 4 887 108 710 4 888 165 959 4 889 103 1372 4 890 67 478 4 891 12688 65535 4 892 129 334 4 893 367 1872 4 894 499 2790 4 895 632 2236 4 896 7263 44262 4 897 213 1114 4 898 2494 28552 4 899 80 958 4 900 194 754 4 901 443 2055 4 902 71 212 4 903 90 793 4 904 57 380 4 905 301 1527 4 906 118 1087 4 907 227 2798 4 908 4469 27687 4 909 95 340 4 910 87 1361 4 911 246 1114 4 912 76 405 4 913 77 415 4 914 331 4757 4 915 8571 64875 4 916 460 2755 4 917 234 1486 4 918 59 132 4 919 142 941 4 920 313 2294 4 921 592 3211 4 922 593 2137 4 923 234 1231 4 924 18716 65535 4 925 231 1328 4 926 138 803 4 927 239 731 4 928 1864 14390 4 929 136 864 4 930 272 1623 4 931 82 281 4 932 120 346 4 933 80 135 4 934 128 270 4 935 87 138 4 936 210 1188 4 937 118 771 4 938 646 1607 4 939 384 2640 4 940 191 1345 4 941 152 1155 4 942 70 277 4 943 3003 7287 4 944 64 194 4 945 355 2407 4 946 197 718 4 947 232 2036 4 948 594 2122 4 949 295 1464 4 950 217 1054 4 951 70 826 4 952 241 1277 4 953 376 1902 4 954 214 1596 4 955 72 1687 4 956 171 1107 4 957 2068 6547 4 958 96 568 4 959 1180 3135 4 960 59 971 4 961 73 880 4 962 651 3402 4 963 320 1548 4 964 280 1808 4 965 302 1710 4 966 324 1839 4 967 56 929 4 968 291 1649 4 969 1788 9904 4 970 468 2982 4 971 110 797 4 972 580 5391 4 973 84 992 4 974 1331 4612 4 975 435 2352 4 976 830 4883 4 977 177 879 4 978 129 1016 4 979 92 1103 4 980 340 2712 4 981 287 3757 4 982 455 1928 4 983 254 1689 4 984 988 2470 4 985 151 2372 4 986 527 3787 4 987 193 1340 4 988 114 966 4 989 256 21836 4 990 8972 15671 4 991 287 1918 4 992 143 524 4 993 727 7331 4 994 84 343 4 995 1133 1289 4 996 172 1420 4 997 154 1647 4 998 159 1271 4 999 223 2721 4 1000 85 906 4 1001 82 262 4 1002 198 909 4 1003 112 2269 4 1004 1856 2775 4 1005 583 2354 4 1006 78 3059 4 1007 184 993 4 1008 96 958 4 1009 81 335 4 1010 2837 5464 4 1011 269 2093 4 1012 95 1160 4 1013 231 1644 4 1014 108 1845 4 1015 73 529 4 1016 71 492 4 1017 1145 7359 4 1018 278 1943 4 1019 1199 65535 4 1020 181 369 4 1021 96 523 4 1022 289 1589 4 1023 83 406 4 1024 128 762 4 1025 674 4495 4 1026 113 565 4 1027 102 3459 4 1028 239 1242 4 1029 421 3855 4 1030 85 840 4 1031 64 801 4 1032 57 664 4 1033 195 767 4 1034 445 1899 4 1035 313 1428 4 1036 62 303 4 1037 5005 30023 4 1038 84 469 4 1039 1125 2440 4 1040 123 603 4 1041 158 1227 4 1042 105 441 4 1043 249 1375 4 1044 204 752 4 1045 196 951 4 1046 111 966 4 1047 69 982 4 1048 759 2022 4 1049 216 1015 4 1050 152 1178 4 1051 573 3015 4 1052 222 1954 4 1053 87 563 4 1054 366 2715 4 1055 320 1247 4 1056 297 482 4 1057 68 215 4 1058 63 578 4 1059 2176 17332 4 1060 157 907 4 1061 112 510 4 1062 139 746 4 1063 620 4686 4 1064 211 1531 4 1065 5495 46694 4 1066 136 1358 4 1067 135 1142 4 1068 1081 5934 4 1069 6727 44615 4 1070 87 599 4 1071 1595 8649 4 1072 2326 50191 4 1073 94 183 4 1074 244 2218 4 1075 71 445 4 1076 82 150 4 1077 575 3433 4 1078 122 524 4 1079 69 497 4 1080 273 9158 4 1081 277 1100 4 1082 383 21691 4 1083 1392 11523 4 1084 208 1249 4 1085 80 332 4 1086 309 1030 4 1087 179 1247 4 1088 278 446 4 1089 85 391 4 1090 153 171 4 1091 121 493 4 1092 186 448 4 1093 208 901 4 1094 1915 2827 4 1095 68 438 4 1096 269 987 4 1097 311 8110 4 1098 944 10140 4 1099 89 454 4 1100 82 874 4 1101 228 1205 4 1102 863 6932 4 1103 158 782 4 1104 597 2539 4 1105 206 526 4 1106 1372 6670 4 1107 85 1602 4 1108 304 2234 4 1109 248 2366 4 1110 244 1613 4 1111 180 1226 4 1112 81 342 4 1113 118 1488 4 1114 488 2017 4 1115 406 1349 4 1116 166 1206 4 1117 221 947 4 1118 66 435 4 1119 675 5498 4 1120 74 725 4 1121 599 5380 4 1122 208 1743 4 1123 554 1794 4 1124 269 1758 4 1125 604 3658 4 1126 1164 4463 4 1127 280 1611 4 1128 660 3667 4 1129 278 1079 4 1130 1554 8542 4 1131 483 4323 4 1132 202 2145 4 1133 412 2027 4 1134 77 667 4 1135 90 393 4 1136 439 3598 4 1137 185 731 4 1138 68 325 4 1139 69 243 4 1140 53 200 4 1141 248 683 4 1142 68 116 4 1143 3189 8851 4 1144 89 100 4 1145 125 810 4 1146 78 194 4 1147 363 2573 4 1148 349 663 4 1149 590 2999 4 1150 56 305 4 1151 1422 3849 4 1152 74 330 4 1153 214 1167 4 1154 167 744 4 1155 77 369 4 1156 88 387 4 1157 7541 52476 4 1158 1392 2896 4 1159 2632 4405 4 1160 17506 58838 4 1161 8123 23503 4 1162 68 412 4 1163 21708 65535 4 1164 197 1073 4 1165 303 1614 4 1166 81 1423 4 1167 137 1235 4 1168 85 356 4 1169 165 518 4 1170 111 490 4 1171 55 185 4 1172 128 845 4 1173 632 2387 4 1174 1245 2972 4 1175 66 149 4 1176 1540 22349 4 1177 110 459 4 1178 71 192 4 1179 172 712 4 1180 3763 18187 4 1181 69 1076 4 1182 121 1025 4 1183 152 952 4 1184 60 563 4 1185 106 941 4 1186 66 597 4 1187 86 444 4 1188 11955 55105 4 1189 125 563 4 1190 74 653 4 1191 68 140 4 1192 509 2200 4 1193 61 128 4 1194 145 634 4 1195 62 444 4 1196 216 1336 4 1197 158 549 4 1198 188 1406 4 1199 54 443 4 1200 7709 28145 4 1201 63 473 4 1202 157 856 4 1203 170 754 4 1204 63 183 4 1205 465 3354 4 1206 501 3932 4 1207 67 363 4 1208 79 314 4 1209 318 1316 4 1210 423 696 4 1211 61 187 4 1212 362 1119 4 1213 3371 24971 4 1214 71 176 4 1215 116 941 4 1216 251 1503 4 1217 1558 3152 4 1218 61 224 4 1219 215 851 4 1220 195 718 4 1221 232 881 4 1222 177 646 4 1223 65 135 4 1224 65 111 4 1225 318 1159 4 1226 89 205 4 1227 63 719 4 1228 245 1669 4 1229 61 988 4 1230 73 683 4 1231 58 192 4 1232 243 1090 4 1233 355 726 4 1234 111 500 4 1235 119 384 4 1236 9674 49028 4 1237 645 2551 4 1238 93 592 4 1239 105 295 4 1240 250 1349 4 1241 455 2367 4 1242 462 2860 4 1243 61 230 4 1244 1190 2861 4 1245 49 148 4 1246 111 556 4 1247 70 226 4 1248 94 523 4 1249 98 876 4 1250 69 847 4 1251 145 382 4 1252 128 256 4 1253 69 169 4 1254 147 808 4 1255 68 208 4 1256 217 785 4 1257 68 135 4 1258 62 210 4 1259 58 205 4 1260 79 245 4 1261 569 1032 4 1262 76 228 4 1263 371 2158 4 1264 58 146 4 1265 66 250 4 1266 64 650 4 1267 59 257 4 1268 98 444 4 1269 63 289 4 1270 424 1258 4 1271 100 484 4 1272 81 368 4 1273 124 753 4 1274 4101 64540 4 1275 81 447 4 1276 45 173 4 1277 62 625 4 1278 930 4925 4 1279 68 234 4 1280 187 577 4 1281 77 421 4 1282 238 2030 4 1283 100 748 4 1284 96 385 4 1285 61 126 4 1286 135 229 4 1287 165 672 4 1288 1680 2546 4 1289 61 470 4 1290 47 206 4 1291 126 914 4 1292 88 407 4 1293 198 821 4 1294 91 443 4 1295 179 623 4 1296 635 2484 4 1297 149 1060 4 1298 60 192 4 1299 190 1267 4 1300 58 227 4 1301 170 1407 4 1302 139 405 4 1303 54 321 4 1304 253 1289 4 1305 122 694 4 1306 79 448 4 1307 166 1188 4 1308 413 1490 4 1309 161 257 4 1310 158 302 4 1311 67 185 4 1312 743 7364 4 1313 411 2706 4 1314 322 1745 4 1315 173 890 4 1316 132 721 4 1317 755 4454 4 1318 191 879 4 1319 68 282 4 1320 266 1144 4 1321 256 2438 4 1322 81 231 4 1323 617 3232 4 1324 260 896 4 1325 8422 23388 4 1326 46 286 4 1327 219 1081 4 1328 2307 18522 4 1329 66 169 4 1330 288 1384 4 1331 56 134 4 1332 181 813 4 1333 186 818 4 1334 404 1116 4 1335 64 392 4 1336 148 353 4 1337 156 716 4 1338 153 564 4 1339 66 380 4 1340 187 1000 4 1341 142 885 4 1342 274 2414 4 1343 110 413 4 1344 83 548 4 1345 159 1390 4 1346 71 192 4 1347 73 171 4 1348 272 1746 4 1349 100 352 4 1350 245 809 4 1351 384 1064 4 1352 331 1444 4 1353 144 466 4 1354 389 1811 4 1355 105 306 4 1356 566 5895 4 1357 77 334 4 1358 161 628 4 1359 46 158 4 1360 69 148 4 1361 339 1653 4 1362 193 998 4 1363 134 1028 4 1364 125 673 4 1365 584 1678 4 1366 535 3190 4 1367 917 3345 4 1368 101 439 4 1369 91 495 4 1370 1496 6890 4 1371 97 6538 4 1372 72 204 4 1373 124 673 4 1374 125 373 4 1375 288 622 4 1376 56 238 4 1377 52 217 4 1378 90 325 4 1379 99 507 4 1380 256 2401 4 1381 51 445 4 1382 76 346 4 1383 47 118 4 1384 147 491 4 1385 67 206 4 1386 317 446 4 1387 87 653 4 1388 369 1728 4 1389 52 139 4 1390 60 398 4 1391 63 189 4 1392 120 1067 4 1393 51 138 4 1394 275 1127 4 1395 2178 7631 4 1396 93 275 4 1397 58 201 4 1398 64 317 4 1399 97 680 4 1400 142 673 4 1401 327 1846 4 1402 155 390 4 1403 218 825 4 1404 72 588 4 1405 183 4252 4 1406 132 361 4 1407 128 691 4 1408 80 1081 4 1409 137 2425 4 1410 66 242 4 1411 1118 3890 4 1412 178 1120 4 1413 93 267 4 1414 112 332 4 1415 413 765 4 1416 105 416 4 1417 104 765 4 1418 113 320 4 1419 91 598 4 1420 65 164 4 1421 358 5254 4 1422 335 2613 4 1423 321 503 4 1424 326 1891 4 1425 133 1468 4 1426 137 840 4 1427 1284 5336 4 1428 117 598 4 1429 75 368 4 1430 165 702 4 1431 88 328 4 1432 311 5255 4 1433 64 149 4 1434 89 503 4 1435 71 170 4 1436 388 3016 4 1437 153 561 4 1438 191 1281 4 1439 54 214 4 1440 1775 3134 4 1441 83 439 4 1442 305 1101 4 1443 65 224 4 1444 499 1573 4 1445 145 417 4 1446 5548 45138 4 1447 1382 6137 4 1448 73 268 4 1449 310 1581 4 1450 183 749 4 1451 16867 65535 4 1452 512 6534 4 1453 64 664 4 1454 292 2531 4 1455 229 830 4 1456 1789 23000 4 1457 12254 65535 4 1458 85 530 4 1459 167 838 4 1460 371 3086 4 1461 75 103 4 1462 204 552 4 1463 1032 4923 4 1464 82 326 4 1465 109 366 4 1466 216 2568 4 1467 93 371 4 1468 6798 24286 4 1469 420 2110 4 1470 95 992 4 1471 356 2461 4 1472 3264 10087 4 1473 493 1372 4 1474 373 6657 4 1475 373 1891 4 1476 4205 19398 4 1477 173 546 4 1478 265 1564 4 1479 89 579 4 1480 80 73 4 1481 128 695 4 1482 67 140 4 1483 1073 3653 4 1484 823 1976 4 1485 4024 24811 4 1486 448 1866 4 1487 128 612 4 1488 152 781 4 1489 73 511 4 1490 810 3661 4 1491 394 3955 4 1492 85 275 4 1493 80 551 4 1494 64 817 4 1495 8564 50260 4 1496 71 120 4 1497 410 1445 4 1498 398 2291 4 1499 82 235 4 1500 100 554 4 1501 352 1181 4 1502 66 226 4 1503 191 797 4 1504 60 4197 4 1505 102 336 4 1506 2515 8224 4 1507 91 292 4 1508 75 275 4 1509 74 95 4 1510 363 2634 4 1511 63 144 4 1512 1912 5550 4 1513 57 102 4 1514 348 716 4 1515 189 2491 4 1516 78 103 4 1517 265 1010 4 1518 835 3678 4 1519 736 6063 4 1520 113 526 4 1521 115 1042 4 1522 66 123 4 1523 193 1193 4 1524 2276 6341 4 1525 93 153 4 1526 353 2105 4 1527 105 448 4 1528 151 921 4 1529 68 248 4 1530 156 908 4 1531 114 740 4 1532 79 383 4 1533 298 1616 4 1534 66 188 4 1535 84 125 4 1536 76 191 4 1537 4880 15996 4 1538 339 5890 4 1539 404 17028 4 1540 564 3963 4 1541 57 244 4 1542 452 6092 4 1543 179 1926 4 1544 63 208 4 1545 120 553 4 1546 251 2304 4 1547 3787 21230 4 1548 1102 5813 4 1549 144 394 4 1550 482 645 4 1551 110 651 4 1552 957 929 4 1553 118 692 4 1554 390 2699 4 1555 72 412 4 1556 141 530 4 1557 53 142 4 1558 99 327 4 1559 164 1210 4 1560 142 486 4 1561 408 622 4 1562 405 1247 4 1563 186 768 4 1564 1353 6863 4 1565 199 2635 4 1566 304 2139 4 1567 146 577 4 1568 295 1685 4 1569 149 856 4 1570 84 273 4 1571 67 227 4 1572 67 977 4 1573 7869 18517 4 1574 891 9647 4 1575 742 3999 4 1576 142 465 4 1577 209 466 4 1578 88 619 4 1579 153 874 4 1580 75 282 4 1581 103 622 4 1582 76 23516 4 1583 342 2011 4 1584 250 1882 4 1585 64 90 4 1586 380 1032 4 1587 448 2180 4 1588 510 2976 4 1589 342 1932 4 1590 131 709 4 1591 135 390 4 1592 194 536 4 1593 338 3093 4 1594 142 392 4 1595 1163 6639 4 1596 92 977 4 1597 79 243 4 1598 3208 7061 4 1599 58 157 4 1600 387 3351 4 1601 225 1095 4 1602 744 3218 4 1603 710 5500 4 1604 118 623 4 1605 802 2435 4 1606 245 823 4 1607 292 1582 4 1608 238 1005 4 1609 12933 19009 4 1610 75 200 4 1611 1338 6696 4 1612 440 4048 4 1613 1165 3615 4 1614 132 1373 4 1615 103 441 4 1616 77 154 4 1617 55 156 4 1618 129 308 4 1619 247 2138 4 1620 58 222 4 1621 260 2065 4 1622 109 554 4 1623 110 479 4 1624 66 175 4 1625 154 614 4 1626 96 734 4 1627 1697 5412 4 1628 44 203 4 1629 2253 12171 4 1630 95 516 4 1631 5204 25362 4 1632 732 6892 4 1633 64 140 4 1634 94 649 4 1635 58 131 4 1636 68 232 4 1637 1120 5909 4 1638 81 289 4 1639 82 156 4 1640 69 201 4 1641 189 860 4 1642 123 741 4 1643 222 1205 4 1644 211 482 4 1645 121 366 4 1646 68 153 4 1647 164 869 4 1648 243 896 4 1649 60 196 4 1650 200 1273 4 1651 388 1562 4 1652 2378 13569 4 1653 1537 9239 4 1654 127 334 4 1655 84 293 4 1656 2302 2202 4 1657 95 186 4 1658 1647 5683 4 1659 93 567 4 1660 303 3179 4 1661 93 465 4 1662 2417 8555 4 1663 212 1913 4 1664 135 583 4 1665 460 2538 4 1666 847 6753 4 1667 280 2311 4 1668 254 879 4 1669 594 8211 4 1670 9399 23148 4 1671 64 234 4 1672 2313 13048 4 1673 73 343 4 1674 710 3595 4 1675 47 296 4 1676 63 352 4 1677 380 3184 4 1678 293 2538 4 1679 201 2008 4 1680 95 1569 4 1681 62 344 4 1682 5554 21314 4 1683 74 198 4 1684 67 150 4 1685 247 1334 4 1686 1119 2764 4 1687 222 1474 4 1688 189 1512 4 1689 104 317 4 1690 1068 5259 4 1691 933 2358 4 1692 417 3623 4 1693 114 1053 4 1694 113 817 4 1695 75 190 4 1696 96 512 4 1697 95 308 4 1698 94 317 4 1699 342 1891 4 1700 60 631 4 1701 327 2653 4 1702 168 986 4 1703 228 2281 4 1704 114 459 4 1705 348 2795 4 1706 171 708 4 1707 783 4305 4 1708 188 1164 4 1709 810 12266 4 1710 1491 5305 4 1711 149 375 4 1712 46 149 4 1713 84 408 4 1714 104 199 4 1715 119 603 4 1716 239 1743 4 1717 138 715 4 1718 55 61 4 1719 215 1225 4 1720 68 150 4 1721 323 2920 4 1722 142 535 4 1723 323 1787 4 1724 178 3285 4 1725 205 1291 4 1726 62 126 4 1727 1526 3760 4 1728 1209 27918 4 1729 898 4881 4 1730 103 162 4 1731 131 276 4 1732 242 3502 4 1733 255 2528 4 1734 289 1931 4 1735 8585 65535 4 1736 83 340 4 1737 1963 6055 4 1738 81 267 4 1739 92 335 4 1740 206 395 4 1741 107 294 4 1742 173 860 4 1743 164 976 4 1744 128 661 4 1745 65 159 4 1746 71 245 4 1747 62 138 4 1748 65 163 4 1749 419 2053 4 1750 151 750 4 1751 186 855 4 1752 81 234 4 1753 69 157 4 1754 271 1569 4 1755 285 1873 4 1756 3833 34494 4 1757 341 3161 4 1758 114 639 4 1759 1734 5833 4 1760 141 836 4 1761 81 186 4 1762 11088 65535 4 1763 227 518 4 1764 96 600 4 1765 332 490 4 1766 2261 6051 4 1767 287 1222 4 1768 183 690 4 1769 95 1218 4 1770 87 542 4 1771 106 349 4 1772 185 2592 4 1773 199 1381 4 1774 2464 7534 4 1775 83 208 4 1776 8091 65535 4 1777 295 1623 4 1778 90 546 4 1779 335 1449 4 1780 74 249 4 1781 1634 17396 4 1782 1655 2683 4 1783 1144 5702 4 1784 111 1085 4 1785 67 100 4 1786 114 454 4 1787 90 319 4 1788 574 3548 4 1789 320 1761 4 1790 119 676 4 1791 332 1160 4 1792 95 245 4 1793 1128 2343 4 1794 318 1787 4 1795 892 1940 4 1796 163 948 4 1797 374 1980 4 1798 320 1366 4 1799 215 1156 4 1800 558 1945 4 1801 2844 33393 4 1802 52 115 4 1803 1418 2014 4 1804 75 171 4 1805 151 902 4 1806 97 559 4 1807 90 496 4 1808 266 3532 4 1809 845 3271 4 1810 646 5588 4 1811 156 1159 4 1812 117 476 4 1813 105 459 4 1814 74 443 4 1815 183 975 4 1816 219 2114 4 1817 48 303 4 1818 87 474 4 1819 1824 4689 4 1820 728 12903 4 1821 163 529 4 1822 2108 12624 4 1823 642 3072 4 1824 225 1032 4 1825 183 1190 4 1826 147 685 4 1827 59 267 4 1828 437 1505 4 1829 593 1955 4 1830 1229 2428 4 1831 83 417 4 1832 2936 12664 4 1833 100 578 4 1834 109 515 4 1835 45 437 4 1836 69 170 4 1837 62 179 4 1838 114 289 4 1839 91 372 4 1840 62 136 4 1841 621 2248 4 1842 183 834 4 1843 128 381 4 1844 106 346 4 1845 80 439 4 1846 88 515 4 1847 488 1000 4 1848 324 529 4 1849 509 2755 4 1850 377 1475 4 1851 181 1823 4 1852 58 207 4 1853 49 360 4 1854 75 361 4 1855 63 194 4 1856 45 124 4 1857 357 2363 4 1858 192 1402 4 1859 1356 8880 4 1860 74 280 4 1861 115 2734 4 1862 72 184 4 1863 98 184 4 1864 205 828 4 1865 541 3138 4 1866 163 609 4 1867 179 2179 4 1868 156 212 4 1869 646 2009 4 1870 3553 21070 4 1871 134 1035 4 1872 116 3038 4 1873 813 3238 4 1874 130 548 4 1875 507 842 4 1876 622 1554 4 1877 122 682 4 1878 120 563 4 1879 225 1052 4 1880 115 559 4 1881 283 497 4 1882 153 1022 4 1883 81 209 4 1884 495 2325 4 1885 171 645 4 1886 963 6146 4 1887 130 883 4 1888 90 460 4 1889 210 376 4 1890 513 3762 4 1891 283 1767 4 1892 159 774 4 1893 78 318 4 1894 57 813 4 1895 461 1373 4 1896 75 256 4 1897 1106 6068 4 1898 1515 7719 4 1899 597 4834 4 1900 283 3903 4 1901 3251 39004 4 1902 85 703 4 1903 671 985 4 1904 135 213 4 1905 374 2296 4 1906 1004 2326 4 1907 105 424 4 1908 520 2151 4 1909 1492 6030 4 1910 112 667 4 1911 147 472 4 1912 335 2993 4 1913 124 620 4 1914 371 1124 4 1915 116 300 4 1916 82 221 4 1917 447 8979 4 1918 124 311 4 1919 74 222 4 1920 261 4963 4 1921 539 3215 4 1922 80 489 4 1923 308 805 4 1924 1348 4394 4 1925 130 1575 4 1926 208 714 4 1927 397 1979 4 1928 153 897 4 1929 181 244 4 1930 295 3974 4 1931 310 1443 4 1932 276 1564 4 1933 85 374 4 1934 1364 754 4 1935 87 247 4 1936 2701 1097 4 1937 83 334 4 1938 589 1781 4 1939 5434 21187 4 1940 355 1258 4 1941 623 6271 4 1942 597 4690 4 1943 331 1477 4 1944 101 533 4 1945 725 6007 4 1946 952 5342 4 1947 48 230 4 1948 99 516 4 1949 128 591 4 1950 509 1055 4 1951 75 1249 4 1952 70 331 4 1953 77 232 4 1954 3059 9904 4 1955 1126 4894 4 1956 579 2767 4 1957 137 696 4 1958 205 640 4 1959 255 4711 4 1960 1198 3586 4 1961 58 142 4 1962 2881 9267 4 1963 73 176 4 1964 68 334 4 1965 93 455 4 1966 124 986 4 1967 103 433 4 1968 125 961 4 1969 136 542 4 1970 484 1153 4 1971 402 1521 4 1972 235 3968 4 1973 2561 25944 4 1974 537 1778 4 1975 579 3891 4 1976 261 1797 4 1977 113 688 4 1978 347 4431 4 1979 133 930 4 1980 354 1296 4 1981 269 15996 4 1982 253 953 4 1983 370 2783 4 1984 53 184 4 1985 1143 10745 4 1986 75 298 4 1987 877 4462 4 1988 286 2551 4 1989 320 964 4 1990 263 6632 4 1991 497 5489 4 1992 650 6187 4 1993 103 301 4 1994 50 203 4 1995 157 1588 4 1996 143 3894 4 1997 1065 9055 4 1998 243 680 4 1999 8844 65535 4 2000 142 3074 4 2001 308 1838 4 2002 301 1526 4 2003 662 1549 4 2004 672 1197 4 2005 83 774 4 2006 483 1510 4 2007 257 835 4 2008 1729 4572 4 2009 66 128 4 2010 583 5717 4 2011 63 115 4 2012 1653 9829 4 2013 204 638 4 2014 449 5686 4 2015 1522 1734 4 2016 582 3648 4 2017 1976 12557 4 2018 85 331 4 2019 69 215 4 2020 302 1900 4 2021 68 221 4 2022 500 5788 4 2023 197 1016 4 2024 5278 47440 4 2025 73 196 4 2026 490 1734 4 2027 127 593 4 2028 6439 26181 4 2029 284 1441 4 2030 674 2052 4 2031 82 983 4 2032 86 480 4 2033 1393 5299 4 2034 80 1046 4 2035 60 436 4 2036 123 753 4 2037 106 805 4 2038 294 1132 4 2039 68 113 4 2040 129 396 4 2041 57 173 4 2042 70 296 4 2043 219 1396 4 2044 203 1063 4 2045 94 594 4 2046 172 839 4 2047 87 738 4 2048 6629 29845 4 2049 85 423 4 2050 376 1497 4 2051 28809 65535 4 2052 110 904 4 2053 67 317 4 2054 129 788 4 2055 552 5505 4 2056 165 814 4 2057 62 197 4 2058 64 181 4 2059 164 693 4 2060 114 602 4 2061 83 310 4 2062 309 1626 4 2063 69 973 4 2064 659 2711 4 2065 114 830 4 2066 156 1746 4 2067 84 1050 4 2068 94 1540 4 2069 70 380 4 2070 587 4578 4 2071 69 376 4 2072 578 1708 4 2073 72 270 4 2074 107 78 4 2075 243 1583 4 2076 155 388 4 2077 82 378 4 2078 56 253 4 2079 293 1271 4 2080 66 171 4 2081 920 4818 4 2082 1959 12164 4 2083 130 979 4 2084 95 1093 4 2085 143 1050 4 2086 3754 25459 4 2087 89 271 4 2088 125 1199 4 2089 63 140 4 2090 1150 8507 4 2091 77 204 4 2092 344 7942 4 2093 258 2044 4 2094 319 1654 4 2095 700 3098 4 2096 481 1927 4 2097 2188 12042 4 2098 163 1288 4 2099 1981 20603 4 2100 3082 18243 4 2101 269 1396 4 2102 487 4332 4 2103 158 1674 4 2104 76 658 4 2105 649 5213 4 2106 80 910 4 2107 91 275 4 2108 78 308 4 2109 89 226 4 2110 138 964 4 2111 158 776 4 2112 252 870 4 2113 1161 7549 4 2114 476 1381 4 2115 80 685 4 2116 227 4077 4 2117 2317 9312 4 2118 909 2369 4 2119 304 6592 4 2120 548 3178 4 2121 377 1838 4 2122 177 1396 4 2123 76 564 4 2124 1130 5696 4 2125 3041 18246 4 2126 622 1383 4 2127 106 1167 4 2128 66 155 4 2129 299 2835 4 2130 307 1150 4 2131 146 2066 4 2132 70 370 4 2133 182 741 4 2134 151 984 4 2135 55 1164 4 2136 216 2309 4 2137 596 4303 4 2138 273 1649 4 2139 331 998 4 2140 415 1648 4 2141 138 724 4 2142 77 1190 4 2143 69 17282 4 2144 413 732 4 2145 429 2389 4 2146 110 852 4 2147 133 1019 4 2148 68 429 4 2149 1486 5282 4 2150 866 3697 4 2151 4479 18340 4 2152 83 861 4 2153 1098 6710 4 2154 93 1223 4 2155 306 3504 4 2156 108 485 4 2157 132 346 4 2158 217 2109 4 2159 430 1958 4 2160 630 2829 4 2161 341 1316 4 2162 75 404 4 2163 172 762 4 2164 60 595 4 2165 1286 3350 4 2166 406 685 4 2167 4445 27238 4 2168 105 1418 4 2169 329 2496 4 2170 402 4821 4 2171 2022 10739 4 2172 137 1561 4 2173 358 3285 4 2174 268 3501 4 2175 71 192 4 2176 97 631 4 2177 150 495 4 2178 79 249 4 2179 547 3545 4 2180 87 385 4 2181 163 842 4 2182 72 319 4 2183 599 3931 4 2184 270 1960 4 2185 191 2473 4 2186 495 2178 4 2187 2378 34945 4 2188 330 2254 4 2189 818 4929 4 2190 993 4339 4 2191 908 5103 4 2192 75 273 4 2193 117 773 4 2194 80 721 4 2195 1409 7618 4 2196 1601 4852 4 2197 552 4353 4 2198 163 325 4 2199 124 975 4 2200 205 718 4 2201 123 1161 4 2202 155 1580 4 2203 1134 6754 4 2204 426 3668 4 2205 1898 12105 4 2206 73 422 4 2207 2726 19929 4 2208 147 1515 4 2209 756 2512 4 2210 11515 60457 4 2211 134 572 4 2212 62 159 4 2213 1221 12650 4 2214 338 1187 4 2215 77 210 4 2216 80 176 4 2217 287 3151 4 2218 80 407 4 2219 1825 35455 4 2220 66 1021 4 2221 115 1125 4 2222 81 505 4 2223 79 794 4 2224 213 2282 4 2225 123 658 4 2226 168 1027 4 2227 71 343 4 2228 82 5479 4 2229 273 1565 4 2230 271 978 4 2231 1583 2628 4 2232 1891 52747 4 2233 487 1540 4 2234 433 4060 4 2235 80 499 4 2236 1948 5056 4 2237 121 1398 4 2238 1854 11719 4 2239 1347 18306 4 2240 88 753 4 2241 170 1502 4 2242 1357 6893 4 2243 767 4196 4 2244 146 2005 4 2245 57 144 4 2246 251 1583 4 2247 214 1498 4 2248 4410 60812 4 2249 415 1984 4 2250 1051 6537 4 2251 65 318 4 2252 3437 17581 4 2253 81 384 4 2254 693 3018 4 2255 308 2140 4 2256 1346 13836 4 2257 83 979 4 2258 4728 6103 4 2259 202 4184 4 2260 1381 5200 4 2261 119 491 4 2262 103 575 4 2263 215 195 4 2264 82 232 4 2265 1104 3462 4 2266 45 234 4 2267 85 329 4 2268 247 1167 4 2269 75 197 4 2270 383 2036 4 2271 710 3444 4 2272 1355 5314 4 2273 211 802 4 2274 66 578 4 2275 667 2771 4 2276 260 2050 4 2277 2677 13927 4 2278 448 1781 4 2279 753 9584 4 2280 176 11620 4 2281 106 778 4 2282 309 4065 4 2283 2129 18252 4 2284 574 2911 4 2285 100 375 4 2286 68 207 4 2287 239 1206 4 2288 61 424 4 2289 94 1046 4 2290 69 752 4 2291 67 624 4 2292 88 408 4 2293 289 2708 4 2294 332 2096 4 2295 84 1254 4 2296 121 159 4 2297 589 4375 4 2298 65 195 4 2299 541 3807 4 2300 221 1501 4 2301 309 3170 4 2302 154 544 4 2303 767 5228 4 2304 1744 16874 4 2305 1151 4581 4 2306 178 1724 4 2307 733 5611 4 2308 784 4886 4 2309 127 586 4 2310 66 320 4 2311 1743 11552 4 2312 156 247 4 2313 5362 47197 4 2314 6361 28513 4 2315 8392 20349 4 2316 12905 27031 4 2317 37 126 4 2318 91 909 4 2319 82 299 4 2320 59 317 4 2321 48 300 4 2322 69 160 4 2323 660 3124 4 2324 112 682 4 2325 58 204 4 2326 101 778 4 2327 68 248 4 2328 7937 41616 4 2329 679 2682 4 2330 6528 29218 4 2331 66 165 4 2332 1962 2483 4 2333 65 886 4 2334 6336 18684 4 2335 78 650 4 2336 57 634 4 2337 66 250 4 2338 57 337 4 2339 146 1243 4 2340 197 685 4 2341 70 934 4 2342 64 354 4 2343 60 263 4 2344 62 266 4 2345 63 208 4 2346 51 171 4 2347 84 589 4 2348 82 782 4 2349 79 601 4 2350 224 2694 4 2351 3017 35503 4 2352 99 741 4 2353 89 887 4 2354 85 974 4 2355 275 1569 4 2356 64 584 4 2357 107 550 4 2358 8324 55880 4 2359 637 3878 4 2360 20240 65535 4 2361 97 215 4 2362 94 404 4 2363 2706 9727 4 2364 97 536 4 2365 216 1035 4 2366 145 781 4 2367 74 239 4 2368 67 198 4 2369 193 869 4 2370 108 714 4 2371 78 373 4 2372 93 549 4 2373 78 591 4 2374 136 309 4 2375 4199 47441 4 2376 69 105 4 2377 114 789 4 2378 115 324 4 2379 2348 17689 4 2380 53 99 4 2381 87 434 4 2382 406 1149 4 2383 63 557 4 2384 124 584 4 2385 163 972 4 2386 159 650 4 2387 62 301 4 2388 191 2018 4 2389 564 2298 4 2390 65 308 4 2391 976 931 4 2392 137 558 4 2393 73 262 4 2394 127 502 4 2395 142 404 4 2396 98 906 4 2397 52 393 4 2398 64 320 4 2399 62 335 4 2400 45 211 4 2401 112 377 4 2402 55 378 4 2403 68 495 4 2404 162 960 4 2405 77 378 4 2406 65 255 4 2407 169 509 4 2408 47 297 4 2409 59 192 4 2410 129 411 4 2411 58 214 4 2412 61 98 4 2413 62 217 4 2414 60 248 4 2415 38 209 4 2416 61 181 4 2417 66 208 4 2418 379 1066 4 2419 62 104 4 2420 83 423 4 2421 49 163 4 2422 225 1145 4 2423 52 283 4 2424 61 464 4 2425 74 217 4 2426 58 343 4 2427 482 1967 4 2428 467 3806 4 2429 83 245 4 2430 103 532 4 2431 43 329 4 2432 192 869 4 2433 112 416 4 2434 64 295 4 2435 76 105 4 2436 203 977 4 2437 73 170 4 2438 122 495 4 2439 262 1212 4 2440 96 156 4 2441 98 363 4 2442 169 449 4 2443 297 2100 4 2444 569 1131 4 2445 135 250 4 2446 77 210 4 2447 208 1701 4 2448 140 1044 4 2449 113 738 4 2450 84 491 4 2451 59 106 4 2452 252 1826 4 2453 153 770 4 2454 218 1539 4 2455 333 2298 4 2456 100 400 4 2457 148 750 4 2458 263 2430 4 2459 129 847 4 2460 197 1038 4 2461 801 3632 4 2462 7026 36387 4 2463 96 298 4 2464 111 539 4 2465 103 911 4 2466 152 7824 4 2467 83 204 4 2468 75 190 4 2469 60 134 4 2470 557 65535 4 2471 47 261 4 2472 65 427 4 2473 55 129 4 2474 308 1965 4 2475 108 581 4 2476 628 1216 4 2477 72 126 4 2478 185 2571 4 2479 42 204 4 2480 193 1375 4 2481 67 119 4 2482 772 3195 4 2483 67 275 4 2484 61 439 4 2485 104 638 4 2486 917 6567 4 2487 52 244 4 2488 69 206 4 2489 580 1211 4 2490 114 312 4 2491 224 945 4 2492 56 184 4 2493 74 419 4 2494 48 646 4 2495 55 206 4 2496 49 237 4 2497 78 306 4 2498 272 2976 4 2499 135 761 4 2500 181 1165 4 2501 45 125 4 2502 344 1172 4 2503 288 998 4 2504 207 1054 4 2505 59 1105 4 2506 112 375 4 2507 123 805 4 2508 96 234 4 2509 108 361 4 2510 152 1186 4 2511 924 3894 4 2512 243 774 4 2513 113 278 4 2514 566 6463 4 2515 149 507 4 2516 125 243 4 2517 934 4404 4 2518 60 440 4 2519 319 2670 4 2520 86 230 4 2521 94 1135 4 2522 164 377 4 2523 961 8352 4 2524 53 140 4 2525 567 3949 4 2526 49 141 4 2527 907 3675 4 2528 48 121 4 2529 76 156 4 2530 56 183 4 2531 427 4375 4 2532 285 1958 4 2533 314 1855 4 2534 98 797 4 2535 54 266 4 2536 119 367 4 2537 682 3960 4 2538 80 253 4 2539 54 120 4 2540 74 415 4 2541 96 277 4 2542 1093 7054 4 2543 2728 3095 4 2544 90 512 4 2545 58 126 4 2546 338 3028 4 2547 79 110 4 2548 66 418 4 2549 271 1640 4 2550 135 1343 4 2551 107 270 4 2552 64 655 4 2553 53 230 4 2554 62 207 4 2555 64 249 4 2556 61 127 4 2557 209 1176 4 2558 87 344 4 2559 244 1650 4 2560 104 255 4 2561 259 2327 4 2562 63 477 4 2563 352 1926 4 2564 118 504 4 2565 178 1513 4 2566 59 168 4 2567 947 2293 4 2568 67 333 4 2569 148 529 4 2570 374 1746 4 2571 57 184 4 2572 288 8343 4 2573 220 605 4 2574 99 233 4 2575 104 368 4 2576 159 1190 4 2577 57 161 4 2578 318 2853 4 2579 237 2756 4 2580 199 1382 4 2581 100 457 4 2582 79 777 4 2583 223 830 4 2584 162 349 4 2585 63 121 4 2586 61 750 4 2587 210 787 4 2588 152 2062 4 2589 57 117 4 2590 229 1710 4 2591 45 105 4 2592 125 937 4 2593 64 196 4 2594 72 274 4 2595 97 447 4 2596 249 2895 4 2597 66 265 4 2598 186 2898 4 2599 41 179 4 2600 64 310 4 2601 314 557 4 2602 4365 45238 4 2603 12929 65535 4 2604 3671 2270 4 2605 907 5754 4 2606 101 757 4 2607 89 342 4 2608 5858 16557 4 2609 3077 14283 4 2610 86 673 4 2611 72 518 4 2612 3554 15942 4 2613 572 2857 4 2614 817 5649 4 2615 98 543 4 2616 519 5112 4 2617 107 124 4 2618 311 1241 4 2619 8568 52802 4 2620 61 113 4 2621 2879 15279 4 2622 76 1093 4 2623 940 2008 4 2624 538 2193 4 2625 2043 11309 4 2626 152 1348 4 2627 62 774 4 2628 12680 31245 4 2629 909 2245 4 2630 3529 12873 4 2631 78 175 4 2632 3291 8941 4 2633 171 1716 4 2634 73 621 4 2635 4679 16668 4 2636 105 271 4 2637 120 385 4 2638 638 1766 4 2639 118 303 4 2640 943 7953 4 2641 2630 17062 4 2642 565 1009 4 2643 469 1875 4 2644 2615 42286 4 2645 3685 23610 4 2646 5442 17785 4 2647 662 2234 4 2648 74 393 4 2649 1856 4918 4 2650 79 897 4 2651 64 333 4 2652 94 279 4 2653 102 305 4 2654 319 1804 4 2655 388 1098 4 2656 75 323 4 2657 603 2710 4 2658 57 334 4 2659 801 3591 4 2660 63 240 4 2661 3606 14345 4 2662 169 769 4 2663 3140 11457 4 2664 30089 65535 4 2665 69 158 4 2666 48 157 4 2667 71 62 4 2668 80 481 4 2669 74 104 4 2670 72 216 4 2671 256 647 4 2672 557 3904 4 2673 94 853 4 2674 243 646 4 2675 3318 10613 4 2676 182 1384 4 2677 163 1446 4 2678 200 1373 4 2679 153 1250 4 2680 229 1101 4 2681 296 1378 4 2682 679 5146 4 2683 291 2236 4 2684 584 3052 4 2685 77 288 4 2686 866 2599 4 2687 133 872 4 2688 72 557 4 2689 90 366 4 2690 111 519 4 2691 267 1080 4 2692 175 776 4 2693 109 505 4 2694 1015 1328 4 2695 62 244 4 2696 310 2942 4 2697 136 1253 4 2698 323 1537 4 2699 233 799 4 2700 128 656 4 2701 67 165 4 2702 130 582 4 2703 191 465 4 2704 138 846 4 2705 552 4104 4 2706 82 289 4 2707 37 150 4 2708 502 5778 4 2709 716 4350 4 2710 10735 54195 4 2711 1116 3798 4 2712 756 2682 4 2713 1894 8179 4 2714 86 935 4 2715 112 360 4 2716 311 1373 4 2717 222 629 4 2718 77 352 4 2719 142 702 4 2720 197 449 4 2721 53 245 4 2722 108 591 4 2723 72 429 4 2724 651 4099 4 2725 1432 5776 4 2726 394 2303 4 2727 68 352 4 2728 241 1836 4 2729 79 906 4 2730 554 3309 4 2731 213 874 4 2732 199 1436 4 2733 329 1233 4 2734 439 2546 4 2735 73 216 4 2736 125 1822 4 2737 574 1737 4 2738 434 1167 4 2739 50 226 4 2740 59 203 4 2741 288 2051 4 2742 76 416 4 2743 248 1504 4 2744 386 3401 4 2745 343 3545 4 2746 77 547 4 2747 137 2807 4 2748 6433 38846 4 2749 1270 2837 4 2750 64 184 4 2751 183 1026 4 2752 449 1809 4 2753 199 1898 4 2754 110 547 4 2755 204 1071 4 2756 206 944 4 2757 146 1163 4 2758 139 580 4 2759 450 1061 4 2760 95 336 4 2761 553 5871 4 2762 502 3887 4 2763 78 123 4 2764 74 317 4 2765 73 211 4 2766 110 769 4 2767 988 10429 4 2768 60 237 4 2769 390 1345 4 2770 635 887 4 2771 379 3891 4 2772 70 277 4 2773 95 377 4 2774 115 289 4 2775 2045 11250 4 2776 60 374 4 2777 811 3618 4 2778 78 400 4 2779 312 1450 4 2780 68 169 4 2781 45 187 4 2782 81 783 4 2783 911 5589 4 2784 112 306 4 2785 226 1283 4 2786 945 5845 4 2787 80 195 4 2788 86 511 4 2789 96 997 4 2790 112 341 4 2791 283 632 4 2792 119 306 4 2793 1270 10828 4 2794 93 438 4 2795 1078 9080 4 2796 79 304 4 2797 104 925 4 2798 61 391 4 2799 74 177 4 2800 222 4191 4 2801 68 155 4 2802 51 435 4 2803 68 187 4 2804 793 6549 4 2805 66 499 4 2806 133 857 4 2807 72 241 4 2808 227 1298 4 2809 406 3091 4 2810 4744 26886 4 2811 77 155 4 2812 294 1971 4 2813 89 430 4 2814 347 3239 4 2815 130 1624 4 2816 334 2640 4 2817 2816 18392 4 2818 782 15034 4 2819 66 263 4 2820 91 1385 4 2821 181 545 4 2822 148 1554 4 2823 143 2231 4 2824 112 653 4 2825 77 367 4 2826 326 2655 4 2827 209 3526 4 2828 140 853 4 2829 160 646 4 2830 5695 15596 4 2831 83 333 4 2832 612 6219 4 2833 181 3141 4 2834 336 796 4 2835 185 1609 4 2836 83 150 4 2837 70 265 4 2838 5607 21044 4 2839 1498 10075 4 2840 72 245 4 2841 145 927 4 2842 158 2265 4 2843 151 744 4 2844 107 285 4 2845 128 360 4 2846 261 2230 4 2847 69 204 4 2848 483 2293 4 2849 450 2800 4 2850 140 1086 4 2851 93 336 4 2852 756 6306 4 2853 153 756 4 2854 142 999 4 2855 59 173 4 2856 48 144 4 2857 107 1959 4 2858 60 539 4 2859 100 574 4 2860 157 225 4 2861 258 3854 4 2862 317 2680 4 2863 178 1500 4 2864 90 264 4 2865 119 741 4 2866 51 167 4 2867 119 625 4 2868 52 149 4 2869 1229 6620 4 2870 125 257 4 2871 118 400 4 2872 240 1346 4 2873 54 269 4 2874 136 1644 4 2875 86 1215 4 2876 73 125 4 2877 459 2091 4 2878 162 643 4 2879 106 462 4 2880 83 192 4 2881 287 1356 4 2882 60 355 4 2883 178 2463 4 2884 60 188 4 2885 4624 23668 4 2886 53 133 4 2887 3664 33682 4 2888 65 137 4 2889 279 2614 4 2890 167 561 4 2891 6091 46929 4 2892 103 292 4 2893 89 327 4 2894 263 1371 4 2895 462 1165 4 2896 358 1878 4 2897 335 1976 4 2898 57 146 4 2899 237 1750 4 2900 940 3380 4 2901 615 2318 4 2902 288 1045 4 2903 172 1205 4 2904 89 443 4 2905 173 626 4 2906 530 2121 4 2907 1160 4865 4 2908 78 195 4 2909 83 168 4 2910 53 513 4 2911 262 1286 4 2912 476 2222 4 2913 120 857 4 2914 3152 6719 4 2915 147 1691 4 2916 77 464 4 2917 123 289 4 2918 80 611 4 2919 49 336 4 2920 399 1597 4 2921 1959 21239 4 2922 878 6895 4 2923 15532 65535 4 2924 99 503 4 2925 77 384 4 2926 206 768 4 2927 83 666 4 2928 2513 4159 4 2929 674 3063 4 2930 47068 65535 4 2931 130 470 4 2932 211 644 4 2933 988 4682 4 2934 3843 23888 4 2935 236 1013 4 2936 13991 65535 4 2937 635 1696 4 2938 1640 11021 4 2939 237 728 4 2940 118 590 4 2941 8770 27451 4 2942 83 572 4 2943 270 1662 4 2944 101 488 4 2945 54 188 4 2946 606 2134 4 2947 238 444 4 2948 66 225 4 2949 109 422 4 2950 95 614 4 2951 141 1513 4 2952 191 1455 4 2953 90 586 4 2954 62 113 4 2955 7420 55559 4 2956 49 130 4 2957 857 3279 4 2958 58 104 4 2959 318 1508 4 2960 325 3629 4 2961 130 1251 4 2962 179 1039 4 2963 89 266 4 2964 78 240 4 2965 78 340 4 2966 106 2755 4 2967 67 121 4 2968 209 1615 4 2969 99 895 4 2970 260 2927 4 2971 77 406 4 2972 1020 3908 4 2973 201 1444 4 2974 437 3398 4 2975 200 787 4 2976 58 135 4 2977 147 610 4 2978 118 461 4 2979 154 1048 4 2980 843 1347 4 2981 54 302 4 2982 167 1128 4 2983 96 361 4 2984 90 304 4 2985 52 200 4 2986 88 465 4 2987 138 972 4 2988 54 222 4 2989 59 143 4 2990 520 4138 4 2991 57 350 4 2992 78 233 4 2993 314 1285 4 2994 150 1149 4 2995 78 198 4 2996 60 16285 4 2997 104 180 4 2998 66 123 4 2999 743 5565 4 3000 235 1512 4 3001 144 1842 4 3002 607 30887 4 3003 1354 4011 4 3004 204 1584 4 3005 2397 6213 4 3006 885 1278 4 3007 115 1996 4 3008 228 1121 4 3009 69 193 4 3010 111 1532 4 3011 189 531 4 3012 230 1187 4 3013 58 231 4 3014 97 383 4 3015 1461 20193 4 3016 142 470 4 3017 61 143 4 3018 600 2087 4 3019 512 3268 4 3020 164 948 4 3021 2937 4724 4 3022 83 339 4 3023 347 1742 4 3024 562 9161 4 3025 122 470 4 3026 62 652 4 3027 101 664 4 3028 380 1539 4 3029 156 608 4 3030 2350 6741 4 3031 62 382 4 3032 198 1391 4 3033 134 1499 4 3034 129 1329 4 3035 217 1985 4 3036 147 521 4 3037 130 309 4 3038 283 1142 4 3039 141 924 4 3040 956 2965 4 3041 6360 28885 4 3042 558 1664 4 3043 280 3259 4 3044 65 166 4 3045 227 2534 4 3046 83 220 4 3047 158 1224 4 3048 365 2535 4 3049 561 2434 4 3050 58 190 4 3051 51 143 4 3052 181 715 4 3053 235 969 4 3054 348 6304 4 3055 117 763 4 3056 897 4975 4 3057 52 384 4 3058 568 3723 4 3059 373 3369 4 3060 125 1210 4 3061 163 1106 4 3062 75 550 4 3063 340 1650 4 3064 584 3846 4 3065 542 3666 4 3066 1298 9837 4 3067 127 262 4 3068 163 313 4 3069 70 157 4 3070 43 175 4 3071 2119 36939 4 3072 129 548 4 3073 285 1896 4 3074 56 371 4 3075 75 225 4 3076 202 2559 4 3077 61 174 4 3078 95 896 4 3079 123 694 4 3080 817 3494 4 3081 227 5118 4 3082 412 56445 4 3083 236 1390 4 3084 132 590 4 3085 65 157 4 3086 227 1776 4 3087 88 166 4 3088 286 903 4 3089 365 1746 4 3090 52 208 4 3091 190 2550 4 3092 280 1595 4 3093 82 429 4 3094 101 150 4 3095 106 596 4 3096 57 104 4 3097 546 983 4 3098 70 297 4 3099 527 4711 4 3100 434 5336 4 3101 3649 11070 4 3102 93 403 4 3103 5564 10887 4 3104 104 650 4 3105 807 2277 4 3106 59 165 4 3107 383 1357 4 3108 1224 8885 4 3109 538 4783 4 3110 50 166 4 3111 85 225 4 3112 160 1993 4 3113 132 727 4 3114 203 2226 4 3115 105 304 4 3116 530 2290 4 3117 71 492 4 3118 272 987 4 3119 2634 24900 4 3120 59 195 4 3121 65 8556 4 3122 217 1668 4 3123 169 728 4 3124 393 4789 4 3125 134 677 4 3126 106 1084 4 3127 8943 65535 4 3128 123 297 4 3129 96 370 4 3130 60 146 4 3131 156 638 4 3132 410 2910 4 3133 98 333 4 3134 402 3778 4 3135 165 1634 4 3136 430 3428 4 3137 496 1742 4 3138 60 165 4 3139 432 2221 4 3140 71 399 4 3141 60 172 4 3142 108 385 4 3143 224 1656 4 3144 378 476 4 3145 98 1228 4 3146 733 17832 4 3147 178 3559 4 3148 74 345 4 3149 1308 7253 4 3150 82 185 4 3151 241 3791 4 3152 389 1455 4 3153 93 374 4 3154 603 5610 4 3155 618 5159 4 3156 646 313 4 3157 115 559 4 3158 159 1059 4 3159 106 626 4 3160 201 4893 4 3161 74 154 4 3162 829 3149 4 3163 504 9969 4 3164 354 3926 4 3165 90 290 4 3166 609 3622 4 3167 68 155 4 3168 425 2751 4 3169 2165 11644 4 3170 548 3534 4 3171 180 2907 4 3172 55 220 4 3173 293 4594 4 3174 109 456 4 3175 50 139 4 3176 403 2279 4 3177 403 2581 4 3178 499 8991 4 3179 233 3600 4 3180 5633 47702 4 3181 112 404 4 3182 77 421 4 3183 101 619 4 3184 78 523 4 3185 92 586 4 3186 190 510 4 3187 952 3369 4 3188 98 383 4 3189 1441 6480 4 3190 120 891 4 3191 55 1081 4 3192 159 1107 4 3193 181 1170 4 3194 75 581 4 3195 72 136 4 3196 1292 6566 4 3197 76 243 4 3198 81 170 4 3199 598 2928 4 3200 470 4113 4 3201 287 2347 4 3202 363 3018 4 3203 84 916 4 3204 69 371 4 3205 482 2518 4 3206 86 514 4 3207 7113 41718 4 3208 53 627 4 3209 255 1288 4 3210 88 734 4 3211 73 927 4 3212 13119 46047 4 3213 30067 65535 4 3214 159 1315 4 3215 92 561 4 3216 147 990 4 3217 259 2183 4 3218 428 1689 4 3219 169 839 4 3220 96 316 4 3221 132 1138 4 3222 209 1023 4 3223 14890 62419 4 3224 723 2080 4 3225 38007 65535 4 3226 269 1563 4 3227 403 2288 4 3228 55 284 4 3229 59 512 4 3230 128 1902 4 3231 70 619 4 3232 898 3822 4 3233 1845 2461 4 3234 1992 21581 4 3235 646 3147 4 3236 122 548 4 3237 76 448 4 3238 119 743 4 3239 1564 3456 4 3240 57 259 4 3241 762 2387 4 3242 4609 22873 4 3243 79 840 4 3244 525 3681 4 3245 75 203 4 3246 160 478 4 3247 95 210 4 3248 66 404 4 3249 71 196 4 3250 3023 32092 4 3251 136 676 4 3252 235 2050 4 3253 102 492 4 3254 83 381 4 3255 232 944 4 3256 115 777 4 3257 422 1080 4 3258 323 1752 4 3259 166 1554 4 3260 107 1040 4 3261 1690 4180 4 3262 1461 5037 4 3263 113 654 4 3264 96 421 4 3265 71 425 4 3266 108 470 4 3267 74 263 4 3268 113 2009 4 3269 61 142 4 3270 161 494 4 3271 112 444 4 3272 126 3145 4 3273 73 335 4 3274 105 682 4 3275 84 872 4 3276 62 774 4 3277 81 787 4 3278 237 1734 4 3279 449 2003 4 3280 1013 4955 4 3281 117 1269 4 3282 60 210 4 3283 289 1160 4 3284 83 392 4 3285 781 12983 4 3286 92 199 4 3287 285 2527 4 3288 452 2367 4 3289 69 334 4 3290 797 3253 4 3291 245 2300 4 3292 85 1117 4 3293 86 639 4 3294 168 1256 4 3295 75 553 4 3296 74 223 4 3297 264 1240 4 3298 542 3136 4 3299 72 372 4 3300 73 196 4 3301 91 6137 4 3302 1809 8456 4 3303 3193 7770 4 3304 238 1655 4 3305 177 1142 4 3306 80 321 4 3307 126 1101 4 3308 1004 7351 4 3309 185 4368 4 3310 61 613 4 3311 176 1239 4 3312 52 289 4 3313 549 2507 4 3314 125 1143 4 3315 207 1139 4 3316 203 402 4 3317 222 1249 4 3318 265 1364 4 3319 79 266 4 3320 157 302 4 3321 253 708 4 3322 236 1213 4 3323 350 1586 4 3324 1167 7225 4 3325 265 2115 4 3326 599 2540 4 3327 284 517 4 3328 336 2171 4 3329 185 889 4 3330 498 1816 4 3331 4245 15294 4 3332 2020 10500 4 3333 552 2121 4 3334 60 108 4 3335 127 3005 4 3336 475 1136 4 3337 2515 28293 4 3338 74 397 4 3339 498 11015 4 3340 165 727 4 3341 65 684 4 3342 713 5253 4 3343 120 1143 4 3344 50 376 4 3345 1131 4272 4 3346 1109 2678 4 3347 282 2949 4 3348 61 219 4 3349 526 2437 4 3350 52 239 4 3351 270 1608 4 3352 89 444 4 3353 92 408 4 3354 91 676 4 3355 72 926 4 3356 70 233 4 3357 87 925 4 3358 100 264 4 3359 73 719 4 3360 817 2817 4 3361 136 759 4 3362 1631 11692 4 3363 227 1059 4 3364 685 1776 4 3365 104 601 4 3366 196 1404 4 3367 19428 62035 4 3368 237 1633 4 3369 13237 21468 4 3370 57 431 4 3371 134 1049 4 3372 99 520 4 3373 64 153 4 3374 129 807 4 3375 163 4039 4 3376 55 646 4 3377 3397 20179 4 3378 125 852 4 3379 402 2312 4 3380 79 912 4 3381 8644 26422 4 3382 597 4508 4 3383 401 2472 4 3384 232 907 4 3385 53 341 4 3386 282 2021 4 3387 63 151 4 3388 253 791 4 3389 140 827 4 3390 518 1848 4 3391 180 1455 4 3392 462 2814 4 3393 440 693 4 3394 1265 3520 4 3395 135 906 4 3396 1264 6654 4 3397 781 3284 4 3398 764 3784 4 3399 764 743 4 3400 2487 15166 4 3401 253 877 4 3402 135 508 4 3403 215 863 4 3404 127 2190 4 3405 48 320 4 3406 747 6517 4 3407 84 289 4 3408 468 2276 4 3409 91 346 4 3410 172 672 4 3411 54 536 4 3412 283 2129 4 3413 434 8097 4 3414 1344 8614 4 3415 381 568 4 3416 154 322 4 3417 189 950 4 3418 295 1247 4 3419 569 2838 4 3420 1642 7309 4 3421 266 564 4 3422 926 7219 4 3423 413 13440 4 3424 154 1363 4 3425 62 255 4 3426 320 2250 4 3427 128 2272 4 3428 784 5889 4 3429 119 2131 4 3430 319 3602 4 3431 181 1073 4 3432 95 362 4 3433 134 688 4 3434 577 2780 4 3435 238 2660 4 3436 736 2583 4 3437 373 2230 4 3438 77 401 4 3439 298 3054 4 3440 639 949 4 3441 54 168 4 3442 441 2982 4 3443 190 1141 4 3444 334 4519 4 3445 116 990 4 3446 130 2015 4 3447 92 1182 4 3448 77 688 4 3449 220 940 4 3450 74 201 4 3451 603 5766 4 3452 121 392 4 3453 627 5716 4 3454 61 180 4 3455 1867 16758 4 3456 87 139 4 3457 964 6259 4 3458 63 241 4 3459 174 1230 4 3460 96 6443 4 3461 570 23032 4 3462 75 1433 4 3463 543 3376 4 3464 52 321 4 3465 199 563 4 3466 118 2008 4 3467 257 1007 4 3468 238 609 4 3469 4565 48862 4 3470 3893 21130 4 3471 61 130 4 3472 73 451 4 3473 54 350 4 3474 76 459 4 3475 117 325 4 3476 72 251 4 3477 113 735 4 3478 88 215 4 3479 51 202 4 3480 76 733 4 3481 54 147 4 3482 77 426 4 3483 1019 10170 4 3484 222 1660 4 3485 504 2098 4 3486 6725 29516 4 3487 144 486 4 3488 43 224 4 3489 52 156 4 3490 51 258 4 3491 1216 4856 4 3492 1670 3067 4 3493 241 2223 4 3494 2631 18466 4 3495 130 693 4 3496 682 2984 4 3497 147 543 4 3498 294 5230 4 3499 65 179 4 3500 160 918 4 3501 186 1157 4 3502 194 1152 4 3503 338 2390 4 3504 73 201 4 3505 181 473 4 3506 48 1206 4 3507 56 145 4 3508 208 1763 4 3509 85 344 4 3510 3394 46769 4 3511 120 910 4 3512 308 1669 4 3513 71 889 4 3514 62 365 4 3515 46 287 4 3516 150 1241 4 3517 278 2067 4 3518 157 838 4 3519 108 1928 4 3520 57 126 4 3521 341 1808 4 3522 87 496 4 3523 71 145 4 3524 39 127 4 3525 71 441 4 3526 47 528 4 3527 330 2568 4 3528 39 122 4 3529 448 1507 4 3530 228 2123 4 3531 139 879 4 3532 53 370 4 3533 206 835 4 3534 197 1309 4 3535 99 266 4 3536 65 82 4 3537 105 650 4 3538 120 593 4 3539 169 797 4 3540 75 241 4 3541 78 396 4 3542 61 298 4 3543 79 451 4 3544 568 918 4 3545 416 2195 4 3546 62 148 4 3547 92 1187 4 3548 350 1133 4 3549 129 504 4 3550 59 536 4 3551 62 194 4 3552 308 2551 4 3553 66 306 4 3554 72 727 4 3555 117 676 4 3556 108 1466 4 3557 44 242 4 3558 66 376 4 3559 44 150 4 3560 2638 8050 4 3561 56 163 4 3562 533 2580 4 3563 83 431 4 3564 71 575 4 3565 117 553 4 3566 220 1250 4 3567 65 627 4 3568 159 2987 4 3569 70 862 4 3570 472 3233 4 3571 1404 5719 4 3572 61 127 4 3573 305 2057 4 3574 167 525 4 3575 45 103 4 3576 50 217 4 3577 438 6063 4 3578 94 1117 4 3579 6067 15389 4 3580 49 177 4 3581 59 289 4 3582 58 564 4 3583 51 255 4 3584 65 229 4 3585 57 475 4 3586 136 936 4 3587 94 474 4 3588 63 293 4 3589 41 188 4 3590 71 275 4 3591 69 314 4 3592 118 1144 4 3593 69 193 4 3594 450 4034 4 3595 64 145 4 3596 58 392 4 3597 74 344 4 3598 128 541 4 3599 109 1286 4 3600 233 1037 4 3601 82 488 4 3602 88 451 4 3603 85 140 4 3604 81 657 4 3605 91 468 4 3606 255 1228 4 3607 62 382 4 3608 60 118 4 3609 930 6479 4 3610 56 285 4 3611 86 534 4 3612 108 459 4 3613 81 357 4 3614 62 191 4 3615 56 284 4 3616 420 2425 4 3617 59 593 4 3618 116 847 4 3619 92 393 4 3620 155 1866 4 3621 56 545 4 3622 94 929 4 3623 80 388 4 3624 48 180 4 3625 333 2505 4 3626 161 626 4 3627 470 3890 4 3628 334 1269 4 3629 112 1061 4 3630 126 683 4 3631 118 692 4 3632 117 541 4 3633 530 3406 4 3634 60 213 4 3635 1441 3239 4 3636 104 599 4 3637 2108 12242 4 3638 81 596 4 3639 91 552 4 3640 99 571 4 3641 52 173 4 3642 651 3288 4 3643 56 1169 4 3644 421 2371 4 3645 820 3352 4 3646 175 1850 4 3647 130 602 4 3648 630 2491 4 3649 118 1011 4 3650 345 2451 4 3651 710 7741 4 3652 48 186 4 3653 69 300 4 3654 180 3773 4 3655 3088 27086 4 3656 47 135 4 3657 22567 49361 4 3658 296 638 4 3659 53 165 4 3660 843 7745 4 3661 62 336 4 3662 61 235 4 3663 110 294 4 3664 290 1573 4 3665 76 397 4 3666 62 189 4 3667 62 194 4 3668 2175 7674 4 3669 64 229 4 3670 257 2213 4 3671 47 107 4 3672 276 1653 4 3673 60 483 4 3674 90 615 4 3675 57 292 4 3676 75 555 4 3677 325 1117 4 3678 71 193 4 3679 1017 8363 4 3680 72 589 4 3681 485 2605 4 3682 96 1919 4 3683 622 1149 4 3684 3819 36810 4 3685 111 700 4 3686 92 634 4 3687 116 331 4 3688 63 266 4 3689 174 1935 4 3690 130 716 4 3691 58 84 4 3692 49 663 4 3693 580 2897 4 3694 41 196 4 3695 44 160 4 3696 69 764 4 3697 87 364 4 3698 76 320 4 3699 4560 7362 4 3700 57 277 4 3701 91 140 4 3702 556 1513 4 3703 50 165 4 3704 205 3177 4 3705 230 717 4 3706 267 1393 4 3707 45 248 4 3708 35 106 4 3709 211 414 4 3710 55 175 4 3711 74 436 4 3712 247 124 4 3713 93 225 4 3714 61 166 4 3715 77 1162 4 3716 62 128 4 3717 110 550 4 3718 113 1505 4 3719 120 762 4 3720 398 1263 4 3721 145 316 4 3722 77 185 4 3723 144 745 4 3724 92 478 4 3725 162 3321 4 3726 61 662 4 3727 293 2205 4 3728 141 491 4 3729 205 2280 4 3730 89 223 4 3731 165 919 4 3732 232 2901 4 3733 80 445 4 3734 134 1132 4 3735 140 2505 4 3736 556 4226 4 3737 198 241 4 3738 105 660 4 3739 268 1969 4 3740 44 527 4 3741 54 104 4 3742 206 867 4 3743 52 101 4 3744 65 1667 4 3745 60 243 4 3746 171 4870 4 3747 53 220 4 3748 2366 21923 4 3749 105 863 4 3750 151 710 4 3751 119 875 4 3752 872 13039 4 3753 57 96 4 3754 108 587 4 3755 47 128 4 3756 186 1289 4 3757 431 1277 4 3758 3461 35612 4 3759 9532 57373 4 3760 134 589 4 3761 182 1486 4 3762 81 397 4 3763 10252 34771 4 3764 59 125 4 3765 99 419 4 3766 109 445 4 3767 166 1304 4 3768 69 379 4 3769 54 303 4 3770 94 930 4 3771 354 1681 4 3772 67 883 4 3773 61 95 4 3774 21373 65535 4 3775 5869 42965 4 3776 76 247 4 3777 535 1460 4 3778 2516 30601 4 3779 90 382 4 3780 75 858 4 3781 143 1081 4 3782 329 1955 4 3783 298 994 4 3784 88 618 4 3785 54 161 4 3786 70 312 4 3787 61 240 4 3788 82 269 4 3789 76 520 4 3790 313 2263 4 3791 103 567 4 3792 124 1393 4 3793 92 116 4 3794 194 1434 4 3795 95 348 4 3796 111 545 4 3797 106 572 4 3798 76 496 4 3799 3934 18357 4 3800 66 270 4 3801 819 5235 4 3802 381 1759 4 3803 3340 10292 4 3804 356 2314 4 3805 79 358 4 3806 91 446 4 3807 72 316 4 3808 48 211 4 3809 77 166 4 3810 299 4672 4 3811 82 320 4 3812 334 1009 4 3813 178 482 4 3814 80 411 4 3815 75 613 4 3816 365 2673 4 3817 123 356 4 3818 52 8751 4 3819 228 925 4 3820 19897 65535 4 3821 62 122 4 3822 23021 65535 4 3823 66 77 4 3824 265 1704 4 3825 63 110 4 3826 153 508 4 3827 63 369 4 3828 111 461 4 3829 236 1216 4 3830 1896 8993 4 3831 97 1159 4 3832 268 1022 4 3833 370 5764 4 3834 283 1192 4 3835 237 1305 4 3836 726 1850 4 3837 458 3531 4 3838 279 2372 4 3839 374 2468 4 3840 249 1087 4 3841 164 1191 4 3842 863 4295 4 3843 124 972 4 3844 94 288 4 3845 81 461 4 3846 93 754 4 3847 169 2079 4 3848 66 264 4 3849 106 827 4 3850 698 2525 4 3851 172 1913 4 3852 290 1508 4 3853 56 125 4 3854 133 1080 4 3855 665 2109 4 3856 87 651 4 3857 118 664 4 3858 66 188 4 3859 209 776 4 3860 85 425 4 3861 73 140 4 3862 217 4673 4 3863 138 475 4 3864 2718 2539 4 3865 64 93 4 3866 219 832 4 3867 107 505 4 3868 974 4737 4 3869 104 1647 4 3870 173 1063 4 3871 509 6951 4 3872 143 516 4 3873 408 2262 4 3874 223 1452 4 3875 55 324 4 3876 157 1039 4 3877 120 433 4 3878 364 1215 4 3879 220 2162 4 3880 72 396 4 3881 183 1046 4 3882 60 139 4 3883 153 728 4 3884 66 242 4 3885 126 891 4 3886 1145 6584 4 3887 226 2378 4 3888 232 2314 4 3889 2407 7029 4 3890 48 128 4 3891 257 1580 4 3892 93 426 4 3893 100 212 4 3894 193 1184 4 3895 288 426 4 3896 120 385 4 3897 60 579 4 3898 68 223 4 3899 69 309 4 3900 74 462 4 3901 102 262 4 3902 59 261 4 3903 169 689 4 3904 92 375 4 3905 123 914 4 3906 61 245 4 3907 116 544 4 3908 572 4676 4 3909 1332 3880 4 3910 143 687 4 3911 62 655 4 3912 1401 14519 4 3913 412 1479 4 3914 132 218 4 3915 91 1063 4 3916 142 1620 4 3917 768 7736 4 3918 50 190 4 3919 88 1006 4 3920 69 822 4 3921 367 2364 4 3922 78 141 4 3923 169 1240 4 3924 96 557 4 3925 78 476 4 3926 114 363 4 3927 1925 8578 4 3928 341 2928 4 3929 37 119 4 3930 60 136 4 3931 95 210 4 3932 228 2374 4 3933 113 2127 4 3934 383 1464 4 3935 445 3074 4 3936 138 1453 4 3937 59 367 4 3938 236 1160 4 3939 1180 4356 4 3940 85 647 4 3941 1238 4044 4 3942 95 543 4 3943 1487 8712 4 3944 101 590 4 3945 383 1377 4 3946 74 609 4 3947 157 886 4 3948 58 187 4 3949 135 2280 4 3950 175 1351 4 3951 59 235 4 3952 64 371 4 3953 98 454 4 3954 179 1993 4 3955 266 3621 4 3956 91 428 4 3957 90 470 4 3958 62 288 4 3959 159 1218 4 3960 439 2544 4 3961 61 287 4 3962 180 766 4 3963 136 657 4 3964 73 229 4 3965 73 408 4 3966 1330 3983 4 3967 62 260 4 3968 269 1690 4 3969 75 218 4 3970 388 322 4 3971 298 367 4 3972 138 1476 4 3973 138 755 4 3974 304 4557 4 3975 102 575 4 3976 51 214 4 3977 152 1428 4 3978 113 952 4 3979 115 1105 4 3980 270 1820 4 3981 69 338 4 3982 275 1877 4 3983 56 232 4 3984 518 2294 4 3985 113 328 4 3986 1640 1636 4 3987 68 242 4 3988 1402 6326 4 3989 355 2950 4 3990 868 7791 4 3991 102 238 4 3992 775 2651 4 3993 59 327 4 3994 270 2935 4 3995 78 402 4 3996 47 168 4 3997 525 6739 4 3998 215 858 4 3999 148 1850 4 4000 110 1672 4 4001 221 2034 4 4002 70 347 4 4003 156 1056 4 4004 121 770 4 4005 191 1088 4 4006 216 736 4 4007 68 210 4 4008 85 872 4 4009 56 128 4 4010 425 2067 4 4011 219 710 4 4012 145 2179 4 4013 2005 10053 4 4014 92 617 4 4015 180 647 4 4016 191 464 4 4017 128 999 4 4018 157 2141 4 4019 50 715 4 4020 73 404 4 4021 49 1135 4 4022 388 972 4 4023 447 5599 4 4024 74 119 4 4025 88 243 4 4026 152 1615 4 4027 75 506 4 4028 273 5998 4 4029 140 1287 4 4030 454 3819 4 4031 240 2707 4 4032 128 748 4 4033 160 1910 4 4034 46 93 4 4035 145 1943 4 4036 20685 65535 4 4037 113 375 4 4038 58 219 4 4039 147 673 4 4040 171 1938 4 4041 169 1526 4 4042 44 284 4 4043 75 918 4 4044 58 117 4 4045 258 2271 4 4046 65 412 4 4047 4186 40111 4 4048 112 363 4 4049 63 383 4 4050 54 211 4 4051 106 756 4 4052 62 364 4 4053 72 394 4 4054 58 198 4 4055 4791 31159 4 4056 444 19737 4 4057 73 482 4 4058 73 225 4 4059 94 402 4 4060 59 714 4 4061 67 500 4 4062 319 2070 4 4063 77 362 4 4064 147 623 4 4065 418 1128 4 4066 86 340 4 4067 2513 19768 4 4068 148 1023 4 4069 617 5766 4 4070 143 1479 4 4071 339 1492 4 4072 75 1028 4 4073 78 367 4 4074 2426 23372 4 4075 2398 10330 4 4076 704 12677 4 4077 84 449 4 4078 221 1324 4 4079 134 585 4 4080 2958 30931 4 4081 88 354 4 4082 80 260 4 4083 168 779 4 4084 93 967 4 4085 45 305 4 4086 139 754 4 4087 58 144 4 4088 75 9447 4 4089 224 1103 4 4090 127 778 4 4091 122 693 4 4092 86 643 4 4093 145 768 4 4094 67 588 4 4095 69 74 4 4096 121 700 4 4097 56 255 4 4098 93 666 4 4099 197 2266 4 4100 74 301 4 4101 43 227 4 4102 101 338 4 4103 200 1080 4 4104 115 595 4 4105 72 709 4 4106 48 142 4 4107 843 3939 4 4108 218 2891 4 4109 99 677 4 4110 262 1499 4 4111 89 637 4 4112 249 6610 4 4113 49 694 4 4114 67 94 4 4115 480 2386 4 4116 319 1772 4 4117 284 776 4 4118 115 660 4 4119 52 185 4 4120 111 1496 4 4121 53 89 4 4122 317 2581 4 4123 1317 8527 4 4124 141 870 4 4125 143 446 4 4126 73 259 4 4127 358 1001 4 4128 1615 6446 4 4129 76 377 4 4130 48 250 4 4131 307 825 4 4132 93 311 4 4133 77 309 4 4134 130 688 4 4135 222 2143 4 4136 94 895 4 4137 44 125 4 4138 303 3188 4 4139 49 167 4 4140 444 3555 4 4141 162 382 4 4142 365 989 4 4143 52 194 4 4144 69 224 4 4145 72 141 4 4146 135 474 4 4147 90 422 4 4148 162 1618 4 4149 531 5361 4 4150 177 1856 4 4151 63 272 4 4152 102 275 4 4153 85 7750 4 4154 51 223 4 4155 54 134 4 4156 55 188 4 4157 66 124 4 4158 85 730 4 4159 74 329 4 4160 81 234 4 4161 1419 21410 4 4162 356 1186 4 4163 46 177 4 4164 54 269 4 4165 38 181 4 4166 123 1164 4 4167 108 199 4 4168 70 300 4 4169 138 2495 4 4170 102 633 4 4171 458 2169 4 4172 815 3973 4 4173 43 215 4 4174 87 788 4 4175 210 2883 4 4176 141 749 4 4177 298 2889 4 4178 1096 1903 4 4179 2952 10147 4 4180 81 195 4 4181 357 424 4 4182 134 995 4 4183 71 418 4 4184 102 430 4 4185 133 837 4 4186 1529 11868 4 4187 92 748 4 4188 57 361 4 4189 79 410 4 4190 930 3162 4 4191 77 185 4 4192 251 212 4 4193 198 1415 4 4194 64 253 4 4195 368 4031 4 4196 207 1457 4 4197 59 297 4 4198 219 2322 4 4199 637 4324 4 4200 573 1328 4 4201 63 155 4 4202 67 345 4 4203 585 5261 4 4204 611 7133 4 4205 61 328 4 4206 60 151 4 4207 647 2270 4 4208 847 1336 4 4209 177 3443 4 4210 457 3781 4 4211 337 1677 4 4212 99 730 4 4213 138 634 4 4214 271 1629 4 4215 99 325 4 4216 133 872 4 4217 1397 14498 4 4218 198 1126 4 4219 144 1062 4 4220 54 308 4 4221 99 935 4 4222 80 736 4 4223 1043 6264 4 4224 389 6327 4 4225 566 2488 4 4226 212 1329 4 4227 4050 9219 4 4228 511 1289 4 4229 304 3688 4 4230 87 314 4 4231 51 149 4 4232 763 7273 4 4233 489 6705 4 4234 157 833 4 4235 77 587 4 4236 453 13494 4 4237 144 969 4 4238 1081 7757 4 4239 227 10531 4 4240 1523 9523 4 4241 379 1217 4 4242 1414 8264 4 4243 46 180 4 4244 127 345 4 4245 62 179 4 4246 64 329 4 4247 74 194 4 4248 127 936 4 4249 84 171 4 4250 162 1592 4 4251 140 714 4 4252 89 246 4 4253 180 819 4 4254 55 222 4 4255 246 2379 4 4256 57 577 4 4257 108 2371 4 4258 169 1935 4 4259 146 2784 4 4260 94 262 4 4261 312 1961 4 4262 247 875 4 4263 47 218 4 4264 60 154 4 4265 194 1704 4 4266 124 3211 4 4267 1837 14400 4 4268 134 706 4 4269 505 6202 4 4270 321 3231 4 4271 107 229 4 4272 63 218 4 4273 55 284 4 4274 90 731 4 4275 1880 16826 4 4276 668 3625 4 4277 59 7366 4 4278 90 793 4 4279 105 2375 4 4280 147 1138 4 4281 88 263 4 4282 402 3822 4 4283 8219 65535 4 4284 157 345 4 4285 77 751 4 4286 44 128 4 4287 238 878 4 4288 162 710 4 4289 58 261 4 4290 51 453 4 4291 141 2044 4 4292 40 285 4 4293 421 260 4 4294 64 152 4 4295 310 2722 4 4296 113 445 4 4297 166 1378 4 4298 64 205 4 4299 221 2202 4 4300 67 157 4 4301 1036 5200 4 4302 51 127 4 4303 153 2322 4 4304 258 2750 4 4305 231 2972 4 4306 113 486 4 4307 90 401 4 4308 485 2201 4 4309 463 7786 4 4310 191 2643 4 4311 166 1605 4 4312 71 577 4 4313 1971 6855 4 4314 97 866 4 4315 62 143 4 4316 64 1908 4 4317 86 3178 4 4318 70 151 4 4319 61 93 4 4320 402 1501 4 4321 207 907 4 4322 302 3796 4 4323 710 1980 4 4324 383 1215 4 4325 159 994 4 4326 136 5528 4 4327 98 554 4 4328 281 1042 4 4329 101 172 4 4330 878 6651 4 4331 85 832 4 4332 602 13190 4 4333 87 141 4 4334 286 2080 4 4335 196 1254 4 4336 2677 26839 4 4337 59 229 4 4338 104 592 4 4339 66 299 4 4340 61 253 4 4341 2473 6427 4 4342 87 774 4 4343 68 619 4 4344 68 688 4 4345 52 472 4 4346 112 779 4 4347 87 714 4 4348 251 1454 4 4349 140 1057 4 4350 67 273 4 4351 69 136 4 4352 1952 6505 4 4353 57 166 4 4354 51 134 4 4355 78 3298 4 4356 110 1062 4 4357 83 348 4 4358 1500 7580 4 4359 896 3692 4 4360 103 484 4 4361 56 822 4 4362 64 698 4 4363 91 713 4 4364 641 4405 4 4365 61 240 4 4366 3606 20607 4 4367 70 410 4 4368 141 509 4 4369 84 472 4 4370 372 3811 4 4371 147 646 4 4372 69 199 4 4373 57 227 4 4374 82 376 4 4375 201 832 4 4376 142 676 4 4377 61 506 4 4378 69 917 4 4379 105 663 4 4380 54 363 4 4381 95 1271 4 4382 596 3354 4 4383 1549 16194 4 4384 81 281 4 4385 49 422 4 4386 316 1627 4 4387 101 593 4 4388 121 277 4 4389 41 175 4 4390 85 249 4 4391 204 1842 4 4392 692 2805 4 4393 284 1355 4 4394 63 337 4 4395 168 1488 4 4396 56 610 4 4397 175 1438 4 4398 2888 18474 4 4399 45 273 4 4400 97 490 4 4401 50 135 4 4402 2212 18471 4 4403 80 128 4 4404 74 453 4 4405 464 6047 4 4406 279 1241 4 4407 55 312 4 4408 113 483 4 4409 274 3396 4 4410 210 529 4 4411 597 3417 4 4412 721 5243 4 4413 1624 13274 4 4414 980 3235 4 4415 102 729 4 4416 85 668 4 4417 455 8358 4 4418 300 3851 4 4419 158 719 4 4420 161 573 4 4421 50 165 4 4422 630 3255 4 4423 93 340 4 4424 83 584 4 4425 1715 14325 4 4426 353 991 4 4427 76 560 4 4428 51 432 4 4429 2662 8786 4 4430 7051 65535 4 4431 150 1447 4 4432 48 339 4 4433 61 456 4 4434 73 546 4 4435 64 732 4 4436 177 933 4 4437 170 1200 4 4438 315 1833 4 4439 69 156 4 4440 153 532 4 4441 67 100 4 4442 87 179 4 4443 76 184 4 4444 1736 21584 4 4445 121 687 4 4446 213 697 4 4447 493 5412 4 4448 103 655 4 4449 116 797 4 4450 66 464 4 4451 65 286 4 4452 232 3098 4 4453 65 104 4 4454 75 301 4 4455 99 724 4 4456 618 2119 4 4457 75 1301 4 4458 362 6869 4 4459 312 2167 4 4460 75 305 4 4461 139 657 4 4462 63 330 4 4463 1092 5110 4 4464 88 812 4 4465 226 2301 4 4466 125 630 4 4467 69 375 4 4468 60 236 4 4469 662 2367 4 4470 69 259 4 4471 489 3545 4 4472 71 465 4 4473 76 274 4 4474 45 163 4 4475 130 627 4 4476 67 254 4 4477 982 3313 4 4478 81 307 4 4479 83 1713 4 4480 92 484 4 4481 334 1557 4 4482 2137 9116 4 4483 159 1078 4 4484 151 656 4 4485 159 41963 4 4486 166 2463 4 4487 132 956 4 4488 44 188 4 4489 92 568 4 4490 131 283 4 4491 65 179 4 4492 46 167 4 4493 320 2125 4 4494 388 3415 4 4495 73 182 4 4496 96 786 4 4497 223 1637 4 4498 77 937 4 4499 815 5091 4 4500 127 553 4 4501 291 2993 4 4502 91 368 4 4503 525 7279 4 4504 321 1338 4 4505 148 2248 4 4506 46 274 4 4507 81 492 4 4508 83 214 4 4509 252 1391 4 4510 312 1430 4 4511 221 2125 4 4512 61 256 4 4513 58 260 4 4514 98 719 4 4515 94 982 4 4516 89 1973 4 4517 1185 7832 4 4518 70 587 4 4519 742 3912 4 4520 57 589 4 4521 338 1773 4 4522 351 2337 4 4523 57 511 4 4524 131 492 4 4525 105 812 4 4526 100 304 4 4527 201 404 4 4528 88 531 4 4529 122 518 4 4530 98 453 4 4531 108 1142 4 4532 66 614 4 4533 1134 10468 4 4534 200 1488 4 4535 379 4259 4 4536 189 1230 4 4537 80 225 4 4538 51 186 4 4539 90 487 4 4540 2140 29090 4 4541 173 1594 4 4542 466 2583 4 4543 62 173 4 4544 798 4569 4 4545 87 253 4 4546 438 6987 4 4547 81 581 4 4548 56 594 4 4549 73 364 4 4550 200 1818 4 4551 200 1134 4 4552 299 2419 4 4553 145 579 4 4554 248 690 4 4555 176 594 4 4556 1225 10319 4 4557 97 371 4 4558 84 691 4 4559 170 1360 4 4560 984 3870 4 4561 355 3432 4 4562 2463 8453 4 4563 202 1797 4 4564 513 5362 4 4565 130 796 4 4566 62 595 4 4567 185 1416 4 4568 88 750 4 4569 1609 11742 4 4570 149 535 4 4571 69 458 4 4572 546 2891 4 4573 108 548 4 4574 74 984 4 4575 113 424 4 4576 156 3320 4 4577 174 838 4 4578 396 3438 4 4579 94 329 4 4580 152 861 4 4581 102 609 4 4582 154 911 4 4583 60 414 4 4584 118 1221 4 4585 76 384 4 4586 140 559 4 4587 98 847 4 4588 66 327 4 4589 348 411 4 4590 104 1091 4 4591 144 3480 4 4592 297 5076 4 4593 136 759 4 4594 260 2271 4 4595 359 5171 4 4596 98 1054 4 4597 63 378 4 4598 223 1003 4 4599 159 1280 4 4600 128 873 4 4601 142 2255 4 4602 72 228 4 4603 85 332 4 4604 119 432 4 4605 246 2077 4 4606 72 211 4 4607 65 185 4 4608 57 172 4 4609 64 456 4 4610 226 1160 4 4611 109 338 4 4612 54 120 4 4613 65 441 4 4614 1390 8893 4 4615 74 834 4 4616 62 225 4 4617 510 4939 4 4618 51 237 4 4619 63 684 4 4620 296 2052 4 4621 237 1913 4 4622 51 232 4 4623 55 271 4 4624 70 126 aroma.light/inst/data-ex/TumorBoost,fracB,exampleData.Rbin0000644000175000017500000017557714136047216023330 0ustar nileshnilesh $[w\goEV)JQFJRF(B4I{eVB &-q\}뾞:zcQqd@h@Ewٸnyn^<.q1'S yjA Z;d!ǐ9gʅ8j`i_=_1E~)PLTZ}3t`_vQM[} ԫ!<Rk+]uS,>O }?H Y勠Ԩ0AP6s|c\VO]P@.ۿ.A]$= k˔0gK3Acg<&YPͼKCM9 J:吁͛M9$pϤ Ξ]y,M*! ay[9i@[AK}WN"/bMHnbzQ4=3ns#4d`u/H@0fH ޽=_>=1[>S>ڌ 6ܡTJk_`N T7_4”naӘs."jLcd#Rw}nX-ӏЦ?h{tƈ!RPLhf?Qms;Akl$Jq~(zɋ ¶2RD`wnZF`n){װz"KG*; م sާA*2bml,_Px{HdbzSq@ZBKMeNl~3lq98˸B :WyԷUM@V@hœt mY\vC `)in|JubvܚU/pvЏ*ZJ/3,SGw*p;O!ظ_lwAo6\TF1/Bwlxh澌7r7w_XLf\ $/XI% `=lpٕs`Ͷv2%Qi#0ί4LnG܁ d!-`$E"Wl*j0 蠆O2ͭHLCK@ O0+]RϬ[ƈk\%TTMY뫗;v}XUX_qS ȟ%֖ۧ)A/jǒ1y/^E],CUTRL^k݁/:ŔNv,ɭ9hmifȤ|l`;k,biabԉqpy)#iLX! _hv8(<,$6 lm1q BKbQr*.V<NF%;|I;sI !6'([ ෾x]ݗ):<,. ?˃'˥- S}漢9GH7N4o&'QiPzt1V"ߤ]rqb 0u.r}; k9Ṃ | CԪ}ȉ}bdsf+HN Vi@#;!<2D3ڢ_MI~_ɽEDmؐ/Z4: Jė,%b6ͬW[ZM` abRS)`3`Evrtt| ={9@doY4SaτAI}{5d$>i)ӄf 8x[g+8"t]M/#e]8?4()f7Ǯf֟c=lRW)9xRB|JrOR['*&K=m᜻0"Q)a>_Ng#m)K{*6Q>'L! 7GCH"ITDȡYɈ:jK}gͥ,E`K|oEW\n$c ^K^0:z23\G)x W!)ZkJ?WrR>vRZu2\T?툰-?)b4M/8sUlDe'yI#t6=Ӗ<ι01jxet9b^yǣL*4 q#?ys#9psFmp {Z4u=f"jXBkhr#>b,iG.ts 4JpMݩCRQ1z >1F*}gdiYՉ{~:h}F&Zɓk1Lw kJ&sQϖ%W4x|\:-dѾ? >Z k^f"FoVNwBBFCrڍkRjReV&Ի,(v!kC[s٬癆 u^[V|o !< $7!r LyAo@I[p=[JiFC o埌;cxFؗӍ=:Y\T6j[#lɻxNFe3hHhUG E:3C Zئ>!^A\+l`GJ)e2^vTP[ GvW$V?QSD~JΏ,e#(`Go-;_Ƭ5y94v_ QrySA po쳋x-Ճx `SD$װ#-س5R6aDO?߈tmG*"jH->-lmma3!ǬSQdJ7rOgt hn¿O+.=ۘCu'E![@տ6ԣ7B>1 *zhG5[L&( C̙Ӫȶ_:;LQLtopt/mHLGo,QW&k>CkΗMqYrh&,XߊgFiNY[il0C?dG3 3.aVq#8} za_r04q6!@Mh&Rdnf,=vCON[h:|vLY}ų+2}?{Qc`QMn 6>u1xFaQ}|m׸q.s6XޠZ;0(9gvז[?n@ ׍ @Fxѕ<}Ѻ "aҧճ{?w|ƅ'`\"aaVmc2?*/9-4u[3(r5Lw<(_!{ԻKV`Um|S.(u?AC>=Rޗ&T@ ̺Lԛ_YEB&<N.z= fDV;daw6V -۽؎| ^\Zf{_A2 )bv<0i8 +5`M*y]K(n5+ ddy;su9` a'ƒj29iEy[*qƇ CwxcGҙg}77'!z;+7i}%KȼsEfI"\Z W*׾A! /mBMA5Ono Ӻ3ʅ!8F{*=Ő6RT #L2\h5G ae=.p03 "w3XĊ/Uqv-#q0GR9 ԖqLY(ûsޓ0O0Ie-wX1sr~b5!Ku,M- Ę`2%Vl% GfV0I{3S$r9!<2CvNi̕ϜsOHu278yk&a9|&F['TY#֣*na-H=zgِEԉߺ*{m?i^Ivl7GƖN5T?#?2Ph/ׄGl86W-s _/Do3)_vaV >i n'ޭ-->rKJ*H_5;(+2Tնy߁7:ҡ2VwH">c~͡"㡘LDެ|0u_ѧTUh+O"'O6;ctr3}oO\ :/ kW!}GlM_2${_n_卝Dm)W 8 J_jb#7S-6),mˎ{a؇SJ*k#.uhR):шZ<3<b̦?I q4ɻBe ͈j[T!~bqsgYrEXb^_x1WJYZ^铉 y'쐭F}<}q:4 tPz"0yq~р=] ")*Ukqjlv"=yfSWLObwi3p I+@X sEW,=}R77uS`x. 7bFb:+M9YȨ}gӆĶk4}X >@|~=J@Ki$A6]VkFLlGl&7͌2lVݤV2?H ac([3@~ɺҬ+m"[ cOqR#~ ݃o5='*hn?g$>p3|7:E! 'i2.B:{'ygu.` 4I&Tpf);@EjKZ-\A\ ]O3y)jDWF !ͻ1#/J̏JN:xhx8E æcF.nd\;yTq"[ ={̀BQii[{]G& F_[pK3}qB=?#Ӱá[R.ʆܕَ,55NoO3t:c]S'x}`8,BȚ~#  ޽c•Coӆ3)Bzpɢ_1vÙR,b/Հy{\̞t4Qϲs ڋ"R/ڶ-?+}2ir|D]$#'fåضbb$b7X{ŞG9U:Lz"K_T۷}MKˆddg03gR32 ?a]]׳JR({*K^ټ|gְȅ1~7F`6Gt6cm Ğ`4b"ԞAbr1i;=XD|I8lK"ʇǺ_u*s88 <(r\wN{୐IIS9D9a) @a^z~8|o}(]MKcR/G+zn5M꓆sS/Ztj{HUλ.G cU13ngcL'wɄAޜ؝쉬Vz P{$f(kSfo3Hwqp?'*-c[ϲ ^_g] 30+P' 3iv oKU1raě_`g#DrA@Ӭt˕A]jGDswָuw~_Uɶ{I̢ә5~^Gߖ9xC%e3j0ut^ƾcY@V176`c.qQoz,>b)Ǧt@-@N?Y#$ge^WV8= u@'0rW@V_{sOݟJ^EkľEV#? j~L{`{tR^='k3|KQ,a"}/ad~*^fIl@I<ԕ?EOԒ5F)̾#yߺ& rS,j*/~YIG\"\B(Aa3Rp3BLذxERk9H?b=N*hPtJD|c ס},C9 }BB97$!fC5>Rx&[=|WɌX)8@Aro\N9@-@0'bWq]@l2z `ZӅЙ^Nj$ݺWvrn\4y֧#֚2n",e l2ޱR8޽/"͋6¾6CC\Ⴠ_P ~hcXnqɅٚY^o}EH"^i$\#X=W(IJkHs9[:LgP>yr 0ksrͅ1[>g;^Dneu?4xNcq6 WHBtb YºQL\ ;-r1&ʟ4Dc ^r!;sqQ4i& \ LrfbL>[/ގ'^~s}kyY bQu2Pa" BQ|fVt^z!(YQ[(1Tg=$*ô̩L9M!Y7;uTWNާ-ރ[t>?>"Ģ rڝwM3~\n`[P7,B F7xIlHM0g\c{XG zS0Lя_ݣܷHF;0(X/՟G $r>+>*Q7&mjG(V^[@Q䅢vӓv%l')^U 1\dtyTD}v,%nf{HΠCLViv#]V8{' ѡ%@syUh*9ˆKeĴos/LU*40ϰA$V.GLߔPY6`yAIlU4\9A&!9yW8TnNa#χDZm Nkǿt̊jaMH.LX1U+Y@a}7Ɠt5ΚjG A:ZЙZxR&찋'ԌoW˩^LĤ D&;H#7＀z| ]i^lDT?`mClxO_fRrԥ9L%wUHN&lZ٦I%OK?BHw}jp_eSqIqjb'-zLe caqWvjQ[9?$q/#c[(@ULQi'#(A\zE Xrz~ ˺ahp~N2N'ܢtז%H-AMU^Pd_(eemԆ*KI໳Z{eurmj>/ބ# kz2nu5u$^e5[ú=SII7ثz }"&Fϼ ?̫/`=+텅u&Qe&j+y^{3%qiHe1ô>Y$w_k2F9? tlbQV2N&%1%Q(FÂʄ ۧ%IIo(WabǙuu_zM*G-2+͙5b,CNp(][?v5Jk-vs~(2]gOfc_⟕8˿gI !X , 7+ek ͝fpYj9fi8oCm Sln(=Sw;ґ>e~zcEo?]L1{L,rZnT3Ò6w\lY#IJ@ p)D Na>g]]ot[ӀάΦ&[A -)mXdrd#@O^G\, $*SZr!LRH~ [JC"o)C6 bPT>Cߒҭ&X*. `r' 7|l*1<@ĩY 4R"nnjU`ڈ>k1+ǧer5 #X|P#ۖ`v9FEh5 !e_ss:əMFZR|v!TN8.]g,l/fc^IY(4} l'x,u 0zX( TR"@׼$mâ@LOwCTsw S.6v?rQGMPEPym}+} 3TK-dFٱ?vo zez1tnK9h3[϶y[~;7/ .Tlx' Q/i[Ω' *#; ѧ(6-b,lUG- _1G0]flgæx ^[UV!~]sQ~|w/ud\D/'8k}:Uҗ]\L ܹ3)^GsܷJ 8uBIr=^ ]GxFf{*ٚkY@  +zSL'R>4x҄-t`U3&qtZMpb5ogn?DfC}O}c!r2:5߅;=Cx엷^LVs~DWyVJzH=쁺dyr΢,dػ\P)C^PRހ&j3ϮEq[ Lf6ޝCS22d:84 LVeo~8hXO G3$bl-G#3#?PI г)pc8&>$1޸Y hnd>NHh$ * g<%H2ea~soOͨf=vʀ49$UAċ`䋲h?7l fl* x;=O#% V/ gIi7w BQM>Cdfc@z+w}>sv' v^f.Xh26FB ,%N9)f؊Zm/^K8O@"O+BLuGg7L:Jj$ HQ@ux ):Nu`+xvH9LEΩnQs}F~Tӹaz y|TAw|GF.?eÜecL]gE)!*b. .du Z c#G˓@ex5FU_H_ u {X 7WPn/N0#Q}k:S|6*lAԾ11\*jx?l `عjF~z=9UHX 3Zͅ\@1L@)5lKrz8? |ZPNLY-gA}J%t# ?I)chA/}? `o<zPNE_{4!fp&7s+&gFqis j/oi,@:KȞϸ{Q\2(,1BlY0I65kC#N\GܼqXvg|τq{;x5 6CklKϷuw̠O,#r7CZg3n狐U&hL)k2+HF]z1[3p^'` Nkƕ#hl%_d`l[Al/dӼ.eLvR#5$ >9kdž<"zA-q3k:@ ڪB̊YI0u 8cĜ;tE?Is{F@^4_'dZ> \bXU v4W<]TgZҾ  6N3Ge:(w8KoQ B/Z4$-G7ЬI ԁ߹_ۆk}%ֺd *њ`xcB sGȊ0%o2.dOV;z]) ?<`W]O̿L^nr>p,csSOg9#1ToD\ @'ab9h/qy Q]&9]B*7 rLQ/G MCp"6(U:j!A$;XYɺpQ&#ϖs o[n ٙ}~1˭F7\Yk)әWuB}AuVCQ-qhJv^S.7㵹H@8!@ngNƔfЛZzn 8 nA퓤VF- #,HK+6!rC]irJ VF=RvfEq^^R ڶ/0bdw]3ҳl,{}&a!Gbd_?QwwuSQb Z4T@CLG_t'lɪrXPQ:qF"eMJT.'Lv`>]u8ל,lx\E;RM%aIԧ告tnw`4dS2/ѿcCǯy]-o+vhR%h|^@ ˵eE~vrDغPɥ?E,(6HRJ{; ?%jUZf}La취s)'W( ۙlm,*-fyME/sv'2γ91gu)eh>>܌&t]Wpj~y y$\E(cSYM6'TjUCUtW HGN?D'vN.;8HEl )tpi2 =X$)KK8D|Z <  1WL e9A-m-)t |wU"Q ^Q,*@׉Fe>0CiDBY%hѳ^-6'x=(VgJQ+#MgE#c7J"mן?ԃNΠQ,]3}.'ՕS%*7PY;cJ쏹S#SPp4W1 &}v7$dJt\# _-\cx/o_&lhb:ӈ_c{Af'#{!q@n|_ zYvoupZTNVlK_fQn:rO%y2XszAwD EK F AٝUH5/>Gϑl1|5.7{ W'6uWrߚxdcnAbbS)v)Fc|஛ma7.4p}o󌠊έllE3VTM[<{=<gGXlz;Vs61= СrCk+>F6oLK.f{j~(vYt6p7)̪oi]^f5 ?8؋ckiXxZҝ5*ai,WwgV23UGEɝz:G~yHgJƞB{d6dY&=J!m8sQ R#q> ulp(٫sQkiiXV(\نĪfc ɓ4@>-j>*-1Mi+U\YOG 9146H)#W&K]G& o&V޽97H%ԍGn634IqǍ}e&E)YE (ۍ 4-&<*PG1ɼ=Ju\C|apWjD#pmVw X3&0A>ʜǭOcJ7'zHy?EJ%)u vr%n1,{ ~]*O?#/X:tNٖ* KL?p& K_sM"o;e½<4` @Rz59sr3Dl ,U3XxI 2B .C\#6VOܙ~)p8Iܛ7vj#Hs/yK&}j!7? +)asp@Lϴs^%fȬ\=]!_jNOGoh\ׇP-]T0]3oRfZjXjK ѶYx^L ^ ѓB"nD˷n9՜.iFyB-]񟝺.:|Pz$;42\P9N4V&v͆Nj J`}HjpBXdCڈWū[a[$̛ D,9t;ëތ(a褌 2Wu$?|@}k/0,ӥ셻?^ZO蚧WN"&0V>aZDmܱ_S{>IDܷ䄮}Oߜf-3[Ld 9NY >hD8{ Z.WyMW/Kx*wOSrXGg")Κ?SjO̩ϻF;nyv':~T Lp*I5觧m?_9n^ %5|ݝ_5>7,uB16uRT5y74M_„W?/&g7OWn+^k׉hO`jD|ZWqOo]yM9sYJ$Ä _B€ϒ՟%wk uo)>4%}KIzH/\'YKJt { GG B?HyGҞ]6~GJJSR2YSXeVV᧷-^HzԷG ryvɼd>:zR??m݇GƠ+^PZ;I;9VF'̈́5c[7%w{`>qXnw޶cy|w@=EO /BG3RM[]zJ$~s-ӥ^ԗ礽$nkWZƭ;}%閤]:GJyH#Ϭ6 RnK {)rVc]"úutg'w.#uiƷ#{nB?D7(|?s-sk Kyt.٤kۏ^zB+tܐrQRؗL{ߡEM<7aϔB{.NJ(3կPٷ䇬0k;WLvmW-^"s}Y9גRoӄw9"ͳi)ZOݙv$t25Idup CxB?Or87UW\.H 5_ h"~SJ"tbM|WڍuPO]" %t\* }9+?O+@ҭ]ژ㌅N֪nRވ\ZB?jiB?<}wu.W?\FϦYw~Wc[&I+޶o}5}S : \)ݐiRΡ d=DBGN2kFe\A JmN4E$ iW#v ([u(g0x8]m-hءq6_?ƞg7N~${6Bㆳ}%_yJ?6F?s;z\^鬢( OK֨gt.t| Y_]JJ甯^̃2 $]]P:z5z{8ߟ ȟ|SIɘ"ru%=O{SYiR.B㦤_#t͵8_C$3r[SZϓ1sVb.7Z70d\Y]ERuwoq{'< Ru%oXq-+ͬD];bҟJ;q㏰mcuu}x+U]BÚ";̝yZ9P[>nÒVYoΚ@{fIO*T?j)|j=$߶[Po|f RN'1K 5|R_gI~ LΊK]_cW?OJx)+%rƾ|bvg;&*R ^|_v4oGwcA~D|)ꍄ[HwJo+pBWK۠7OG^J'sRi7dQhA3O oX׍5G+?cN Se ~U ;^!~ ajkh<8$w-&tRڿu[Dq+x:}wAo?̩1!S'yši%?q`Mzϕq"BD)0{l>2uȕt=3oo_y[^U엸'q#1yϜuAcF)ۙoH~ѻ_cqIIO׬z se`AH;/n@B7ߊR/>s yE$_k 'Mqw\;IЄޮz2X5xMIlJA߆? JGY/G~vwT>fOzIں熬bLzFfH~N OX;)?];nҤܥ+|?7 `=n wNg}S?v/%+O2KZR.%|ÜPV~%A^J%_6tߤ=N9A?5R);27gᾣwzw93y-wz旟cs/P Q#oy^ @?_1SB;^'ҟY׿cH;1o~76K׭ߓ /9K%c+WS9q/].v&u8}'BGC/{;2n^c= rרҿԥKQXs |['B'hWb ;"|/sz+;)ng^}Q ~F`#ש^BX=FB['1"Mm]7 ^6 M/](\7C%=oDU7ϿyK&.\=hgs~wQrڏyP)U;mhhx3CfHh@-i?gijE)5u-QH3MlGB/y?IW7Kh=|0f'%= w@;I\b~syn:C39_G7E?;o(t.|RʥnF>٥3 _)]ղhDOCL~-,?-IgˏIT_w-BumF,zդ*{eѿ~﹅f3g7CgvR;H&7K+ҮH VKh rQyCr[65Yᓮo-G!_J_%?%Vwz.K9yAϽ8r=ǚR/jZoP=D_C5z{#ah-9f1 K,rhuy_܈2Hc1`y<\@V=)\;TcJ3mMmwpTUqo;qUg_Ms6]`zA';{aCh)whCR~k2Qۢ,=rҜ۬S #{ OK~qs</%;w$k:/dVJzGƿGIw\5 CǩgB ~amhl7y.-"%اթZX5_/]?'!T 7I3c"| [+\K+Q$)?D2Y!cAu{H}d#>6>!0Z=ea?= BaH;k-%=$A6fߑ6U}] 9wSSO9f{fdq_Ru3:uuݼawBw~#-]JX.ZOesW'טXX^F^z7+-ݳ=Ʋ[qBS]]{۬O`_롗Lz}]H(W W 2f/.~MY:6m󵷋 7:Cwr^eB'0.uIw*/tw#H{ve6Jw }kJ<:zBOM+%T/i zsݷ )ܤ&iHҿ*R8z4sYO]&s6gB̜-aqb)'Bgi(Ԕx&R~p6Y*KwQwWF껧~/t}>tuA)+o鏑k| =jϴN37XM>ȭuMi_gja[{lL_uG9_^@3Gp>10M>_@./2 2絈+~_ew>뗽 J ϐw8pG*u.IRouB>yzjO$B'IuɏU\S7rcqE^;E|#3}rT.(bHs{\|\yL"oO6)K~#v‡l$AQ={ߩ/]dz N0UÃ˫w`߰}zW%*Awx1|O4brжGJ? Hϔ xFMp+cB!4|K(쇖bWB'Lhяkm/s9Y.t'l\7^OQ)|ƠWW'?EKPOgWE=nDg^l=Zuv 9SdמϠNH #jp/_gHB.j1ZR[B_% ˳C.sNJB<nʣ~[+5HkqԻ"go5[6WBgiD3n|<\`]7:BW?Nߨ&߹O{oїDo{- qHÝ]R3*~)\/N­'qOdwn򹇹w&䗚)CH<A=dB__>6n_~y>N?|OyKw+v |_7W\zjc_iLi' ~)pKiR\n _\>G9O=H{'{;/}]t7G7 reU|j:z vg6|z4 ^$ {sRʇL-DOȅѻ֟ L#?eWe1Y2[gO;=C;-H`ÅNB).a5Yy/?sp;ǔy)tnqJhio>S$?[)ru{4 U^wia6 T+r5 ܏n*u ޮ+HWd{H2Nm?Mx$L<9%,(߱˵vܫugROLx=rH-pigD6jč๴5a% I{iǐoD9{t7),C>BGzޢrM9Lz"$po#çl;W.RmZ9,5}#]i[%nN_|_jZ $嶾ZLګw{ckbiG'0#\Ò~A¾ڑKՁ{Bk nJ/ [UK?v5UӴp)%IwV}WّQqJۦĜT~='h {9"r1 xSK!fJ<4W½/2oWP؏dE,-c$v:2}3ܛvo,BQY︅V)秘S$}gՌg+rt:tap u$kŝGK8#pg\u0qwu?| /^=Io[!+A߰ ;[R/ ؏iHS_J+z0*c+:9Lt* ۅIF~~z#$?䷽ yuouuA8~WGQWpGk SuLc>-"߽?9 {#`ӄq@.ORIŷR>xn^&t{J=[ # ߾[`ps]52뽏V&],P3~i/ 'cRޭZuysmcekWCp*9\F%}ѧث$#/pv&ҿndcS'Hjfo(wtqz1jKK ^z[ &^ º/3&W,ޣ_݀6GM/WEݏ{ȍJ=|/pql}nz 9f{[6 'Șq}6( ez$)v5:f5 |UY6ߵu% d 591ZNx,'Z7F{u߻ZIgUi_Rd9b[g)|grҋNk;b`wk*}![ƵXꝉ>^z s}ggwrIȻ~.EMc?3 {Hq&ȷvᏑLJpot_~V)j79ws`ǐ|1~u?*,!gƮ0#!7 {B7'/;rCI~%{mȱW"uR|ԻL;asx+Yo1p8ح/PX諱#Bx8L⑥_\h]$w _z~n䁖KgSa_x5~ 28~6ܨ^wl<# O&|wޢ1!?Z$x?GT_jodяy}".'É| Naw@uRz5sN^epG_ y] x|D1u2AeU8 wgaOn =Ӥc5v#:u;kO(?`[e⸏dKj'?yK!^+maY} SgV~SYO| do{GH;*{Ѹ.k"o3O:J@nOpEovNKSb$?;K9DJfܿ ֳJkб>,  k/_I9S~07"gR9܃I}\fpR g# o\0*=1p/_[VaR^!+É|fE^WCCxR;5z2nR^%$d H`Ͼ_Ҿ~HB=ktF:^z!v 6A+~Ka`ٌ>rTc1Ibrz)]ډՔOf~Şi Mnjt#Vg?? 5|m 8KO&:o@dBgH()ȋt{OKS_ ?In}Z+ѿ/֞I}OJ {u%VgFgJ\KK\\OX}n;BHa^]^A;-3Y ~PwҾa}HsMBrf9Z\u{auF1 _%}Kl 8T˯e#|9NnZ/Ig9IyyVH;D㟟Icǻ6]sTwRe\\WpBIBOVw B7KzogݑU&i'i2S5~nBoxICpgkr٪!W@/#8\rϰ=U;|x |e_op=*bA.#9Wȫv$&MokԷ紡*+]k U [ny)t\JڛYME%w+??s.ɏ>;޹ yFR_^m/B]v{YSp!%ת C|?SDte>6|!u ە@Y <+nsњK{~~D?/y8?d{"- y98̍8w\@)wmm꡷)|{fr)`7zSS2~$*~U!B;W9H~!ie{z!3돪Kmץ#Nx >d勞W5b9;Lx=UDl볞:xD<Ng]#DODP;ҿ05} !7{CdJuF;'}~묈?i6jAou8肉XET@m}oiwv\);톝cI$v*#SMZ<6rhpOyn<kA>0ы:+tFKgT[;YaQ+¾K=CJ9K.rc;kؽnj~\QFX=*`wb/ )x%/Ƒ=g ,疺O?%2>ZG__{/^.чV)o(̩8:sEG|6ec(8K&SU7(q`s^K<x^L>jbM}[s?a sk73}Λ5~/Kҷ1"\Zkzۛv~jg-:m%=ΑSy(39 g[,PoM=e_d"k}tΊPJݑzG*`1)ŭ>.~3[R '(\]vsf=ڎ&?~4⃐#_)9'\rRxm<ݬ%n Qx&Joif.q^h~rMDK=;ǵGR~N͇hձBwS;k&x/Oz_Z(pH/L=Ms_K4nԋ0FS冄'aw^GZ"A?O^i/;ģGh{! ۅYo-qIgmOBO?tm*qo#~;cV?ֶߤei9avojQPtD>,mias]j~pp7aq3ѝ}[_:%]ǏQ![~im %Vc7` ;Z}swqiJVU!>+L[K>n%;S$\ ʖ} s5&[I~rӿ@_z%կiʫ[Oz4v';.J׼Od0'՘c/n܇UrQ7L_}9Ğ'GM6q 9tCyu9/GM~_-Z/Q.{{Eέy3*67LEC&˨~/KCz'?{ W`Bqj݁&2Ow7-cm9)՝Ӫ+(}_WMyo7OUq5z|Vf68@ulFaF-W7ܒm%8Yu:{6|#dUN ;=?9kf2a#rq({l[QwϚY{ϧ&. Y'П@ާFPcKsιϸ/vCfusf]c/:8+u?m: ~B'$\\yHmuN `+|R+P% 4f<p:R.sFoB_6\OAg |>(;˥ݻCЉ J/%鎍^oqǼ?pMϫ0fBt{tx\MƑY y>Q& tD:q[s3mc}TI[ . ]={Rc3DjRǬ;[`wvܳiʯʞзWNga8][0{dR?Ȏqq]͒*O>3р ط45v-+aDυؕ$zY9nCw|;v>ȃñ'n#NssH} ΍5^΁}uД+RN=܏ORVH9_ytO: ~q5=\({Z])jo>GeJuޅPg~(wJ\'G؇0^ ]Eis>ƟwD\O;-}Ldpfz5 V֣_ ~*b߽~:}B [{x~,QPI^ZLZ˛|R~_qu \]9;({ntq(:հ Q{bgxr :5dzzZp?sDihz0XUJ\]ݦwDMAjng>-및Uq iIs݇Yc/y_oU&zw1gtC/| oTM*I=赆 @>"SK^!Mۃe4Pҍ)]?~ԭk2\ncϢݸGݳ#_G,OS9;WMB𓢚bG]Қ?X_O>8]֪_3gL:OD~ͯ:bw;g{ ڗyKx'%.`]U܎!W9烿R5re.!~Juuf'ǃ#MOHW~bK SuuPq㨩;!~>\BGYS9ToW#U/h0/ITí}p.x}d;;aнWu7ң.}vQXʅ:7ܙ#vT=FKYDvF|}(rs{Wy;G_5Y#ờ}V"&8s.]P/_8IOS%{{ V$Uho9QY`NG.~z2;d_Ι۵̗+vS@n2e8^;7xS}B?v0bQR.7ʔ-^V=hzY%W*%D>|ޑQ9|Y)^w7=PR4/5DžN7ǥ_vUq`T;r-{>0;፿/*S77Wvi:лPgN*zr ur<>ƹ׎wܶ! }Y%(C[Vm |Vd{|>@>eM4m37|O6XzL:7s(6 ո?7G _^k?!W?fl?3k=x=K}至-ċ϶G$ܞ h7#i'trqc'o ? Ou:{2uмƃ7vXYsXX8^5e G{}a퇟K ߂ ѾAc[3ӭyw(x(Yʼn_ pGH9,p莞܇3怏 `HroGv*L\Kw6܆zz_> ?N|n?6^-xOSU `N"/C.=r)[_RQIB0/J?׬h.@>ԍw sf|UB3{ȟW=n ᔱ?Ĺoxx|wZ?g__]c޼_p=H]W2mn'L[I]^FuyűôY N:Cj?C,y',$ ye.zG%IC׹W$'8-[2R/pTv';@r$~:n (>3~ϷN=kP! ^& <7&?rm@ᇽT _Iqwq$L--Dt?-t-[45L?MX$r$?_I|u:.^g|rpoEN=+0V?7.Te~;q8]1?i?RRT⦟üK#ߍ'~#ޯvl>>B{QޑnƈlU;y{oOR{pq3<ӯi hw޲q\@olŻ_#`w-_"Bܻ{wܛ<zؐEc[[/^W>eNQ$|rOؘw"eqת01'VN5{gYc8",7z?<0 o~ 9'[vi<<=O &>Ձ3T9ϠW3t*u{9]aCKzRIKӷ/T͐/s3c~V#nc%SWd72WLGV璄aw\"K'߂6fބ?^ԷE7ߣ=}ޙl;-xjp4Ž5n3aƀΌtW?}E#2jZ)0~IBЕ\Ž=Iَw!ϰ{S/Jh%ݶwb¼d#O;ݰ:lssFUŏ*nVu;٘ȧӑo滢- C3xFa̾n|C/粻1kr/چ"&t!c{C۞|nrD.+xEzX+o{w>Gz4k Gmgug~kG<2  DÌ͒tc*mļ_}Ž)Aވ\h}$5%>^=Ndޑͬ"zz_I؃Xۢw VwfcOs޻=fg6ϑ' # }ĻOq'U.დ:,U[? soJ1=NH?^DG_3سz zYȹt{WKz_ow!oP/?r2:I8ԻOz~Wz? ezk?5<<7|DwAޤϻ{ Row:OulOYŸg`x0zǜCGާRgf/S?5 _}-v0hWJ?d4_Nv<ܫ]Mڣ3|'Y#g'qH{LOE[6_Jz9^}SBm߱Ov"_JN8zgS}}^+x7zz8]*-F^cb޷ im.o%~}np1Si7 l̓ߩZH=o;n Xͤ6ҏsoR7e„Cy{/{6k8$ N_f=y:i'~d=+M?\=GM=;j{ؑ~*Ж1n"oDohŻngi?j?\۱OUOŻ3w/u;ͻ"~쇲qmw-*h|."*I;p{/`O3A//RfW[KVI3 U0v?ĶYW߷ׯr[wt?}g3aȾ/5'|>fWJ9%۸שWQ!r 3񝥐Wcnu`LVGgܗgp>I..6Crl!*ۺ|zϸ)4ĮZ'x+-=D Jom%;̷77JT> تSɽ7f)YxsL#鶅0 )Z'&dx}W9 /K탹gX[\|办½'~t)Og#-ص*~^M(ARh~OH㸗m;);)p[b6ncϡVNzƻ9!Ephprٴh><.~U7'֓%)7/ ҎT<ؿn?\;owV2nMp"|[w3xkOx05{rkoU\pz^ո[O^3DK!_Q{_: }!;6c=XWr+I׍sVHk#CM, BrGWAfhK;gGERwrSFK4ع5$n=cviI=(A{I( vԖlpUCup~W_=|v挳xPîV0u'vV5"܇ Y|o܇)~U-U%&{޷gLxKp>t!RO;M=HyYg^x}kGDž~SSg깂AB#FFeοQc|j 50屑5a#:VWخbk!Hv;ټ/>8ӛY?::x|{t'* ]1#rg|yw k~^''g`v8uyERnݢa<{ =~8j:Q[]_H'NVF~X^hu)=зzw;~cu%ȭ'F76ӿ=ztŖdu,6G¸ȉO6܄Dk#+wr+v& W0KW=2˽~v8ZB{Yr^L $rc5.ê7=,~_ Έ/<=os f'ľ{LJd#WFGQ_t?shO?v"#Wv,oJogoan.įLgI5+QxE4_Nm6HΦuBgSMpnZ;~K'r}+<]l؇uOZ_a;k9WSJI8;κ 3fBw1r% =UNf^;;'[T;DDӏqލWOey]^Լw~_*嶲̧2~?K<^[-tCo^ݬob֍3lAߨҥޠ,= #MC9+8&";ϸ#ݬ&Oe{߃Ww}.a{;Svu)~.z(\綽vQ~c}ڊGwҘQgcVNrQ ?WK!Ildߚvpk'Nf w&Эx7x IX2\2$n2vs1G\+y sCY/~UW`j0/?'r. ~wfiž?E6ߛPRT?\ HFrF$(I " H(ArIDəf"b@%t SuQ13;vzg-mNgg>f{ aָg`70XYAy&=^)xLΗnVUt޼|_opI|S+_i^e@G~{Q=}K5.K}Gj_uS<(8px;$a;ڵuOX#Z_zqk_΋[]1g*tR]#{|;'ޖ>=?nK΢br:78Fퟻ.U[s),lnQj q)-Kj꾔 sogmTݭ?{xt;cײ2Iߙ$YSt\S&[͑>H~ݼr?+=罸uToJ|WxM;8?&:$МwyN}guٞ}۴,{X7ԏݧŨWήsyH/_a[* G[opWΦtzQP;[yci 9g#iѭ;y[[8Q·&+}R RWv_x@o7D[ՉqۭtN#𠿔s%&(.=S-Ǵ]ъƅzyB:gduWzhd9IOבMm'f9&J'_x.0+'eIhK\Q{Kj}d^.@aw"tnQ؝z?{Z*LMjsfb=wN=I~>[zg38N(ZE}w5L/77i sůl>|t/zXʹ{޲) .V)şSeLKZ{ݎѾkjگk2~q?_vWz]TJKⴭss(z7[_Wqf[:φ?5w+нq֫ZXeW:ʵysP]ZXoi0–4Oϩ _z5{^xCyjn tn̮~`[7k]r$#QXt^ݞn\awVmu\箬s'2zW=Yj$z7+y_*u5Ô?'<<+w'?MG}ݫgWV@{ٽp8UλcًI]PXIt^!.wwX}S~Cʏ0Gvݛ?_kί%Ώ_Ǟ8å9isF?m9[xl=oX\@늁q7chȬZY;.0zf/{/S7wmQ=E|k*sGڛIt%iqWW^֊t`/d|?vC?RDq5o;ឧy={]S 'xS.YygT9s{m~ yw]⠷^Ӿ5 iG:Q}.;/)̊0[K?6.R/§'&DUIϩp1 :uGv)g`νePhſ̽׮\`Sʿ_0[Ut:}ԊA=߽`Yy0P)?S8oUű/|-[ٿ 7qw5qfbqʡNn=;.*ͮZ=:/PSud_zŽE=³6l|9ȍC]nk&>3ok+}Zgh}y]]V|Nz_M,\@CMǎwMNkh8Y\^yZÊ#ɧttM[cQ{<g\7}E.qGPy_dqWd.~Q@>f/g >(=)yW7Tu]qƁK:GXH/tQDS7oUS>cOE0|S:09Yk?{z6?8SvWgtޛ2]78E}'u/)v9zJ8F:;8sZ,U>Ut+rsΣ,_i~=]sۛ|+nWyqeϙh[|O뱋)U]~ywmެMۭ|6# >ESx|g~]b^kt3˖"N i|vw,[q~ɢ!V˹*/oji]ޢF({ ɱm*Xꄴ[N)'+=nWGXVi_./_]ir'fV[xnWLw>Do}yxF:ǟyt3B~uT7ރgyyt/]SO\Kk=|VϜj ܆ʛUMӌT=:D:9e)^)vUXtjkFWrgon:)Ϣu_7PG~qs 7|(p7__''>{)_8vtsʸ~WB{Oߴ~rA>˜`qfg^گᴷEc_uS:߰ӊf|T}Gktd ?|UuΥ5nNzنZ' tU/:vCo7 oL|( 3G~o1uoK:nU~:dgV^Ŋ=Ra"\ǝ)Ǽvg@v7/ʢg64ߏr:9RC;\YyFM^ySyt>:.[yErĶpж?'\=s7s~j؍v}v-ũl?8#N!Z({fwG`6VΞ{aV]k|^5/T+}Y<_yUCMo^ɷw> ˡM:ϳ;+zXn|*/M3UCI%^}( )o^$ORwwe#lU|ޟW2u\j{We#~*o\-OԹ[u]U|m>dWyvzvϔ\e~r_MGȎYet9f֊sBmm{iĦmZwX\#O;~F:mx3kzOtpj#N+/uFx!{j_0n}i~}ʽr{Z=ks?j\t2!7>N}K:1e'c7r|_Z$__k^w|uߴ#ZW\֍R:W={VL'4zԬ9o|VQ)/оyQZ/(ἷ;uO)O*}=;ddQqt>|Yz̮8vݏaVme[e}%qfI7w<ͪڕU]4~߉::ju|4eOzѹ/}/.<(Pamsx'蟪V~HL给J~KܯF3h==. ?9%}gԸ"6>N?wge:J1kmAݼ|<[@fn`[_ɷg GNqy?w׿kbWG}YbIu_YCnB9*ʏ(y|7fCe g#ƿ+}x1:;="03@?%1|]VY^^ 9$p,ⷻ%̊1G+.7>5d~=[fw]~|Te܎i|g09E^82$UVB7dgZ?[nX7kڟW'[УSnҞp(.9 l{iͿu>_)<*K1k .[o nxCO. /3)hQD-NZv|eeNzђOno-ԺpB'msq"cg~ñO@U2vD{t]K=U>l<sQ3!wF+)Ym,z\CŜ[~\B97ds+wGvm1]i|\*,:Pk#ɏ)>5b8i`FWWXGXC`:Ӄ>wi'Ye;F!~u]sZXMss_ǵom=u7ƹq9.7ʏny@s{n~n')#֬Ut>|Q ŧ|^|jť\,=QWY%S(߄EE__} t.)Ρ5]ZX=OTZ[| ӽV+ u[ns;r;{Ս{-f**qS~ם׻?g=[Nkfo_cо󚡺|xi{gՓ!dK8sc/qƅN/5QxSJ+F|w뾷}{d'dY)ZǬ#{o>I㼿{Z_M1sG-˔ny>+XKܼi:wlKVS=?'xK1_Χu*7A 3@Q幚NM;0ipO־N"κqNM_imEAnޚוoaEg/Eo)>%d}KF֍uW_]_|Gtzy_}vQ'ővMS^KYt>xV7IWcu/ujƟUC6roY}Z{Sm|V~Ib (Ǩ/z))V3ѹy;+}gV҉^ase4T|a3ڗ <43 '>wk$<_TCVymuNd^.;D.w')К8 +]{ w1?*yYUWܩOv=S~˷uYܯ<#Z_p[]'(k;cָ};:|rYXQwPDKCj_'nQޫ=$+߾|_t)Oˏ]oPy߼&kSzE+ϭ_.>wX+%c77P>rx_8bj޺z)/?9uu{λ{E/iXc|7Zg*_uGgd |_4Pq ^9%s]oN}E?;fu [U\u;JLw޷g)N#\c_},bd'=_8_G137ѺޭӁ9Q 29M٧uzϳڧ=QSu Z)c d٥]BV~݇3\Rx1>R8ˬ"~E%+ lUZ+z"lo|Zr_ ~AkWycU8|6Z;Z;Eu:nQ҄?0۷rEy3PZϟ~Z_2g)>}Ê'W ss|{^ҽfnP>ϥݼ`G5jWCQ7O:G0gC؝={rm5c*n<T罸:fnk,yGӽs9d7UƂ?o>}oUާ/tOnMȮZǹNo*O~[~#kt}KF7I贙N᫽93 u޳ּ*zz'(I=幻PKڿR/ήʳrsi・svqi?{y y sߩwn};ڇԳ3i(#1mOuweTZ y>ה֮u*~g3yg9Թ]{F^kyq+_piZyf>EDkVQ ?-np}I󔫾^;Cq qu^ey>-~3_qQFYE{S̆Zͻ7 g\?7Wu؟ggp܂cJz}j9c뜟Æжvd {ZŝΗ4;*Otm}vRn)4^%A9yM|yi{@[Cmpϛ,t%ZFݟnXG8.}( nlô>TV <ηE]#w#bۦNmY󸡍7zOiŌTͣGo Ϻ|8+:{:Eʮ%>yG&qwkݭnn~گ-~lşFu /U~Mcs|6ثx?/>yLS^G5PrV~H|1e:vCEtJ|KP|NKQE~,݇_[]=[ tO$Ƹc[ȟ_xى%/(4nqwXʭ̊׺y^Z?a=ع/۫nĹx2ŇSuٶ?uOV #͚Z]t.+uݳ3č=|f uo;ۏklʟjÚOoi΍$=>eK)scZ'λ3u>p;oxܒ[jjZg3/rm@ _کu'i]@y. `pK}UZgty 8E/~V8֪,1uHyϣLnKs^9)ptҕqlnōEy,7~1,{AyEp nވW՞<x:_kDVT_kjTN{2<|ڥ䟨x3֕cOꞪs}CvKW/= UvPO}i;,.:wĬ89wOmvctš;OQh~^.7PXkV?|ʻUo}|vo5uN,,\fխuo~zQog?(ט 4oMpHTKV߭:i%ºsEvo}u/}6X"r.鞛+;dPnNH&*^_Q#}Xp#GtaE }iu%Zy.zԬꯠ{\> ;ƻm)U?^sslʩghv7_?t޳;|N_zAjvg{vyߗ?/uM}ʃV|3+=gEqQғvf=w}$6₭i=h7,i Vm\[y+޶(qSQwsp9Voqg_p}fX|.KS~!}mq$G6{e=\=D?狖i[TdTnSʣc-W|ĽWxDWIZW7o[)ٟ tN-Kw_;kWz q-ڥ8{A}ʳv嵳[^ԄZ7{cgYO.=QK<%uO[`S>]mbNGz=nL3(/Lne~u֋SzlcͶvո/D|7ߓ? {f 6P PtK^.O֏z _ ZO*?Bͷg.,'yo(ҟ'/6=# 9A=H)U^?S,OfOYoЮvBh˫] V=v8Y;@dGEh'. ů~/ԟW{گ` Z.y;<ОW{i/ŋ!v!Ly^ gs0qWPσ` ŇaʯW~y~- Sk?߿-^M{.J>PoB+z4X{^KpU?TsA }\C=g^~ys~( <P텫OS*/Y ڳn(=.=՛Kޯv&_HO^PsB{vS'd?kEyc΅ ^5!O{!I>^}w'\ycP{`^<+{/=Ri俔svgG ܫjǃǫBpqW~Oޏ{!Kcg´* ֟SPh7h<֗yv(~xpf#ߐR|ΡOv>D<˛CC7 Cn <\Q'yP{AGRtI/{CRؿ:g:\j>C-E8!_zV_'+B#yG>J/k &/`,^y {(~4}35=õG=`x^w#\{R\JB!+T?J-.^Ň?OJpyy|8;\@pͿUOz!]a sB}[_OfA⮠u\A=h۹_.D=^v=ApE~ x3~ϫ  ;|{j>e82y^qG{|~z@}{Jm'A.O{|?\B;R|^3D nz$XEv/'T{zRyCބ M/l~2TCGr }?CPt*<ögi#ʅ)Oa{P>kz !<~򿔶>xʫ_σ\9 d<#8®' 7A󊏼A^Rk Ǽ ŷ ^>Y=^qIJ{fC3_ V.ʇ_ ZoJAR>_~XCcC>ҿPvzۣw|z+ R>)2\.HڕP)O&nhߣx׿Pd{+o? eWGvR{O~t/&}nJ~Bdy)OPx5LW-^y n~&/TS/h/Y=^Sw#L Y{B[.J/\W>L h Rޣ=lGÜ/LUz1Iޮ^`^K!7Hav~& G^_0Cv[) aS< Ӥ>Ȗχw4Ȗ08|zӳ%CÆyeDߖ0jם%uW;9k{2 /w=x"a\Mm4 0Zi*3Lc {57aT~=a~0ƻ _]aaTc*6_ƕQ=02|~6 OFj~G{3R4xgE. ߀{'00a ~UbL%͠WMxa|=`e5s _نKQka17/uB~ah7||jCǛцzo3* x)=P?,t|}{7|ew1Vxfa40*g _Urhڿ 0WNu W.?=020|32 (7E#'|Uma4h24 7f{nW:{raEmga 'F- 㯛"7}~:GXq(cn/o/0|VN] ++ 8K&q:lEI;|,hsyo,259R0τl5 hU×x90R]2|1v(s.}kͪF _Ɔ/yen3 #Z>WԆ,q3|ƢF s~2=lRoUVS)  #qԇ7 _w[0zMo;ZMl+@ٴS~Os#cu9'ml+,3|Y>3Ђ|rq_w7ᓘ 3/O'/M.}`|ley0a3.hlExOhu[0&o5 1 z1w#֏ DnhXxa z?i>3AJi×{jBxdZ~E_yN?wmSmY^qx( 4 .!k rҕ(г?CIƩ z*sKŻ͟WD1nQz!ӱ/n1 #i ߠv|y '4'C{Md$@1hIW߂.7Ǽ<3GD/2XQZuG{4t,\e{'tX7s2y=4t:vy9in`خGZ ;я CnN> C3IW_>tyl@:}[ZFחC~Î,l^L]†Q+͘}ƨnLOll-' Ww'ex>_^D+2ّ޴۳ f[cwc &b'>~tf-ߣOd9rڅ wfӰ3ؼ ߋ1RgIh / m؇ࡃXxy˼0g( —G2ؔq/:㳢?~X 2~vg1<^>g0h5]3 V~/ z+1%|iyz26?vm:萑8VzLe;CQ蝇0팕y.OnDA&)=}jLa4A82t>ܔ2༟>F'{s'їxJ Jr:?{<+[YSՙo*et<bޞb='^.; ?Gg ;D]'Q+諕~x;*s'×yx3/B_Ţ n!lc"c[B矱Ya^=Cצs c-W]gWc3|91|,`С\M~|߅P9ߢظ'?ہ*[/G-b~G%m)Ӂ Y{OLd1`)x?Ce32GygB7\6_^6wNnh{_l9M<Ϳs#2猳=^X=V3|~/ʎgPb)fi2گd޿n9GNG0 @.psٍN 5OkgT_!/ڦ6_m[-IxcV؀х=C^uy`T:9z$rEVl#Y`g{{%mwƺ߅/`:gi2|~LwWKo`W߃ՆGQ ؽ7zhN`{}XWѡ+GN\ZecǞ+67}W}Άl`w7>/ȈJ =- .7|mrpnt et'Aj0rL 4ʏO{Q>)ora޷R_;#d Cǰ-ix l!B?/5XQHklm(pt]ݍ/؝.cc~c.OdogT(W]@#:RI{=` l^kdV ڭcr*2->'k?z3qu8lVVe6Kz@п8z>ToI|]בR`?s1+A.P_i XEd,=+=xtȌ]xMu>;nPPB6wKGF/Ot5x-}f ;Ry샾)۔q@/%p'^z:~-+|>| ۠[pB$ /~OgVqd|9+#yyL=4}e7u#5r Bn'A5Wf9]wI6]f`sK1믰Mei_R/x&96`bFO>wmN޻Nˊ~m?7g!WאNw >Ynx)3pYxD ?m -3Gķzn9?c:C1h8|4lx ] h ߴD>vCnZs(d78) |}(y+&~y|ۜ_`&{evON `C5 _ md Zm/^H_GG6S%pz;A>>k`,'6YXI ҵ<<́oX)<~fWctD|IX1/QZ㛵s9gacn؈=H 7*拆ѫ/miAGt~䊌$;CGraGЁCz<\z}s+~ui˧ͱDlvyއ߿"sР=ĉ`"tY|VԵyt=}ꇭel3͛TB'@>ߙah > O΀N1g1Iة |/WvZa!wƖ_53laU)w}U0<0.CN1H;> ac&ߵ ~l?/Ч(h T9-'Aρ#`ةS#ؾ]贋$Zo| Я,ju#`|(7r~k n&瘟ERӿwQԽ9 `bkC 3@ԟ=;NH[OlR]0pmzywCg 5:{DCڼJf(h, MB]W /2>] m/+#, t;^k2{SqaCR#bSw G#x2z]BG\@휌.DDFn6~fCe{n'?Pg|W- ~.~!::#rhaC0ƍsjG㙳y6 gykO}ȿSi>lGqofc㷁ú?2{a`oؒMh5Z:Eo}_@A'~4q]><[];ܦÐlضMsfo|'9 tZMoyո2Bg>D/Vo CrG@S :AJᇌF>w_ ecb[23f=REGM@V6~.uSśh:ZgƵ$?eld3;|\N@eCϪxKCOf`ts;_G_O;w%o_>~eG _s9௧mAްevA6z cױ`-*]|{@yd4 <9 -S?0[>LIHPԍ1Lwtc;xYld~O x|/h1tfJيء : +|T9$b~wJ*U]3G#?A&kN2aW=⽫g/]h\zpʎ!3~_}6؄yݏlC6aSڢmxw˜FMS2U]lϼ,Ca_Dcա@}i2u@Om5{kvr(!|0y΄N<Gvs;޼wtQA϶Nq.} ~kȈ B}gG߁ # :3:s(!v9/w0MJup"m{/yvC(xEK6x`} tك?'n,L4~1&ͅ9/*ϜN&C1k2^rX]xs^W૥_jf+Hi8c˸KC2贮踎I1?N_@I>t$ 7j&îWLۧZ>+v/-Zc/uϣײvuo% zݗHy>0&njc[ķnj&k/pT9>.ӡG9@uFW&FWй3qA_&|xc8F 2ƏY?3.~ pikpj'ltBh[{|бyQW'|ؙ]Ic[>g羌Hұ蝴s_~VCnAЧa G,xf'4oI)1#Rqd\Z,Ň`nm؊LŎǮ?.~=h}n`!*[#t@H^U 4GoMڧO;^}xlalASww _w= {w; .Ə ͽx#.ՙڌz]~{ ;U _w7|FBj غ߳7~YtCa>bC!}ωv\bFCǡ%yoecK2?- %oc}<ۉn;ܴۣ\ 4㑵ዱo#tȜN?"G~X&i=,|9a|ӢS lF'}f& b;At쐂E;*r>\:V3iOIhT-]x]ZC?y-l]6͌~׺@3AL07/VOǐkOY|1;낽c$5Y)|3]ͯid80xt=0:?z)-xTOؒ_ _Zxi#t}|W| 8dB|}^1w2"г7859nk EQhu 26?10G1q /*HK qoˤ5Aئ=f, Ƙ+i} ߂n|owls6 pڷe y~}kcs g#1 _ؼQs&<6 h\{b?A3ChaIR9Z0fN,ү ௤}tƏʽbb< pTmх{JgspOM*L%k?b3!x^ 6ꃿ0>_'v}yh?93s ,cKOlR;ػv `0QVtAyYN~b 7UB fB'&U;8ibz12ޒ6##-iOu8790;ƢSk~IGƬȸ}OB3ؒVp*LOBw~Ɲ(~?Ø/ F`Kнyاv^ycҁљ}o" _G02Џg)422OOݥmSz]s7eSk< \3y9l < }.d~KrZQ::!fQ/8)~TqylPћ؃4XҚ>sP탎h}]ΦB wI{ R'=}x{T[am퐗 yy&dc.#W5-31.un09oI{6)h6wTFr`I[`3`(x=&'s[nKZ /؛~#tuc]*=?›,~O/I ;:#/غY\`8ƍm\/ {S= P?4<0?ձ%ab-}M70KZ+W)';/ҡwfGs?Xv`Cs2gWoC"spo.| 0)Iga桋^x} 7 2Q F_O} ?}K{mcN;Ь;z08*؁s1BgA7kUF_Eo?/Q:$ CU"-[i}'ыipmKty C3|p w !W#=x7q}Ndl8r68[| ?hz|cI/ _d\^(v$</œgŌGRjIIr =3+;06t^lyǑϖ⍰oin*ax|q'%"/qK ba,^.{V>*SABϫ`tep`*:Ϥfe(Lh;}8?,j; zQ&+vIrQ:'~g}]P:yi+5?s{5'X!;DTgL'GŬ5)lԅV͎W51zsdoup; G.HQ3Ac+ n!21;R,58M!M} {`::{x4q6\hE?ywi!z=ݘa{m> : k t@Y[@*`;§!w5hXipuAɋ]JZ3z #y5̣5pY:HEYMWzbA貖蚢atg9|*LkK+ z6ǀʃ[}z-}M#U^#X؛{y^Mdk)PY~hxW?d>2YYBc(Kᭇ CY>;͜>Mstnҁ|]M|u]?NC'} T`ζߤǦfVw_10v7poޕ }Kzbwvo|16tRy@ xra'ML^(zfE6ܤM5 H Og|twHl%tCA4;J0e$ލv=Qy|[ˍͮ[ m!K@'^8NɌܵh09x O6/-G 5 DKJIcgā"2:jL{6x< z<< Z*]OQ? ^Sw Ġ+_K@Af;31M_׺(c#ENƻm)rO~eDn O{]ypgTZR4 P&E#$QE(J)R-u)mю%;2*U[ǔӠ3w\}ywOWF:ѫ.9q\%qp}.&Ю4WN#] N_G']x~3ފTe\%7[n ,"}^f#҄o&Itf-r&3-m'џ_7řY4Y^/Gގx[juva6y6,܈qY,q~ާ_xv~jg?&Sj K0w߇xbW,=KVNcJp8{͌pV~>jlfG3yP'coU dmS@ Gu )n`O=0/ӷw>V$3?&\mp{=ѳA4~~@EIxu9?<(|2cIü,W'^#\eF,V f??"/8J; 7WQW9{4G]nՊ;/>Z^xj=x*]sny|guN6?4?l^/j}^ L.^9~9\ ,}[͝Î'GE7ZB{5c..K!l;p7Kfѳ}KykVѿ޴N]ɓ|(/|՚WIuXy8zKթ\lG?/ ZYWO+hS i|p_5% }S^kax}1VVK>N3A{+x*!*:]̙)2ϵ2yN5ir5!<sٻ ~wF_+_rv6ᷜt5'k<ĝ# _o;Szt~9 !ݜ$s7ւds3Ub^|#Mf#拡.gyxc#%|NJ"#-^*C}Q_G1 aroma.light/NAMESPACE0000644000175000017500000001006414136047216014035 0ustar nileshnilesh# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # IMPORTS # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - importFrom("R.oo", "throw") importFrom("R.methodsS3", "setMethodS3") importFrom("R.oo", "Package") importFrom("R.oo", "getPosition") importFrom("R.oo", "startupMessage") importFrom("R.utils", "Arguments") importFrom("R.utils", "Verbose") importFrom("R.utils", "pushState") importFrom("R.utils", "popState") importFrom("R.utils", "enter") importFrom("R.utils", "exit") importFrom("R.utils", "printf") importFrom("R.utils", "hpaste") importFrom("R.utils", "cat") ## Multi-sources: R.utils, base importFrom("R.utils", "use") importFrom("matrixStats", "anyMissing") importFrom("matrixStats", "colMedians") importFrom("matrixStats", "colMins") importFrom("matrixStats", "colQuantiles") importFrom("matrixStats", "rowMedians") importFrom("matrixStats", "rowWeightedMeans") importFrom("matrixStats", "rowWeightedMedians") importFrom("grDevices", "xy.coords") importFrom("graphics", "abline", "axis", "box", "lines", "mtext", "par", "plot", "points", "polygon") importFrom("stats", "IQR", "approx", "cor", "density", "integrate", "loess", "loess.control", "lowess", "mad", "median", "na.omit", "predict", "sd", "smooth.spline", "weighted.mean", "weights") importFrom("utils", "getAnywhere", "packageDescription") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # EXPORTS # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Export all public methods, that is, those without a preceeding dot # in their names. exportPattern("^[^\\.]") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # S3 methods # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # data.frame S3method("plotDensity", "data.frame") # default S3method("distanceBetweenLines", "default") S3method("normalizeFragmentLength", "default") S3method("normalizeQuantile", "default") S3method("robustSmoothSpline", "default") S3method("sampleTuples", "default") # density S3method("findPeaksAndValleys", "density") S3method("plotDensity", "density") # list S3method("averageQuantile", "list") S3method("normalizeAverage", "list") S3method("normalizeDifferencesToAverage", "list") S3method("normalizeQuantileRank", "list") S3method("normalizeQuantileSpline", "list") S3method("plotDensity", "list") # lowess S3method("predict", "lowess") # matrix S3method("averageQuantile", "matrix") S3method("backtransformAffine", "matrix") S3method("backtransformPrincipalCurve", "matrix") S3method("backtransformXYCurve", "matrix") S3method("calibrateMultiscan", "matrix") S3method("fitIWPCA", "matrix") S3method("fitPrincipalCurve", "matrix") S3method("fitXYCurve", "matrix") S3method("iwpca", "matrix") S3method("medianPolish", "matrix") S3method("normalizeAffine", "matrix") S3method("normalizeAverage", "matrix") S3method("normalizeCurveFit", "matrix") S3method("normalizeLoess", "matrix") S3method("normalizeLowess", "matrix") S3method("normalizeQuantileRank", "matrix") S3method("normalizeQuantileSpline", "matrix") S3method("normalizeRobustSpline", "matrix") S3method("normalizeSpline", "matrix") S3method("plotDensity", "matrix") S3method("plotMvsA", "matrix") S3method("plotMvsAPairs", "matrix") S3method("plotMvsMPairs", "matrix") S3method("plotXYCurve", "matrix") S3method("rowAverages", "matrix") S3method("sampleCorrelations", "matrix") S3method("wpca", "matrix") # numeric S3method("backtransformPrincipalCurve", "numeric") S3method("callNaiveGenotypes", "numeric") S3method("findPeaksAndValleys", "numeric") S3method("fitNaiveGenotypes", "numeric") S3method("normalizeQuantileRank", "numeric") S3method("normalizeQuantileSpline", "numeric") S3method("normalizeTumorBoost", "numeric") S3method("pairedAlleleSpecificCopyNumbers", "numeric") S3method("plotDensity", "numeric") S3method("plotXYCurve", "numeric") # smooth.spline S3method("likelihood", "smooth.spline") # SmoothSplineLikelihood S3method("print", "SmoothSplineLikelihood") # XYCurveFit S3method("lines", "XYCurveFit")