[med-svn] [r-bioc-metagenomeseq] 08/09: New upstream version 1.16.0
Andreas Tille
tille at debian.org
Sun Oct 1 15:31:08 UTC 2017
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository r-bioc-metagenomeseq.
commit 63047b3fdf6654f8cfe3460c33a9c1f12a0b40b9
Author: Andreas Tille <tille at debian.org>
Date: Sun Oct 1 17:27:53 2017 +0200
New upstream version 1.16.0
---
DESCRIPTION | 29 +
NAMESPACE | 104 ++++
NEWS | 71 +++
R/MRcoefs.R | 114 ++++
R/MRexperiment2biom.R | 84 +++
R/MRfulltable.R | 136 +++++
R/MRtable.R | 130 +++++
R/aggregateBySample.R | 64 +++
R/aggregateByTaxonomy.R | 77 +++
R/allClasses.R | 308 ++++++++++
R/biom2MRexperiment.R | 41 ++
R/calculateEffectiveSamples.R | 14 +
R/correlationTest.R | 119 ++++
R/cumNorm.R | 53 ++
R/cumNormMat.R | 37 ++
R/cumNormStat.R | 63 +++
R/cumNormStatFast.R | 57 ++
R/deprecated_metagenomeSeq_function.R | 23 +
R/doCountMStep.R | 70 +++
R/doEStep.R | 33 ++
R/doZeroMStep.R | 41 ++
R/exportMat.R | 30 +
R/exportStats.R | 42 ++
R/filterData.R | 21 +
R/fitDO.R | 64 +++
R/fitFeatureModel.R | 73 +++
R/fitLogNormal.R | 71 +++
R/fitPA.R | 61 ++
R/fitTimeSeries.R | 610 ++++++++++++++++++++
R/fitZeroLogNormal.R | 299 ++++++++++
R/fitZig.R | 274 +++++++++
R/getCountDensity.R | 22 +
R/getEpsilon.R | 22 +
R/getNegativeLogLikelihoods.R | 27 +
R/getPi.R | 17 +
R/getZ.R | 29 +
R/isItStillActive.R | 24 +
R/loadBiom.R | 19 +
R/loadMeta.R | 26 +
R/loadMetaQ.R | 28 +
R/loadPhenoData.R | 52 ++
R/mergeMRexperiments.R | 103 ++++
R/misc.R | 70 +++
R/plotBubble.R | 96 ++++
R/plotCorr.R | 35 ++
R/plotFeature.R | 73 +++
R/plotGenus.R | 69 +++
R/plotMRheatmap.R | 37 ++
R/plotOTU.R | 64 +++
R/plotOrd.R | 59 ++
R/plotRare.R | 42 ++
R/zigControl.R | 29 +
README.md | 32 ++
build/vignette.rds | Bin 0 -> 296 bytes
data/lungData.rda | Bin 0 -> 290918 bytes
data/mouseData.rda | Bin 0 -> 197032 bytes
debian/README.test | 10 -
debian/changelog | 22 -
debian/compat | 1 -
debian/control | 34 --
debian/copyright | 106 ----
debian/docs | 3 -
debian/rules | 4 -
debian/source/format | 1 -
debian/tests/control | 3 -
debian/tests/run-unit-test | 13 -
debian/watch | 3 -
inst/CITATION | 50 ++
inst/doc/fitTimeSeries.R | 120 ++++
inst/doc/fitTimeSeries.Rnw | 278 +++++++++
inst/doc/fitTimeSeries.pdf | Bin 0 -> 241572 bytes
inst/doc/metagenomeSeq.R | 299 ++++++++++
inst/doc/metagenomeSeq.Rnw | 725 ++++++++++++++++++++++++
inst/doc/metagenomeSeq.pdf | Bin 0 -> 998018 bytes
inst/extdata/CHK_NAME.otus.count.csv | 1001 +++++++++++++++++++++++++++++++++
inst/extdata/CHK_clinical.csv | 79 +++
inst/extdata/CHK_otus.taxonomy.csv | 1001 +++++++++++++++++++++++++++++++++
inst/extdata/lungfit.rds | Bin 0 -> 93152 bytes
man/MRcoefs.Rd | 72 +++
man/MRcounts.Rd | 37 ++
man/MRexperiment-class.Rd | 61 ++
man/MRexperiment2biom.Rd | 32 ++
man/MRfulltable.Rd | 77 +++
man/MRtable.Rd | 75 +++
man/aggregateBySample.Rd | 39 ++
man/aggregateByTaxonomy.Rd | 49 ++
man/biom2MRexperiment.Rd | 29 +
man/calcNormFactors.Rd | 29 +
man/calcPosComponent.Rd | 22 +
man/calcShrinkParameters.Rd | 24 +
man/calcStandardError.Rd | 28 +
man/calcZeroAdjustment.Rd | 28 +
man/calcZeroComponent.Rd | 22 +
man/calculateEffectiveSamples.Rd | 24 +
man/correctIndices.Rd | 36 ++
man/correlationTest.Rd | 61 ++
man/cumNorm.Rd | 32 ++
man/cumNormMat.Rd | 33 ++
man/cumNormStat.Rd | 39 ++
man/cumNormStatFast.Rd | 36 ++
man/doCountMStep.Rd | 45 ++
man/doEStep.Rd | 37 ++
man/doZeroMStep.Rd | 38 ++
man/expSummary.Rd | 31 +
man/exportMat.Rd | 40 ++
man/exportStats.Rd | 35 ++
man/extractMR.Rd | 30 +
man/filterData.Rd | 29 +
man/fitDO.Rd | 51 ++
man/fitFeatureModel.Rd | 53 ++
man/fitLogNormal.Rd | 46 ++
man/fitMultipleTimeSeries.Rd | 45 ++
man/fitPA.Rd | 45 ++
man/fitSSTimeSeries.Rd | 73 +++
man/fitTimeSeries.Rd | 68 +++
man/fitZeroLogNormal.Rd | 43 ++
man/fitZig.Rd | 75 +++
man/getCountDensity.Rd | 32 ++
man/getEpsilon.Rd | 31 +
man/getNegativeLogLikelihoods.Rd | 33 ++
man/getPi.Rd | 26 +
man/getZ.Rd | 33 ++
man/isItStillActive.Rd | 30 +
man/libSize-set.Rd | 32 ++
man/libSize.Rd | 30 +
man/loadBiom.Rd | 28 +
man/loadMeta.Rd | 30 +
man/loadMetaQ.Rd | 27 +
man/loadPhenoData.Rd | 33 ++
man/lungData.Rd | 12 +
man/makeLabels.Rd | 27 +
man/mergeMRexperiments.Rd | 32 ++
man/mergeTable.Rd | 20 +
man/metagenomeSeq-deprecated.Rd | 30 +
man/metagenomeSeq-package.Rd | 21 +
man/mouseData.Rd | 12 +
man/newMRexperiment.Rd | 46 ++
man/normFactors-set.Rd | 32 ++
man/normFactors.Rd | 29 +
man/plotBubble.Rd | 55 ++
man/plotClassTimeSeries.Rd | 46 ++
man/plotCorr.Rd | 40 ++
man/plotFeature.Rd | 54 ++
man/plotGenus.Rd | 60 ++
man/plotMRheatmap.Rd | 46 ++
man/plotOTU.Rd | 55 ++
man/plotOrd.Rd | 51 ++
man/plotRare.Rd | 37 ++
man/plotTimeSeries.Rd | 41 ++
man/posteriorProbs.Rd | 41 ++
man/returnAppropriateObj.Rd | 31 +
man/ssFit.Rd | 48 ++
man/ssIntervalCandidate.Rd | 34 ++
man/ssPerm.Rd | 28 +
man/ssPermAnalysis.Rd | 41 ++
man/trapz.Rd | 37 ++
man/ts2MRexperiment.Rd | 46 ++
man/uniqueFeatures.Rd | 31 +
man/zigControl.Rd | 38 ++
tests/testthat.R | 17 +
tests/testthat/test-fitZig.R | 58 ++
tests/testthat/test-norm.R | 35 ++
vignettes/fitTimeSeries.Rnw | 278 +++++++++
vignettes/fitTimeSeries.bib | 40 ++
vignettes/metagenomeSeq.Rnw | 725 ++++++++++++++++++++++++
vignettes/metagenomeSeq.bib | 33 ++
vignettes/metagenomeSeq_figure1.png | Bin 0 -> 26433 bytes
vignettes/metagenomeSeq_figure2.png | Bin 0 -> 313594 bytes
vignettes/overview.pdf | Bin 0 -> 36144 bytes
169 files changed, 12082 insertions(+), 200 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
new file mode 100644
index 0000000..3b8cc1b
--- /dev/null
+++ b/DESCRIPTION
@@ -0,0 +1,29 @@
+Package: metagenomeSeq
+Title: Statistical analysis for sparse high-throughput sequencing
+Version: 1.16.0
+Date: 2016-07-21
+Author: Joseph Nathaniel Paulson, Hisham Talukder, Mihai Pop, Hector Corrada
+ Bravo
+Maintainer: Joseph N. Paulson <jpaulson at jimmy.harvard.edu>
+Description: metagenomeSeq is designed to determine features (be it
+ Operational Taxanomic Unit (OTU), species, etc.) that are
+ differentially abundant between two or more groups of multiple
+ samples. metagenomeSeq is designed to address the effects of
+ both normalization and under-sampling of microbial communities
+ on disease association detection and the testing of feature
+ correlations.
+License: Artistic-2.0
+Depends: R(>= 3.0), Biobase, limma, glmnet, methods, RColorBrewer
+Suggests: annotate, BiocGenerics, biomformat, knitr, gss, testthat (>=
+ 0.8), vegan, interactiveDisplay
+Imports: parallel, matrixStats, foreach, Matrix, gplots
+VignetteBuilder: knitr
+URL: https://github.com/nosson/metagenomeSeq/
+BugReports: https://github.com/nosson/metagenomeSeq/issues
+biocViews: Classification, Clustering, GeneticVariability,
+ DifferentialExpression, Microbiome, Metagenomics,
+ Normalization, Visualization, MultipleComparison, Sequencing,
+ Software
+RoxygenNote: 5.0.1
+NeedsCompilation: no
+Packaged: 2016-10-17 23:12:48 UTC; biocbuild
diff --git a/NAMESPACE b/NAMESPACE
new file mode 100644
index 0000000..afb0a56
--- /dev/null
+++ b/NAMESPACE
@@ -0,0 +1,104 @@
+import(Biobase)
+import(RColorBrewer)
+import(limma)
+import(glmnet)
+import(methods)
+importFrom(parallel,makeCluster)
+importFrom(parallel,stopCluster)
+importFrom(parallel,parRapply)
+importFrom(parallel,mclapply)
+importFrom(matrixStats,colQuantiles)
+importFrom(matrixStats,rowSds)
+importFrom(gplots,heatmap.2)
+importFrom(foreach,'%dopar%')
+importFrom(foreach,foreach)
+importFrom(Matrix,bdiag)
+importFrom("graphics", "abline", "axis", "lines", "plot", "points",
+ "polygon")
+importFrom("grDevices", "col2rgb", "rgb")
+importFrom("stats", "approx", "approxfun", "binomial", "cmdscale",
+ "coefficients", "cor", "cor.test", "density", "dist",
+ "dnorm", "fisher.test", "glm.fit", "hclust", "lm.fit",
+ "median", "model.matrix", "p.adjust", "plogis", "pnorm",
+ "prcomp", "predict", "qlogis", "quantile", "residuals",
+ "sd", "var")
+importFrom("utils", "packageVersion", "read.delim", "read.table",
+ "tail")
+exportClasses( "MRexperiment" )
+
+exportMethods(
+"[",
+"colSums",
+"rowSums",
+"colMeans",
+"rowMeans",
+"normFactors",
+"normFactors<-",
+"libSize",
+"libSize<-"
+)
+
+export(
+aggregateByTaxonomy,
+aggTax,
+aggregateBySample,
+aggSamp,
+biom2MRexperiment,
+calculateEffectiveSamples,
+calcNormFactors,
+correlationTest,
+correctIndices,
+cumNorm,
+cumNormMat,
+cumNormStat,
+cumNormStatFast,
+expSummary,
+exportMat,
+exportStats,
+fitDO,
+fitMeta,
+fitFeatureModel,
+fitLogNormal,
+fitPA,
+fitMultipleTimeSeries,
+fitSSTimeSeries,
+fitTimeSeries,
+fitZig,
+filterData,
+load_biom,
+load_meta,
+load_metaQ,
+load_phenoData,
+loadBiom,
+loadMeta,
+loadMetaQ,
+loadPhenoData,
+makeLabels,
+mergeMRexperiments,
+MRcoefs,
+MRcounts,
+MRfulltable,
+MRtable,
+MRexperiment2biom,
+plotBubble,
+plotCorr,
+plotGenus,
+plotMRheatmap,
+plotOTU,
+plotOrd,
+plotRare,
+plotFeature,
+plotTimeSeries,
+plotClassTimeSeries,
+uniqueFeatures,
+returnAppropriateObj,
+ssFit,
+ssIntervalCandidate,
+ssPerm,
+ssPermAnalysis,
+ts2MRexperiment,
+trapz,
+zigControl,
+newMRexperiment,
+posteriorProbs
+)
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..ca87f7f
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,71 @@
+version 1.15.xx (2016)
+ + Added 'mergeMRexperiment' function
+ + Added 'normFactors' and 'libSize' generics
+ + Added 'fitMultipleTimeSeries' function
+ + Replaced RUnit with testthat library for unit testing
+ + Adding multiple upgrades and changes throughout
+ + Deprecated the load_* functions and created load* function.
+version 1.13.xx (2015)
+ + Upgrade support for biom-format vs. 2.0
+ + Fixed issue - "MRtable, etc will report NA rows when user requests more features than available"
+ + Fixed s2 miscalculation in calcZeroComponent
+version 1.11.xx (2015)
+ + Adding fitFeatureModel - a feature based zero-inflated log-normal model.
+ + Added MRcoefs,MRtable,MRfulltable support for fitFeatureModel output.
+ + Added mention in vignette.
+ + Added support for normalizing matrices instead of just MRexperiment objects.
+ + Fixed cumNormStat's non-default qFlag option
+version 1.9.xx (2015)
+ + Added flexibility in formula choice for fitTimeSeries
+ + Added readability in ssPermAnalysis
+ + Fixed default in plotClassTimeSeries (include = c("1",...))
+ + Added fitTimeSeries vignette
+ + Removed interactiveDisplay to namespace - moved to suggests
+ + Fixed ordering of MRtable,MRfulltable first four columns
+ + modified df estimated through responsibilities
+ + renamed fitMeta to fitLogNormal - a more appropriate name
+version 1.7.xx (2014-05-07)
+ + Added function plotBubble
+ + Added parallel (multi-core) options to fitPA, fitDO
+ + Fixed bug for fitMeta when useCSSoffset=FALSE and model matrix ncol==2
+ + (1.7.10) Updated default quantile estimate (.5) for low estimates
+ + (1.7.10) Added short description on how to do multiple group comparisons
+ + (1.7.15) Output of fitZig (eb) is now a result of limma::eBayes instead of limma::ebayes
+ + (1.7.16) plotMRheatmap allows for sorting by any stat (not just sd)
+ + (1.7.18) fitTimeSeries Including times series method for differentially abundant time intervals
+ + (1.7.20) Fixed minor bug for OTU level time series analyses and added plotClassTimeSeries
+ + (1.7.26) Added warning / fix if any samples are empty in cumNormStat
+ + (1.7.27) Added a few unit tests
+ + (1.7.29) Added interactiveDisplay to namespace (display function allows interactive exploration / plots through browser)
+version 1.5.xx (2014-04-17)
+ + Incorporating biom-format support with the biom2MRexperiment, MRexperiment2biom and load_biome function.
+ + Added uniqueFeatures, filterData, aggregateByTaxonomy / aggTax, plotFeature and calculateEffectiveSamples functions.
+ + Renamed MRfisher to fitPA (presence-absence fisher test).
+ + Added warnings for normalization
+ + Added fitDO (Discovery odds ratio test) and fitMeta (original metastats).
+ + Added match.call() info to fitZig output
+ + Fixed missing E-Step bounds
+version 1.2.xx (2013-08-20)
+ + Our paper got accepted and is available!
+ + Added methods for MRexperiment objects (colSums,colMeans,rowSums,rowMeans, usage is for example colSums(obj) or colSums(obj,norm=TRUE)) (09-25)
+ + Added two new functions, plotOrd and plotRare - a function to plot PCA/MDS coordinates and rarefaction effect (09-04,09-18)
+ + Updated MRfisher to include thresholding for presence-absence testing (08-19)
+ + Updated comments (roxygen2) style for all the functions using the Rd2roxygen package (07-13)
+ + Updated plotCorr and plotMRheatmap to allow various colors/not require trials(07-13)
+ + Rewrote vignette (and switched to knitr)
+
+version 1.1.xx (last update 2013-06-25)
+ + Rewrote load_meta and load_metaQ to be faster/use less memory
+ + Modified cumNormStat to remove NA samples from calculations (example would be samples without any counts)
+ + Re-added plotGenus' jitter
+ + Fixed uniqueNames call in the MR tables
+
+ + Changed thanks to Kasper Daniel Hansen's suggestions the following:
+ plotOTU and plotGenus both have much better auto-generated axis
+ MRtable, MRfulltable, MRcoefs have a sort by p-value option now
+ MRtable, MRfulltable, MRcoefs now have an extra option to include unique numbers for OTU features (default would automatically add them previously)
+ cumNorm.R - now returns the object as well - not just replacing the environment
+ 0 Still need to turn the fitZig output to S3, consider subsetting function address low p-values
+
+version 1.0.0: (2013-03-29)
+ + Release!
diff --git a/R/MRcoefs.R b/R/MRcoefs.R
new file mode 100644
index 0000000..40a4f87
--- /dev/null
+++ b/R/MRcoefs.R
@@ -0,0 +1,114 @@
+#' Table of top-ranked features from fitZig or fitFeatureModel
+#'
+#' Extract a table of the top-ranked features from a linear model fit. This
+#' function will be updated soon to provide better flexibility similar to
+#' limma's topTable.
+#'
+#'
+#' @param obj Output of fitFeatureModel or fitZig.
+#' @param by Column number or column name specifying which coefficient or
+#' contrast of the linear model is of interest.
+#' @param coef Column number(s) or column name(s) specifying which coefficient
+#' or contrast of the linear model to display.
+#' @param number The number of bacterial features to pick out.
+#' @param taxa Taxa list.
+#' @param uniqueNames Number the various taxa.
+#' @param adjustMethod Method to adjust p-values by. Default is "FDR". Options
+#' include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+#' "none". See \code{\link{p.adjust}} for more details.
+#' @param group One of five choices, 0,1,2,3,4. 0: the sort is ordered by a
+#' decreasing absolute value coefficient fit. 1: the sort is ordered by the raw
+#' coefficient fit in decreasing order. 2: the sort is ordered by the raw
+#' coefficient fit in increasing order. 3: the sort is ordered by the p-value
+#' of the coefficient fit in increasing order. 4: no sorting.
+#' @param eff Filter features to have at least a "eff" quantile or number of effective samples.
+#' @param numberEff Boolean, whether eff should represent quantile (default/FALSE) or number.
+#' @param counts Filter features to have at least 'counts' counts.
+#' @param file Name of output file, including location, to save the table.
+#' @return Table of the top-ranked features determined by the linear fit's
+#' coefficient.
+#' @seealso \code{\link{fitZig}} \code{\link{fitFeatureModel}} \code{\link{MRtable}} \code{\link{MRfulltable}}
+#' @examples
+#'
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' lungTrim=filterData(lungTrim,present=30)
+#' lungTrim=cumNorm(lungTrim,p=0.5)
+#' smokingStatus = pData(lungTrim)$SmokingStatus
+#' mod = model.matrix(~smokingStatus)
+#' fit = fitZig(obj = lungTrim,mod=mod)
+#' head(MRcoefs(fit))
+#' ####
+#' fit = fitFeatureModel(obj = lungTrim,mod=mod)
+#' head(MRcoefs(fit))
+#'
+MRcoefs<-function(obj,by=2,coef=NULL,number=10,taxa=obj$taxa,
+ uniqueNames=FALSE,adjustMethod="fdr",group=0,eff=0,numberEff=FALSE,counts=0,file=NULL){
+
+ if(length(grep("fitFeatureModel",obj$call))){
+ groups = factor(obj$design[,by])
+ by = "logFC"; coef = 1:2;
+ tb = data.frame(logFC=obj$fitZeroLogNormal$logFC,se=obj$fitZeroLogNormal$se)
+ p = obj$pvalues
+ } else {
+ tb = obj$fit$coefficients
+ if(is.null(coef)){
+ coef = 1:ncol(tb)
+ }
+ p=obj$eb$p.value[,by]
+ groups = factor(obj$fit$design[,by])
+ if(eff>0){
+ effectiveSamples = calculateEffectiveSamples(obj)
+ if(numberEff == FALSE){
+ valid = which(effectiveSamples>=quantile(effectiveSamples,p=eff,na.rm=TRUE))
+ } else {
+ valid = which(effectiveSamples>=eff)
+ }
+ }
+ }
+
+ tx = as.character(taxa)
+ if(uniqueNames==TRUE){
+ for (nm in unique(tx)) {
+ ii=which(tx==nm)
+ tx[ii]=paste(tx[ii],seq_along(ii),sep=":")
+ }
+ }
+ padj = p.adjust(p,method=adjustMethod)
+
+ if(group==0){
+ srt = order(abs(tb[,by]),decreasing=TRUE)
+ } else if(group==1){
+ srt = order((tb[,by]),decreasing=TRUE)
+ } else if(group==2){
+ srt = order((tb[,by]),decreasing=FALSE)
+ } else if(group==3){
+ srt = order(p,decreasing=FALSE)
+ } else {
+ srt = 1:length(padj);
+ }
+
+ valid = 1:length(padj);
+ if(counts>0){
+ np=rowSums(obj$counts);
+ valid = intersect(valid,which(np>=counts));
+ }
+ srt = srt[which(srt%in%valid)][1:min(number,nrow(tb))];
+
+ mat = cbind(tb[,coef],p)
+ mat = cbind(mat,padj)
+ rownames(mat) = tx;
+ mat = mat[srt,]
+
+ nm = c(colnames(tb)[coef],"pvalues","adjPvalues")
+ colnames(mat) = nm
+
+ if(!is.null(file)){
+ nm = c("Taxa",nm)
+ mat2 = cbind(rownames(mat),mat)
+ mat2 = rbind(nm,mat2)
+ write(t(mat2),ncolumns=ncol(mat2),file=file,sep="\t")
+ }
+ return(as.data.frame(mat))
+}
diff --git a/R/MRexperiment2biom.R b/R/MRexperiment2biom.R
new file mode 100644
index 0000000..908bbb8
--- /dev/null
+++ b/R/MRexperiment2biom.R
@@ -0,0 +1,84 @@
+#' MRexperiment to biom objects
+#'
+#' Wrapper to convert MRexperiment objects to biom objects.
+#'
+#' @param obj The MRexperiment object.
+#' @param id Optional id for the biom matrix.
+#' @param norm normalize count table
+#' @param log log2 transform count table
+#' @param sl scaling factor for normalized counts.
+#' @param qiimeVersion Format fData according to QIIME specifications (assumes only taxonomy in fData).
+#' @return A biom object.
+#' @seealso \code{\link{loadMeta}} \code{\link{loadPhenoData}} \code{\link{newMRexperiment}} \code{\link{loadBiom}} \code{\link{biom2MRexperiment}}
+MRexperiment2biom <- function(obj,id=NULL,norm=FALSE,log=FALSE,sl=1000,qiimeVersion=TRUE){
+ requireNamespace("biomformat")
+ id = id
+ format = "Biological Observation Matrix 1.0.0-dev"
+ format_url = "http://biom-format.org/documentation/format_versions/biom-1.0.html"
+ type = "OTU table"
+ generated_by = sprintf("metagenomeSeq %s",packageVersion("metagenomeSeq"))
+ date = as.character(Sys.time())
+ matrix_type = "dense"
+ matrix_element_type = "int"
+ if( (norm==TRUE) | (log == TRUE) ) {
+ matrix_element_type = "float"
+ }
+
+ data = MRcounts(obj,norm=norm,log=log,sl=sl)
+ shape = dim(data)
+
+ rows = metadata(fData(obj),qiimeVersion=qiimeVersion)
+ columns= metadata(pData(obj))
+
+ data = as.list(as.data.frame(t(data)))
+ names(data) <- NULL
+
+ biomlist = list(id=id,format=format,format_url=format_url,type=type,generated_by=generated_by,
+ date=date,matrix_type=matrix_type,matrix_element_type=matrix_element_type,shape=shape,
+ rows=rows,columns=columns,data=data)
+ biomformat::biom(biomlist)
+}
+
+metadata <- function(df,qiimeVersion=FALSE){
+ if(ncol(df)>0){
+ for(i in 1:ncol(df)){
+ df[,i] = as.character(df[,i])
+ }
+ }
+ if(qiimeVersion==TRUE){
+ if(ncol(df)==0){
+ meta = lapply(1:nrow(df),function(i){
+ ll = list(id=rownames(df)[i],metadata=NULL)
+ ll
+ })
+ } else {
+ meta = lapply(1:nrow(df),function(i){
+ ll = list(id=rownames(df)[i],
+ metadata=list("taxonomy" = paste(df[i,])))
+ NAvalues = grep("NA$",ll$metadata$taxonomy)
+ if(length(NAvalues)>0){
+ k = NAvalues[1]
+ ll$metadata$taxonomy = paste(df[i,1:(k-1)])
+ }
+ ll
+ })
+ }
+ return(meta)
+ } else {
+ if(ncol(df)==0){
+ meta = lapply(1:nrow(df),function(i){
+ ll = list(id=rownames(df)[i],metadata=NULL)
+ ll
+ })
+ } else {
+ meta = lapply(1:nrow(df),function(i){
+ ll = list(id=rownames(df)[i],
+ metadata=lapply(1:ncol(df),
+ function(j){as.character(df[i,j])}))
+ names(ll$metadata) = colnames(df)
+ ll
+ })
+ }
+ return(meta)
+ }
+}
diff --git a/R/MRfulltable.R b/R/MRfulltable.R
new file mode 100644
index 0000000..92792c6
--- /dev/null
+++ b/R/MRfulltable.R
@@ -0,0 +1,136 @@
+#' Table of top microbial marker gene from linear model fit including sequence
+#' information
+#'
+#' Extract a table of the top-ranked features from a linear model fit. This
+#' function will be updated soon to provide better flexibility similar to
+#' limma's topTable. This function differs from \code{link{MRcoefs}} in that it
+#' provides other information about the presence or absence of features to help
+#' ensure significant features called are moderately present.
+#'
+#'
+#' @param obj A list containing the linear model fit produced by lmFit through
+#' fitZig.
+#' @param by Column number or column name specifying which coefficient or
+#' contrast of the linear model is of interest.
+#' @param coef Column number(s) or column name(s) specifying which coefficient
+#' or contrast of the linear model to display.
+#' @param number The number of bacterial features to pick out.
+#' @param taxa Taxa list.
+#' @param uniqueNames Number the various taxa.
+#' @param adjustMethod Method to adjust p-values by. Default is "FDR". Options
+#' include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+#' "none". See \code{\link{p.adjust}} for more details.
+#' @param group One of five choices: 0,1,2,3,4. 0: the sort is ordered by a
+#' decreasing absolute value coefficient fit. 1: the sort is ordered by the raw
+#' coefficient fit in decreasing order. 2: the sort is ordered by the raw
+#' coefficient fit in increasing order. 3: the sort is ordered by the p-value
+#' of the coefficient fit in increasing order. 4: no sorting.
+#' @param eff Filter features to have at least a "eff" quantile or number of effective samples.
+#' @param numberEff Boolean, whether eff should represent quantile (default/FALSE) or number.
+#' @param ncounts Filter features to those with at least 'counts' counts.
+#' @param file Name of output file, including location, to save the table.
+#' @return Table of the top-ranked features determined by the linear fit's
+#' coefficient.
+#' @seealso \code{\link{fitZig}} \code{\link{fitFeatureModel}} \code{\link{MRcoefs}} \code{\link{MRtable}}
+#' \code{\link{fitPA}}
+#' @examples
+#'
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' lungTrim=filterData(lungTrim,present=30)
+#' lungTrim=cumNorm(lungTrim,p=0.5)
+#' smokingStatus = pData(lungTrim)$SmokingStatus
+#' mod = model.matrix(~smokingStatus)
+#' fit = fitZig(obj = lungTrim,mod=mod)
+#' # head(MRfulltable(fit))
+#' ####
+#' fit = fitFeatureModel(obj = lungTrim,mod=mod)
+#' # head(MRfulltable(fit))
+#'
+MRfulltable<-function(obj,by=2,coef=NULL,number=10,taxa=obj$taxa,
+ uniqueNames=FALSE,adjustMethod="fdr",group=0,eff=0,numberEff=FALSE,ncounts=0,file=NULL){
+
+ if(length(grep("fitFeatureModel",obj$call))){
+ groups = factor(obj$design[,by])
+ by = "logFC"; coef = 1:2;
+ tb = data.frame(logFC=obj$fitZeroLogNormal$logFC,se=obj$fitZeroLogNormal$se)
+ p = obj$pvalues
+ } else {
+ tb = obj$fit$coefficients
+ if(is.null(coef)){
+ coef = 1:ncol(tb)
+ }
+ p=obj$eb$p.value[,by]
+ groups = factor(obj$fit$design[,by])
+ if(eff>0){
+ effectiveSamples = calculateEffectiveSamples(obj)
+ if(numberEff == FALSE){
+ valid = which(effectiveSamples>=quantile(effectiveSamples,p=eff,na.rm=TRUE))
+ } else {
+ valid = which(effectiveSamples>=eff)
+ }
+ }
+ }
+
+ tx = as.character(taxa)
+ if(uniqueNames==TRUE){
+ for (nm in unique(tx)) {
+ ii=which(tx==nm)
+ tx[ii]=paste(tx[ii],seq_along(ii),sep=":")
+ }
+ }
+ padj = p.adjust(p,method=adjustMethod)
+ cnts = obj$counts
+ yy = cnts>0
+
+ pa = matrix(unlist(fitPA(obj$counts,groups)),ncol=5)
+
+ np0 = rowSums(yy[,groups==0])
+ np1 = rowSums(yy[,groups==1])
+
+ nc0 = rowSums(cnts[,groups==0])
+ nc1 = rowSums(cnts[,groups==1])
+
+ if(group==0){
+ srt = order(abs(tb[,by]),decreasing=TRUE)
+ } else if(group==1){
+ srt = order((tb[,by]),decreasing=TRUE)
+ } else if(group==2){
+ srt = order((tb[,by]),decreasing=FALSE)
+ } else if(group==3){
+ srt = order(p,decreasing=FALSE)
+ } else {
+ srt = 1:length(padj)
+ }
+
+ valid = 1:length(padj)
+ if(ncounts>0){
+ np=rowSums(cbind(np0,np1))
+ valid = intersect(valid,which(np>=ncounts))
+ }
+ srt = srt[which(srt%in%valid)][1:min(number,nrow(tb))]
+
+ mat = cbind(np0,np1)
+ mat = cbind(mat,nc0)
+ mat = cbind(mat,nc1)
+ mat = cbind(mat,pa)
+ mat = cbind(mat,tb[,coef])
+ mat = cbind(mat,p)
+ mat = cbind(mat,padj)
+ rownames(mat) = tx
+ mat = mat[srt,]
+
+ nm = c("+samples in group 0","+samples in group 1","counts in group 0",
+ "counts in group 1",c("oddsRatio","lower","upper","fisherP","fisherAdjP"),
+ colnames(tb)[coef],"pvalues","adjPvalues")
+ colnames(mat) = nm
+
+ if(!is.null(file)){
+ nm = c("Taxa",nm)
+ mat2 = cbind(rownames(mat),mat)
+ mat2 = rbind(nm,mat2)
+ write(t(mat2),ncolumns=ncol(mat2),file=file,sep="\t")
+ }
+ return(as.data.frame(mat))
+}
diff --git a/R/MRtable.R b/R/MRtable.R
new file mode 100644
index 0000000..214ff16
--- /dev/null
+++ b/R/MRtable.R
@@ -0,0 +1,130 @@
+#' Table of top microbial marker gene from linear model fit including sequence
+#' information
+#'
+#' Extract a table of the top-ranked features from a linear model fit. This
+#' function will be updated soon to provide better flexibility similar to
+#' limma's topTable. This function differs from \code{link{MRcoefs}} in that it
+#' provides other information about the presence or absence of features to help
+#' ensure significant features called are moderately present.
+#'
+#'
+#' @param obj Output of fitFeatureModel or fitZig.
+#' @param by Column number or column name specifying which coefficient or
+#' contrast of the linear model is of interest.
+#' @param coef Column number(s) or column name(s) specifying which coefficient
+#' or contrast of the linear model to display.
+#' @param number The number of bacterial features to pick out.
+#' @param taxa Taxa list.
+#' @param uniqueNames Number the various taxa.
+#' @param adjustMethod Method to adjust p-values by. Default is "FDR". Options
+#' include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+#' "none". See \code{\link{p.adjust}} for more details.
+#' @param group One of five choices, 0,1,2,3,4. 0: the sort is ordered by a
+#' decreasing absolute value coefficient fit. 1: the sort is ordered by the raw
+#' coefficient fit in decreasing order. 2: the sort is ordered by the raw
+#' coefficient fit in increasing order. 3: the sort is ordered by the p-value
+#' of the coefficient fit in increasing order. 4: no sorting.
+#' @param eff Filter features to have at least a "eff" quantile or number of effective samples.
+#' @param numberEff Boolean, whether eff should represent quantile (default/FALSE) or number.
+#' @param ncounts Filter features to have at least 'counts' of counts.
+#' @param file Name of file, including location, to save the table.
+#' @return Table of the top-ranked features determined by the linear fit's
+#' coefficient.
+#' @seealso \code{\link{fitZig}} \code{\link{fitFeatureModel}} \code{\link{MRcoefs}} \code{\link{MRfulltable}}
+#' @examples
+#'
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' lungTrim=filterData(lungTrim,present=30)
+#' lungTrim=cumNorm(lungTrim,p=0.5)
+#' smokingStatus = pData(lungTrim)$SmokingStatus
+#' mod = model.matrix(~smokingStatus)
+#' fit = fitZig(obj = lungTrim,mod=mod)
+#' head(MRtable(fit))
+#' ####
+#' fit = fitFeatureModel(obj = lungTrim,mod=mod)
+#' head(MRtable(fit))
+#'
+MRtable<-function(obj,by=2,coef=NULL,number=10,taxa=obj$taxa,
+ uniqueNames=FALSE,adjustMethod="fdr",group=0,eff=0,numberEff=FALSE,ncounts=0,file=NULL){
+
+ if(length(grep("fitFeatureModel",obj$call))){
+ groups = factor(obj$design[,by])
+ by = "logFC"; coef = 1:2;
+ tb = data.frame(logFC=obj$fitZeroLogNormal$logFC,se=obj$fitZeroLogNormal$se)
+ p = obj$pvalues
+ } else {
+ tb = obj$fit$coefficients
+ if(is.null(coef)){
+ coef = 1:ncol(tb)
+ }
+ p=obj$eb$p.value[,by]
+ groups = factor(obj$fit$design[,by])
+ if(eff>0){
+ effectiveSamples = calculateEffectiveSamples(obj)
+ if(numberEff == FALSE){
+ valid = which(effectiveSamples>=quantile(effectiveSamples,p=eff,na.rm=TRUE))
+ } else {
+ valid = which(effectiveSamples>=eff)
+ }
+ }
+ }
+
+ tx = as.character(taxa)
+ if(uniqueNames==TRUE){
+ for (nm in unique(tx)) {
+ ii=which(tx==nm)
+ tx[ii]=paste(tx[ii],seq_along(ii),sep=":")
+ }
+ }
+ padj = p.adjust(p,method=adjustMethod)
+ cnts = obj$counts
+ posIndices = cnts>0
+
+ np0 = rowSums(posIndices[,groups==0])
+ np1 = rowSums(posIndices[,groups==1])
+
+ nc0 = rowSums(cnts[,groups==0])
+ nc1 = rowSums(cnts[,groups==1])
+
+ if(group==0){
+ srt = order(abs(tb[,by]),decreasing=TRUE)
+ } else if(group==1){
+ srt = order((tb[,by]),decreasing=TRUE)
+ } else if(group==2){
+ srt = order((tb[,by]),decreasing=FALSE)
+ } else if(group==3){
+ srt = order(p,decreasing=FALSE)
+ } else {
+ srt = 1:length(padj)
+ }
+
+ valid = 1:length(padj)
+ if(ncounts>0){
+ np=rowSums(cbind(np0,np1))
+ valid = intersect(valid,which(np>=ncounts))
+ }
+ srt = srt[which(srt%in%valid)][1:min(number,nrow(tb))]
+
+ mat = cbind(np0,np1)
+ mat = cbind(mat,nc0)
+ mat = cbind(mat,nc1)
+ mat = cbind(mat,tb[,coef])
+ mat = cbind(mat,p)
+ mat = cbind(mat,padj)
+ rownames(mat) = tx
+ mat = mat[srt,]
+
+ nm = c("+samples in group 0","+samples in group 1","counts in group 0",
+ "counts in group 1",colnames(tb)[coef],"pvalues","adjPvalues")
+ colnames(mat) = nm
+
+ if(!is.null(file)){
+ nm = c("Taxa",nm)
+ mat2 = cbind(rownames(mat),mat)
+ mat2 = rbind(nm,mat2)
+ write(t(mat2),ncolumns=ncol(mat2),file=file,sep="\t")
+ }
+ return(as.data.frame(mat))
+}
diff --git a/R/aggregateBySample.R b/R/aggregateBySample.R
new file mode 100644
index 0000000..be9a9e7
--- /dev/null
+++ b/R/aggregateBySample.R
@@ -0,0 +1,64 @@
+#' Aggregates a MRexperiment object or counts matrix to by a factor.
+#'
+#' Using the phenoData information in the MRexperiment, calling aggregateBySample on a
+#' MRexperiment and a particular phenoData column (i.e. 'diet') will aggregate counts
+#' using the aggfun function (default rowMeans). Possible aggfun alternatives
+#' include rowMeans and rowMedians.
+#'
+#' @param obj A MRexperiment object or count matrix.
+#' @param fct phenoData column name from the MRexperiment object or if count matrix object a vector of labels.
+#' @param aggfun Aggregation function.
+#' @param out Either 'MRexperiment' or 'matrix'
+#' @return An aggregated count matrix or MRexperiment object where the new pData is a vector of `fct` levels.
+#' @aliases aggSamp
+#' @rdname aggregateBySample
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' aggregateBySample(mouseData[1:100,],fct="diet",aggfun=rowSums)
+#' # not run
+#' # aggregateBySample(mouseData,fct="diet",aggfun=matrixStats::rowMedians)
+#' # aggSamp(mouseData,fct='diet',aggfun=rowMaxs)
+#'
+aggregateBySample<-function(obj,fct,aggfun=rowMeans,out="MRexperiment"){
+ if(class(obj)=="MRexperiment"){
+ mat = MRcounts(obj)
+ if(length(fct)==1) factors = as.character(pData(obj)[,fct])
+ else factors = as.character(fct)
+ } else {
+ mat = obj
+ factors = as.character(fct)
+ if(length(factors)!=ncol(mat)) stop("If input is a count matrix, fct must be a vector of length = ncol(count matrix)")
+ }
+ if(!(out%in%c("MRexperiment","matrix"))){
+ stop("The variable out must either be 'MRexperiment' or 'matrix'")
+ }
+ grps = split(seq_along(factors),factors)
+
+ newMat = array(NA,dim=c(nrow(obj),length(grps)))
+ for(i in seq_along(grps)){
+ newMat[,i] = aggfun(mat[,grps[[i]],drop=FALSE])
+ }
+ colnames(newMat) = names(grps)
+ rownames(newMat) = rownames(obj)
+ if(out=='matrix') return(newMat)
+ if(out=='MRexperiment'){
+ pd = data.frame(names(grps))
+ colnames(pd) = "phenoData"
+ rownames(pd) = names(grps)
+ pd = as(pd,"AnnotatedDataFrame")
+ if(class(obj)=="MRexperiment"){
+ fd = as(fData(obj),"AnnotatedDataFrame")
+ newObj = newMRexperiment(newMat,featureData=fd,phenoData=pd)
+ } else {
+ newObj = newMRexperiment(newMat,phenoData=pd)
+ }
+ return(newObj)
+ }
+}
+#' @rdname aggregateBySample
+#' @export
+aggSamp<-function(obj,fct,aggfun=rowMeans,out='MRexperiment'){
+ aggregateBySample(obj,fct,aggfun=aggfun,out=out)
+}
diff --git a/R/aggregateByTaxonomy.R b/R/aggregateByTaxonomy.R
new file mode 100644
index 0000000..ffc4645
--- /dev/null
+++ b/R/aggregateByTaxonomy.R
@@ -0,0 +1,77 @@
+#' Aggregates a MRexperiment object or counts matrix to a particular level.
+#'
+#' Using the featureData information in the MRexperiment, calling aggregateByTaxonomy on a
+#' MRexperiment and a particular featureData column (i.e. 'genus') will aggregate counts
+#' to the desired level using the aggfun function (default colSums). Possible aggfun alternatives
+#' include colMeans and colMedians.
+#'
+#' @param obj A MRexperiment object or count matrix.
+#' @param lvl featureData column name from the MRexperiment object or if count matrix object a vector of labels.
+#' @param alternate Use the rowname for undefined OTUs instead of aggregating to "no_match".
+#' @param norm Whether to aggregate normalized counts or not.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param aggfun Aggregation function.
+#' @param sl scaling value, default is 1000.
+#' @param out Either 'MRexperiment' or 'matrix'
+#' @return An aggregated count matrix.
+#' @aliases aggTax
+#' @rdname aggregateByTaxonomy
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' aggregateByTaxonomy(mouseData[1:100,],lvl="class",norm=TRUE,aggfun=colSums)
+#' # not run
+#' # aggregateByTaxonomy(mouseData,lvl="class",norm=TRUE,aggfun=colMedians)
+#' # aggTax(mouseData,lvl='phylum',norm=FALSE,aggfun=colSums)
+#'
+aggregateByTaxonomy<-function(obj,lvl,alternate=FALSE,norm=FALSE,log=FALSE,aggfun = colSums,sl=1000,out="MRexperiment"){
+ if(class(obj)=="MRexperiment"){
+ mat = MRcounts(obj,norm=norm,log=log,sl=sl)
+ if(length(lvl)==1) levels = as.character(fData(obj)[,lvl])
+ else levels = as.character(lvl)
+ } else {
+ mat = obj
+ levels = as.character(lvl)
+ if(length(levels)!=nrow(mat)) stop("If input is a count matrix, lvl must be a vector of length = nrow(count matrix)")
+ }
+ if(!(out%in%c("MRexperiment","matrix"))){
+ stop("The variable out must either be 'MRexperiment' or 'matrix'")
+ }
+
+ nafeatures = is.na(levels)
+ if(length(nafeatures)>0){
+ if(alternate==FALSE){
+ levels[nafeatures] = "no_match"
+ } else {
+ levels[nafeatures] = paste("OTU_",rownames(obj)[nafeatures],sep="")
+ }
+ }
+ grps = split(seq_along(levels),levels)
+
+ newMat = array(NA,dim=c(length(grps),ncol(obj)))
+ for(i in seq_along(grps)){
+ newMat[i,] = aggfun(mat[grps[[i]],,drop=FALSE])
+ }
+ rownames(newMat) = names(grps)
+ colnames(newMat) = colnames(obj)
+ if(out=='matrix') return(newMat)
+ if(out=='MRexperiment'){
+ taxa = data.frame(names(grps))
+ colnames(taxa) = "Taxa"
+ rownames(taxa) = names(grps)
+ taxa = as(taxa,"AnnotatedDataFrame")
+ if(class(obj)=="MRexperiment"){
+ pd = phenoData(obj)
+ newObj = newMRexperiment(newMat,featureData=taxa,phenoData=pd)
+ } else {
+ newObj = newMRexperiment(newMat,featureData=taxa)
+ }
+ return(newObj)
+ }
+}
+#' @rdname aggregateByTaxonomy
+#' @export
+aggTax<-function(obj,lvl,alternate=FALSE,norm=FALSE,log=FALSE,aggfun = colSums,sl=1000,out='MRexperiment'){
+ aggregateByTaxonomy(obj,lvl,alternate=alternate,norm=norm,log=log,aggfun = aggfun,sl=sl,out=out)
+}
diff --git a/R/allClasses.R b/R/allClasses.R
new file mode 100644
index 0000000..1d0fe7e
--- /dev/null
+++ b/R/allClasses.R
@@ -0,0 +1,308 @@
+setClass("MRexperiment", contains=c("eSet"), representation=representation(expSummary = "environment"),prototype = prototype( new( "VersionedBiobase",versions = c(classVersion("eSet"),MRexperiment = "1.0.0" ))))
+
+setMethod("[", "MRexperiment", function (x, i, j, ..., drop = FALSE) {
+ obj= callNextMethod()
+ if(!missing(j)){
+ obj at expSummary = new("environment",expSummary=as(expSummary(x)[j,1:2,...,drop=drop],"AnnotatedDataFrame"),cumNormStat=x at expSummary$cumNormStat)
+ if(length(pData(obj))>0){
+ for(i in 1:length(pData(obj))){
+ if(is.factor(pData(obj)[,i])){
+ pData(obj)[,i] = factor(pData(obj)[,i])
+ } else {
+ pData(obj)[,i] = pData(obj)[,i]
+ }
+ }
+ }
+ }
+ obj
+})
+setMethod("colSums", signature ="MRexperiment", function (x, ...) {
+ callNextMethod(MRcounts(x),...)
+})
+setMethod("rowSums", signature="MRexperiment", function (x, ...) {
+ callNextMethod(MRcounts(x),...)
+})
+setMethod("rowMeans", signature="MRexperiment", function (x, ...) {
+ callNextMethod(MRcounts(x),...)
+})
+setMethod("colMeans", signature="MRexperiment", function (x, ...) {
+ callNextMethod(MRcounts(x),...)
+})
+
+#' Access the normalization factors in a MRexperiment object
+#'
+#' Function to access the scaling factors, aka the normalization factors, of
+#' samples in a MRexperiment object.
+#'
+#' @name normFactors
+#' @docType methods
+#' @param object a \code{MRexperiment} object
+#' @return Normalization scaling factors
+#' @author Joseph N. Paulson
+#' @examples
+#'
+#' data(lungData)
+#' head(normFactors(lungData))
+#'
+setGeneric("normFactors",function(object){standardGeneric("normFactors")})
+setGeneric("normFactors<-",function(object,value){standardGeneric("normFactors<-")})
+
+setMethod("normFactors", signature="MRexperiment",function(object) {
+ nf <- expSummary(object)$normFactors
+ nf <- unlist(nf)
+ names(nf) <- sampleNames(object)
+ nf
+ })
+
+#' Replace the normalization factors in a MRexperiment object
+#'
+#' Function to replace the scaling factors, aka the normalization factors, of
+#' samples in a MRexperiment object.
+#'
+#' @name normFactors<-
+#' @docType methods
+#' @aliases normFactors<-,MRexperiment,numeric-method normFactors<-
+#' @param object a \code{MRexperiment} object
+#' @param value vector of normalization scaling factors
+#' @return Normalization scaling factors
+#' @author Joseph N. Paulson
+#' @examples
+#'
+#' data(lungData)
+#' head(normFactors(lungData)<- rnorm(1))
+#'
+setReplaceMethod("normFactors", signature=c(object="MRexperiment", value="numeric"),
+ function( object, value ) {
+ pData(object at expSummary$expSummary)$normFactors <- value
+ validObject( object )
+ object
+})
+
+#' Access sample depth of coverage from MRexperiment object
+#'
+#' Access the libSize vector represents the column (sample specific) sums of features,
+#' i.e. the total number of reads for a sample or depth of coverage. It is used by
+#' \code{\link{fitZig}}.
+#'
+#' @name libSize
+#' @docType methods
+#' @param object a \code{MRexperiment} object
+#' @return Library sizes
+#' @author Joseph N. Paulson
+#' @examples
+#'
+#' data(lungData)
+#' head(libSize(lungData))
+#'
+setGeneric("libSize",function(object){standardGeneric("libSize")})
+setGeneric("libSize<-",function(object,value){standardGeneric("libSize<-")})
+
+setMethod("libSize", signature="MRexperiment",function(object) {
+ ls <- expSummary(object)$libSize
+ ls <- unlist(ls)
+ names(ls) <- sampleNames(object)
+ ls
+ })
+
+#' Replace the library sizes in a MRexperiment object
+#'
+#' Function to replace the scaling factors, aka the library sizes, of
+#' samples in a MRexperiment object.
+#'
+#' @name libSize<-
+#' @docType methods
+#' @aliases libSize<-,MRexperiment,numeric-method libSize<-
+#' @param object a \code{MRexperiment} object
+#' @param value vector of library sizes
+#' @return vector library sizes
+#' @author Joseph N. Paulson
+#' @examples
+#'
+#' data(lungData)
+#' head(libSize(lungData)<- rnorm(1))
+#'
+setReplaceMethod("libSize", signature=c(object="MRexperiment", value="numeric"),
+ function( object, value ) {
+ pData(object at expSummary$expSummary)$libSize <- value
+ validObject( object )
+ object
+})
+
+#' Create a MRexperiment object
+#'
+#' This function creates a MRexperiment object from a matrix or data frame of
+#' count data.
+#'
+#' See \code{\link{MRexperiment-class}} and \code{eSet} (from the Biobase
+#' package) for the meaning of the various slots.
+#'
+#' @param counts A matrix or data frame of count data. The count data is
+#' representative of the number of reads annotated for a feature (be it gene,
+#' OTU, species, etc). Rows should correspond to features and columns to
+#' samples.
+#' @param phenoData An AnnotatedDataFrame with pertinent sample information.
+#' @param featureData An AnnotatedDataFrame with pertinent feature information.
+#' @param libSize libSize, library size, is the total number of reads for a
+#' particular sample.
+#' @param normFactors normFactors, the normalization factors used in either the
+#' model or as scaling factors of sample counts for each particular sample.
+#' @return an object of class MRexperiment
+#' @author Joseph N Paulson
+#' @examples
+#'
+#' cnts = matrix(abs(rnorm(1000)),nc=10)
+#' obj <- newMRexperiment(cnts)
+#'
+newMRexperiment <- function(counts, phenoData=NULL, featureData=NULL,libSize=NULL, normFactors=NULL) {
+ counts= as.matrix(counts)
+
+ if( is.null( featureData ) ){
+ featureData <- annotatedDataFrameFrom(counts, byrow=TRUE)
+ }
+ if( is.null( phenoData ) ){
+ phenoData <- annotatedDataFrameFrom(counts, byrow=FALSE)
+ }
+ if( is.null( libSize ) ){
+ libSize <- as.matrix(colSums(counts))
+ rownames(libSize) = colnames(counts)
+ }
+ if( is.null( normFactors ) ){
+ normFactors <- as.matrix(rep( NA_real_, length(libSize) ))
+ rownames(normFactors) = rownames(libSize)
+ }
+
+ obj <-new("MRexperiment", assayData = assayDataNew("environment",counts=counts),phenoData = phenoData,featureData = featureData ,expSummary = new("environment",expSummary=annotatedDataFrameFrom(counts,byrow=FALSE),cumNormStat=NULL))
+ obj at expSummary$expSummary$libSize = libSize;
+ obj at expSummary$expSummary$normFactors=normFactors;
+ validObject(obj)
+ obj
+}
+setValidity( "MRexperiment", function( object ) {
+ if( is.null(assayData(object)$counts))
+ return( "There are no counts!" )
+# if( ncol(MRcounts(object)) != length(normFactors(object)))
+# return( "Experiment summary got hacked!" )
+# if( ncol(MRcounts(object)) != length(libSize(object)))
+# return( "Experiment summary got hacked!" )
+ TRUE
+} )
+#' Accessor for the counts slot of a MRexperiment object
+#'
+#' The counts slot holds the raw count data representing (along the rows) the
+#' number of reads annotated for a particular feature and (along the columns)
+#' the sample.
+#'
+#'
+#' @name MRcounts
+#' @aliases MRcounts,MRexperiment-method MRcounts
+#' @docType methods
+#' @param obj a \code{MRexperiment} object.
+#' @param norm logical indicating whether or not to return normalized counts.
+#' @param log TRUE/FALSE whether or not to log2 transform scale.
+#' @param sl The value to scale by (default=1000).
+#' @return Normalized or raw counts
+#' @author Joseph N. Paulson, jpaulson@@umiacs.umd.edu
+#' @examples
+#'
+#' data(lungData)
+#' head(MRcounts(lungData))
+#'
+MRcounts <- function(obj,norm=FALSE,log=FALSE,sl=1000) {
+ stopifnot( is( obj, "MRexperiment" ) )
+ if(!norm){
+ x=assayData(obj)[["counts"]]
+ }
+ else{
+ if(any(is.na(normFactors(obj)))){
+ x=cumNormMat(obj,sl=sl)
+ } else{
+ x=sweep(assayData(obj)[["counts"]],2,as.vector(unlist(normFactors(obj)))/sl,"/")
+ }
+ }
+ if(!log){
+ return(x)
+ } else{
+ return(log2(x+1))
+ }
+}
+#' Access the posterior probabilities that results from analysis
+#'
+#' Accessing the posterior probabilities following a run through
+#' \code{\link{fitZig}}
+#'
+#'
+#' @name posteriorProbs
+#' @aliases posteriorProbs,MRexperiment-method posteriorProbs
+#' @docType methods
+#' @param obj a \code{MRexperiment} object.
+#' @return Matrix of posterior probabilities
+#' @author Joseph N. Paulson
+#' @examples
+#'
+#' # This is a simple demonstration
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' k = which(rowSums(MRcounts(lungTrim)>0)<30)
+#' lungTrim = cumNorm(lungTrim)
+#' lungTrim = lungTrim[-k,]
+#' smokingStatus = pData(lungTrim)$SmokingStatus
+#' mod = model.matrix(~smokingStatus)
+#' # The maxit is not meant to be 1 - this is for demonstration/speed
+#' settings = zigControl(maxit=1,verbose=FALSE)
+#' fit = fitZig(obj = lungTrim,mod=mod,control=settings)
+#' head(posteriorProbs(lungTrim))
+#'
+posteriorProbs <- function( obj ) {
+ stopifnot( is( obj, "MRexperiment" ) )
+ assayData(obj)[["z"]]
+}
+
+#' Access MRexperiment object experiment data
+#'
+#' The expSummary vectors represent the column (sample specific) sums of
+#' features, i.e. the total number of reads for a sample, libSize and also the
+#' normalization factors, normFactor.
+#'
+#'
+#' @name expSummary
+#' @aliases expSummary,MRexperiment-method expSummary
+#' @docType methods
+#' @param obj a \code{MRexperiment} object.
+#' @return Experiment summary table
+#' @author Joseph N. Paulson, jpaulson@@umiacs.umd.edu
+#' @examples
+#'
+#' data(mouseData)
+#' expSummary(mouseData)
+#'
+expSummary<-function(obj){
+ stopifnot( is( obj, "MRexperiment" ) )
+ pData(obj at expSummary$expSummary)
+}
+#' Check if MRexperiment or matrix and return matrix
+#'
+#' Function to check if object is a MRexperiment
+#' class or matrix
+#'
+#' @name returnAppropriateObj
+#' @param obj a \code{MRexperiment} or \code{matrix} object
+#' @param norm return a normalized \code{MRexperiment} matrix
+#' @param log return a log transformed \code{MRexperiment} matrix
+#' @param sl scaling value
+#' @return Matrix
+#' @examples
+#'
+#' data(lungData)
+#' head(returnAppropriateObj(lungData,norm=FALSE,log=FALSE))
+#'
+returnAppropriateObj <- function(obj,norm,log,sl=1000) {
+ if(class(obj)=="MRexperiment"){
+ mat = MRcounts(obj,norm=norm,log=log,sl=sl)
+ } else if(class(obj) == "matrix") {
+ mat = obj
+ } else {
+ stop("Object needs to be either a MRexperiment object or matrix")
+ }
+ mat
+}
diff --git a/R/biom2MRexperiment.R b/R/biom2MRexperiment.R
new file mode 100644
index 0000000..d931865
--- /dev/null
+++ b/R/biom2MRexperiment.R
@@ -0,0 +1,41 @@
+#' Biom to MRexperiment objects
+#'
+#' Wrapper to convert biom files to MRexperiment objects.
+#'
+#' @param obj The biom object file.
+#' @return A MRexperiment object.
+#' @seealso \code{\link{loadMeta}} \code{\link{loadPhenoData}} \code{\link{newMRexperiment}} \code{\link{loadBiom}}
+#' @examples
+#'
+#' library(biomformat)
+#' rich_dense_file = system.file("extdata", "rich_dense_otu_table.biom", package = "biomformat")
+#' x = biomformat::read_biom(rich_dense_file)
+#' biom2MRexperiment(x)
+#'
+biom2MRexperiment <- function(obj){
+ requireNamespace("biomformat")
+ mat = as(biomformat::biom_data(obj),"matrix")
+
+ if(! is.null(biomformat::observation_metadata(obj))){
+ len = max(sapply(biomformat::observation_metadata(obj),length))
+ taxa = as.matrix(sapply(biomformat::observation_metadata(obj),function(i){ i[1:len]}))
+
+ if(dim(taxa)[1]!=dim(mat)[1]){
+ taxa = t(taxa)
+ }
+ rownames(taxa) = rownames(mat)
+ colnames(taxa) = colnames(biomformat::observation_metadata(obj))
+ taxa = as(data.frame(taxa),"AnnotatedDataFrame")
+ } else{
+ taxa = NULL
+ }
+
+ if(! is.null(biomformat::sample_metadata(obj))) {
+ pd = as(biomformat::sample_metadata(obj),"AnnotatedDataFrame")
+ } else{
+ pd = NULL
+ }
+
+ mrobj = newMRexperiment(counts = mat, phenoData = pd, featureData = taxa)
+ return(mrobj)
+}
diff --git a/R/calculateEffectiveSamples.R b/R/calculateEffectiveSamples.R
new file mode 100644
index 0000000..fe20d29
--- /dev/null
+++ b/R/calculateEffectiveSamples.R
@@ -0,0 +1,14 @@
+#' Estimated effective samples per feature
+#'
+#' Calculates the number of estimated effective samples per feature from the output
+#' of a fitZig run. The estimated effective samples per feature is calculated as the
+#' sum_1^n (n = number of samples) 1-z_i where z_i is the posterior probability a feature
+#' belongs to the technical distribution.
+#'
+#' @param obj The output of fitZig run on a MRexperiment object.
+#' @return A list of the estimated effective samples per feature.
+#' @seealso \code{\link{fitZig}} \code{\link{MRcoefs}} \code{\link{MRfulltable}}
+#'
+calculateEffectiveSamples<-function(obj){
+ rowSums(1-obj$z)
+}
diff --git a/R/correlationTest.R b/R/correlationTest.R
new file mode 100644
index 0000000..37098b7
--- /dev/null
+++ b/R/correlationTest.R
@@ -0,0 +1,119 @@
+#' Correlation of each row of a matrix or MRexperiment object
+#'
+#' Calculates the (pairwise) correlation statistics and associated p-values of a matrix
+#' or the correlation of each row with a vector.
+#'
+#' @param obj A MRexperiment object or count matrix.
+#' @param y Vector of length ncol(obj) to compare to.
+#' @param method One of 'pearson','spearman', or 'kendall'.
+#' @param alternative Indicates the alternative hypothesis and must be one of 'two.sided', 'greater' (positive) or 'less'(negative). You can specify just the initial letter.
+#' @param norm Whether to aggregate normalized counts or not - if MRexperiment object.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param cores Number of cores to use.
+#' @param override If the number of rows to test is over a thousand the test will not commence (unless override==TRUE).
+#' @param ... Extra parameters for mclapply.
+#' @return A matrix of size choose(number of rows, 2) by 2. The first column corresponds to the correlation value. The second column the p-value.
+#' @seealso \code{\link{correctIndices}}
+#' @aliases corTest
+#' @export
+#' @examples
+#'
+#' # Pairwise correlation of raw counts
+#' data(mouseData)
+#' cors = correlationTest(mouseData[1:10,],norm=FALSE,log=FALSE)
+#' head(cors)
+#'
+#' mat = MRcounts(mouseData)[1:10,]
+#' cormat = as.matrix(dist(mat)) # Creating a matrix
+#' cormat[cormat>0] = 0 # Creating an empty matrix
+#' ind = correctIndices(nrow(mat))
+#' cormat[upper.tri(cormat)][ind] = cors[,1]
+#' table(cormat[1,-1] - cors[1:9,1])
+#'
+#' # Correlation of raw counts with a vector (library size in this case)
+#' data(mouseData)
+#' cors = correlationTest(mouseData[1:10,],libSize(mouseData),norm=FALSE,log=FALSE)
+#' head(cors)
+#'
+correlationTest <- function(obj,y=NULL,method="pearson",alternative="two.sided",norm=TRUE,log=TRUE,cores=1,override=FALSE,...){
+ mat = returnAppropriateObj(obj,norm,log)
+ nr = nrow(mat)
+ if(nr > 1000){
+ if(override){
+ show("Good luck! This might take some time.")
+ } else {
+ stop("Many features being considered - to proceed set override to TRUE")
+ }
+ }
+ if(is.null(rownames(mat))){
+ nm = as.character(1:nr)
+ } else {
+ nm = rownames(mat)
+ }
+ if(is.null(y)){
+ corrAndP = mclapply(1:(nr-1),function(i){
+ vals =(i+1):nr
+ cp = array(NA,dim=c(length(vals),2))
+ rownames(cp) = paste(nm[i],nm[(i+1):nr],sep="-")
+ colnames(cp) = c("correlation","pvalue")
+ for(j in (i+1):nr){
+ x = as.numeric(mat[i,])
+ y = as.numeric(mat[j,])
+ res = cor.test(x,y,method=method,
+ alternative=alternative)
+ cp[j-i,1] = res$estimate
+ cp[j-i,2] = res$p.value
+ }
+ cp
+ },mc.cores=cores,...)
+ } else {
+ corrAndP = mclapply(1:nr,function(i){
+ res = cor.test(mat[i,],y,method=method,
+ alternative=alternative)
+ cbind(res$estimate,res$p.value)
+ },mc.cores=cores,...)
+ }
+ correlation = unlist(sapply(corrAndP,function(i){i[,1]}))
+ p = unlist(sapply(corrAndP,function(i){i[,2]}))
+ results = cbind(correlation,p)
+ if(is.null(y)) rownames(results)[nrow(results)] = rownames(corrAndP[[nr-1]])
+ if(!is.null(y)) rownames(results) = rownames(obj)
+
+ return(results)
+}
+#' Calculate the correct indices for the output of correlationTest
+#'
+#' Consider the upper triangular portion of a matrix of size nxn. Results from the \code{correlationTest} are output
+#' as the combination of two vectors, correlation statistic and p-values. The order of the output is 1vs2, 1vs3, 1vs4, etc.
+#' The correctIndices returns the correct indices to fill a correlation matrix or correlation-pvalue matrix.
+#'
+#' @param n The number of features compared by correlationTest (nrow(mat)).
+#' @return A vector of the indices for an upper triangular matrix.
+#' @seealso \code{\link{correlationTest}}
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' mat = MRcounts(mouseData)[55:60,]
+#' cors = correlationTest(mat)
+#' ind = correctIndices(nrow(mat))
+#'
+#' cormat = as.matrix(dist(mat))
+#' cormat[cormat>0] = 0
+#' cormat[upper.tri(cormat)][ind] = cors[,1]
+#' table(cormat[1,-1] - cors[1:5,1])
+#'
+correctIndices <- function(n){
+ if(n==1){
+ return(1)
+ }
+ if(n==2){
+ return(c(1,2))
+ }
+ seq1 <- cumsum(1:(n-1)) - c(0,1:(n-2))
+ seq2 <- sapply(1:(n-2),function(i) {
+ seq1[-c(1:i)]+1*i
+ })
+ seq <- c(seq1,unlist(seq2))
+ return(seq)
+}
\ No newline at end of file
diff --git a/R/cumNorm.R b/R/cumNorm.R
new file mode 100644
index 0000000..b90691b
--- /dev/null
+++ b/R/cumNorm.R
@@ -0,0 +1,53 @@
+#' Cumulative sum scaling normalization
+#'
+#' Calculates each column's quantile and calculates the sum up to and including
+#' that quantile.
+#'
+#' @param obj An MRexperiment object.
+#' @param p The pth quantile.
+#' @return Object with the normalization factors stored as
+#' a vector of the sum up to and including a sample's pth quantile.
+#' @seealso \code{\link{fitZig}} \code{\link{cumNormStat}}
+#' @examples
+#'
+#' data(mouseData)
+#' cumNorm(mouseData)
+#' head(normFactors(mouseData))
+#'
+cumNorm <- function(obj,p=cumNormStatFast(obj)){
+ if(class(obj)=="MRexperiment"){
+ x = MRcounts(obj,norm=FALSE,log=FALSE)
+ } else {
+ stop("Object needs to be a MRexperiment object")
+ }
+ normFactors = calcNormFactors(obj=x,p=p)
+ pData(obj at expSummary$expSummary)$normFactors = normFactors
+ validObject(obj)
+ return(obj)
+}
+
+#' Cumulative sum scaling (css) normalization factors
+#'
+#' Return a vector of the the sum up to and including a quantile.
+#'
+#' @param obj An MRexperiment object or matrix.
+#' @param p The pth quantile.
+#' @return Vector of the sum up to and including a sample's pth quantile.
+#' @seealso \code{\link{fitZig}} \code{\link{cumNormStatFast}} \code{\link{cumNorm}}
+#' @examples
+#'
+#' data(mouseData)
+#' head(calcNormFactors(mouseData))
+#'
+calcNormFactors <- function(obj,p=cumNormStatFast(obj)){
+ x = returnAppropriateObj(obj,norm=FALSE,log=FALSE)
+ xx = x
+ xx[x == 0] <- NA
+ qs = colQuantiles(xx, probs = p, na.rm = TRUE)
+ normFactors <- sapply(1:ncol(xx), function(i) {
+ xx = (x[, i] - .Machine$double.eps)
+ sum(xx[xx <= qs[i]])
+ })
+ names(normFactors)<-colnames(x)
+ as.data.frame(normFactors)
+}
diff --git a/R/cumNormMat.R b/R/cumNormMat.R
new file mode 100644
index 0000000..0bc43df
--- /dev/null
+++ b/R/cumNormMat.R
@@ -0,0 +1,37 @@
+#' Cumulative sum scaling factors.
+#'
+#' Calculates each column's quantile and calculates the sum up to and including
+#' that quantile.
+#'
+#'
+#' @param obj A matrix or MRexperiment object.
+#' @param p The pth quantile.
+#' @param sl The value to scale by (default=1000).
+#' @return Returns a matrix normalized by scaling counts up to and including
+#' the pth quantile.
+#' @seealso \code{\link{fitZig}} \code{\link{cumNorm}}
+#' @examples
+#'
+#' data(mouseData)
+#' head(cumNormMat(mouseData))
+#'
+cumNormMat <-
+function(obj,p= cumNormStatFast(obj),sl = 1000){
+####################################################################################
+# Calculates each column's quantile
+# and calculated the sum up to and
+# including that quantile.
+####################################################################################
+ x = returnAppropriateObj(obj,FALSE,FALSE)
+ xx=x
+ xx[x==0] <- NA
+
+ qs=colQuantiles(xx,probs=p,na.rm=TRUE)
+
+ newMat<-sapply(1:ncol(xx), function(i) {
+ xx=(x[,i]-.Machine$double.eps)
+ sum(xx[xx<=qs[i]])
+ })
+ nmat<-sweep(x,2,newMat/sl,"/")
+ return(nmat)
+}
diff --git a/R/cumNormStat.R b/R/cumNormStat.R
new file mode 100644
index 0000000..3905e6a
--- /dev/null
+++ b/R/cumNormStat.R
@@ -0,0 +1,63 @@
+#' Cumulative sum scaling percentile selection
+#'
+#' Calculates the percentile for which to sum counts up to and scale by.
+#' cumNormStat might be deprecated one day. Deviates from methods in Nature Methods paper
+#' by making use row means for generating reference.
+#'
+#' @param obj A matrix or MRexperiment object.
+#' @param qFlag Flag to either calculate the proper percentile using
+#' R's step-wise quantile function or approximate function.
+#' @param pFlag Plot the relative difference of the median deviance from the reference.
+#' @param rel Cutoff for the relative difference from one median difference
+#' from the reference to the next
+#' @param ... Applicable if pFlag == TRUE. Additional plotting parameters.
+#' @return Percentile for which to scale data
+#' @seealso \code{\link{fitZig}} \code{\link{cumNorm}} \code{\link{cumNormStatFast}}
+#' @examples
+#'
+#' data(mouseData)
+#' p = round(cumNormStat(mouseData,pFlag=FALSE),digits=2)
+#'
+cumNormStat <-
+function(obj,qFlag = TRUE,pFlag = FALSE,rel=.1,...){
+ mat = returnAppropriateObj(obj,FALSE,FALSE)
+ if(any(colSums(mat)==0)) stop("Warning empty sample")
+
+ smat = sapply(1:ncol(mat),function(i){sort(mat[,i],decreasing=FALSE)})
+ ref = rowMeans(smat);
+
+ yy = mat;
+ yy[yy==0]=NA;
+
+ ncols = ncol(mat);
+ refS = sort(ref);
+
+ k = which(refS>0)[1]
+ lo = (length(refS)-k+1)
+
+ if(qFlag == TRUE){
+ diffr = sapply(1:ncols,function(i){
+ refS[k:length(refS)] - quantile(yy[,i],p=seq(0,1,length.out=lo),na.rm=TRUE)
+ })
+ }
+ if(qFlag == FALSE){
+ diffr = sapply(1:ncols,function(i){
+ refS[k:length(refS)] - approx(sort(yy[,i],decreasing=FALSE),n=lo)$y
+ })
+ }
+ diffr2 = matrixStats::rowMedians(abs(diffr),na.rm=TRUE)
+ if(pFlag ==TRUE){
+ plot(abs(diff(diffr2[diffr2>0]))/diffr2[diffr2>0][-1],type="h",ylab="Relative difference for reference",xaxt="n",...)
+ abline(h=rel)
+ axis(1,at=seq(0,length(diffr2),length.out=5),labels = seq(0,1,length.out=5))
+ }
+ x = which(abs(diff(diffr2))/diffr2[-1]>rel)[1] / length(diffr2)
+ if(x<=0.50){
+ message("Default value being used.")
+ x = 0.50
+ }
+ if(class(obj)=="MRexperiment"){
+ obj at expSummary$cumNormStat = x;
+ }
+ return(x)
+}
diff --git a/R/cumNormStatFast.R b/R/cumNormStatFast.R
new file mode 100644
index 0000000..32c7cc6
--- /dev/null
+++ b/R/cumNormStatFast.R
@@ -0,0 +1,57 @@
+#' Cumulative sum scaling percentile selection
+#'
+#' Calculates the percentile for which to sum counts up to and scale by. Faster
+#' version than available in cumNormStat. Deviates from methods described in Nature Methods by
+#' making use of ro means for reference.
+#'
+#' @param obj A matrix or MRexperiment object.
+#' @param pFlag Plot the median difference quantiles.
+#' @param rel Cutoff for the relative difference from one median difference
+#' from the reference to the next.
+#' @param ... Applicable if pFlag == TRUE. Additional plotting parameters.
+#' @return Percentile for which to scale data
+#' @seealso \code{\link{fitZig}} \code{\link{cumNorm}} \code{\link{cumNormStat}}
+#' @examples
+#'
+#' data(mouseData)
+#' p = round(cumNormStatFast(mouseData,pFlag=FALSE),digits=2)
+#'
+cumNormStatFast <-function(obj,pFlag = FALSE,rel=.1,...){
+ mat = returnAppropriateObj(obj,FALSE,FALSE)
+ smat = lapply(1:ncol(mat), function(i) {
+ sort(mat[which(mat[, i]>0),i], decreasing = TRUE)
+ })
+ leng = max(sapply(smat,length))
+ if(any(sapply(smat,length)==1)) stop("Warning sample with one or zero features")
+
+ smat2 = array(NA,dim=c(leng,ncol(mat)))
+ for(i in 1:ncol(mat)){
+ smat2[leng:(leng-length(smat[[i]])+1),i] = smat[[i]]
+ }
+
+ rmat2 = sapply(1:ncol(smat2),function(i){
+ quantile(smat2[,i],p=seq(0,1,length.out=nrow(smat2)),na.rm=TRUE)
+ })
+ smat2[is.na(smat2)] = 0
+ ref1 = rowMeans(smat2)
+
+ ncols = ncol(rmat2)
+ diffr = sapply(1:ncols, function(i) {
+ ref1 - rmat2[,i]
+ })
+ diffr1=matrixStats::rowMedians(abs(diffr))
+ if(pFlag==TRUE){
+ plot(abs(diff(diffr1))/diffr1[-1],type="h",...)
+ abline(h=rel)
+ axis(1,at=seq(0,length(diffr1),length.out=5),labels = seq(0,1,length.out=5))
+ }
+ x= which(abs(diff(diffr1))/diffr1[-1] > rel)[1]/length(diffr1)
+ if(x<=0.50){
+ message("Default value being used.")
+ x = 0.50
+ }
+ if(class(obj)=="MRexperiment"){
+ obj at expSummary$cumNormStat = x;
+ }
+ return(x)
+}
diff --git a/R/deprecated_metagenomeSeq_function.R b/R/deprecated_metagenomeSeq_function.R
new file mode 100644
index 0000000..3eae783
--- /dev/null
+++ b/R/deprecated_metagenomeSeq_function.R
@@ -0,0 +1,23 @@
+#' Depcrecated functions in the metagenomeSeq package.
+#'
+#' These functions may be removed completely in the next release.
+#'
+#' @usage deprecated_metagenomeSeq_function(x, value, ...)
+#' @rdname metagenomeSeq-deprecated
+#' @name metagenomeSeq-deprecated
+#' @param x For assignment operators, the object that will undergo a replacement
+#' (object inside parenthesis).
+#' @param value For assignment operators, the value to replace with
+#' (the right side of the assignment).
+#' @param ... For functions other than assignment operators,
+#' parameters to be passed to the modern version of the function (see table).
+#' @docType package
+#' @export fitMeta
+#' @aliases deprecated_metagenomeSeq_function fitMeta load_phenoData load_meta load_biom load_metaQ
+#'
+deprecated_metagenomeSeq_function <- function(x, value, ...){return(NULL)}
+fitMeta <- function(...){.Deprecated("fitMeta",package="metagenomeSeq");return(fitLogNormal(...))}
+load_phenoData <- function(...){.Deprecated("load_phenoData",package="metagenomeSeq");return(loadPhenoData(...))}
+load_biom <- function(...){.Deprecated("load_biom",package="metagenomeSeq");return(loadBiom(...))}
+load_meta <- function(...){.Deprecated("load_meta",package="metagenomeSeq");return(loadMeta(...))}
+load_metaQ <- function(...){.Deprecated("load_metaQ",package="metagenomeSeq");return(loadMetaQ(...))}
diff --git a/R/doCountMStep.R b/R/doCountMStep.R
new file mode 100644
index 0000000..79381de
--- /dev/null
+++ b/R/doCountMStep.R
@@ -0,0 +1,70 @@
+#' Compute the Maximization step calculation for features still active.
+#'
+#' Maximization step is solved by weighted least squares. The function also
+#' computes counts residuals.
+#'
+#' Maximum-likelihood estimates are approximated using the EM algorithm where
+#' we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+#' zero point mass as latent indicator variables. The density is defined as
+#' $f_zig(y_ij = pi_j(S_j)*f_0(y_ij) +(1-pi_j (S_j)) *
+#' f_count(y_ij;mu_i,sigma_i^2)$. The log-likelihood in this extended model is
+#' $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+#' pi_j(s_j)+(1-delta_ij)log (1-pi_j (s_j))$. The responsibilities are defined
+#' as $z_ij = pr(delta_ij=1 | data)$.
+#'
+#' @param z Matrix (m x n) of estimate responsibilities (probabilities that a
+#' count comes from a spike distribution at 0).
+#' @param y Matrix (m x n) of count observations.
+#' @param mmCount Model matrix for the count distribution.
+#' @param stillActive Boolean vector of size M, indicating whether a feature
+#' converged or not.
+#' @param fit2 Previous fit of the count model.
+#' @param dfMethod Either 'default' or 'modified' (by responsibilities)
+#' @return Update matrix (m x n) of estimate responsibilities (probabilities
+#' that a count comes from a spike distribution at 0).
+#' @seealso \code{\link{fitZig}}
+doCountMStep <-
+function(z, y, mmCount, stillActive,fit2=NULL,dfMethod="modified"){
+
+ if (is.null(fit2)){
+ fit=limma::lmFit(y[stillActive,],mmCount,weights = (1-z[stillActive,]))
+ if(dfMethod=="modified"){
+ df = rowSums(1-z[stillActive,,drop=FALSE]) - ncol(mmCount)
+ fit$df[stillActive] = df
+ fit$df.residual[stillActive] = df
+ }
+ countCoef = fit$coefficients
+ countMu=tcrossprod(countCoef, mmCount)
+ residuals=sweep((y[stillActive,,drop=FALSE]-countMu),1,fit$sigma,"/")
+ dat = list(fit = fit, residuals = residuals)
+ return(dat)
+ } else {
+
+ residuals = fit2$residuals
+ fit2 = fit2$fit
+
+ fit=limma::lmFit(y[stillActive,,drop=FALSE],mmCount,weights = (1-z[stillActive,,drop=FALSE]))
+
+ fit2$coefficients[stillActive,] = fit$coefficients
+ fit2$stdev.unscaled[stillActive,]=fit$stdev.unscaled
+ fit2$sigma[stillActive] = fit$sigma
+ fit2$Amean[stillActive] = fit$Amean
+
+ if(dfMethod=="modified"){
+ df = rowSums(1-z[stillActive,,drop=FALSE]) - ncol(mmCount)
+ fit$df = df
+ fit$df.residual = df
+ }
+ fit2$df[stillActive] = fit$df
+ fit2$df.residual[stillActive] = fit$df.residual
+
+ countCoef = fit$coefficients
+ countMu=tcrossprod(countCoef, mmCount)
+ r=sweep((y[stillActive,,drop=FALSE]-countMu),1,fit$sigma,"/")
+ residuals[stillActive,]=r
+
+ dat = list(fit = fit2, residuals=residuals)
+
+ return(dat)
+ }
+}
diff --git a/R/doEStep.R b/R/doEStep.R
new file mode 100644
index 0000000..e965161
--- /dev/null
+++ b/R/doEStep.R
@@ -0,0 +1,33 @@
+#' Compute the Expectation step.
+#'
+#' Estimates the responsibilities $z_ij = fracpi_j cdot I_0(y_ijpi_j cdot
+#' I_0(y_ij + (1-pi_j) cdot f_count(y_ij
+#'
+#' Maximum-likelihood estimates are approximated using the EM algorithm where
+#' we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+#' zero point mass as latent indicator variables. The density is defined as
+#' $f_zig(y_ij = pi_j(S_j) cdot f_0(y_ij) +(1-pi_j (S_j))cdot
+#' f_count(y_ij;mu_i,sigma_i^2)$. The log-likelihood in this extended model is
+#' $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+#' pi_j(s_j)+(1-delta_ij)log (1-pi_j (sj))$. The responsibilities are defined
+#' as $z_ij = pr(delta_ij=1 | data)$.
+#'
+#' @param countResiduals Residuals from the count model.
+#' @param zeroResiduals Residuals from the zero model.
+#' @param zeroIndices Index (matrix m x n) of counts that are zero/non-zero.
+#' @return Updated matrix (m x n) of estimate responsibilities (probabilities
+#' that a count comes from a spike distribution at 0).
+#' @seealso \code{\link{fitZig}}
+doEStep <-
+function(countResiduals, zeroResiduals, zeroIndices)
+{
+ pi_prop=getPi(zeroResiduals)
+ w1=sweep(zeroIndices, 2, pi_prop, FUN="*")
+
+ countDensity=getCountDensity(countResiduals)
+ w2=sweep(countDensity, 2, 1-pi_prop, FUN="*")
+ z=w1/(w1+w2)
+ z[z>1-1e-6]=1-1e-6
+ z[!zeroIndices]=0
+ z
+}
diff --git a/R/doZeroMStep.R b/R/doZeroMStep.R
new file mode 100644
index 0000000..df55c16
--- /dev/null
+++ b/R/doZeroMStep.R
@@ -0,0 +1,41 @@
+#' Compute the zero Maximization step.
+#'
+#' Performs Maximization step calculation for the mixture components. Uses
+#' least squares to fit the parameters of the mean of the logistic
+#' distribution. $$ pi_j = sum_i^M frac1Mz_ij $$ Maximum-likelihood estimates
+#' are approximated using the EM algorithm where we treat mixture membership
+#' $delta_ij$ = 1 if $y_ij$ is generated from the zero point mass as latent
+#' indicator variables. The density is defined as $f_zig(y_ij = pi_j(S_j) cdot
+#' f_0(y_ij) +(1-pi_j (S_j))cdot f_count(y_ij;mu_i,sigma_i^2)$. The
+#' log-likelihood in this extended model is $(1-delta_ij) log
+#' f_count(y;mu_i,sigma_i^2 )+delta_ij log pi_j(s_j)+(1-delta_ij)log (1-pi_j
+#' (sj))$. The responsibilities are defined as $z_ij = pr(delta_ij=1 | data)$.
+#'
+#'
+#' @param z Matrix (m x n) of estimate responsibilities (probabilities that a
+#' count comes from a spike distribution at 0).
+#' @param zeroIndices Index (matrix m x n) of counts that are zero/non-zero.
+#' @param mmZero The zero model, the model matrix to account for the change in
+#' the number of OTUs observed as a linear effect of the depth of coverage.
+#' @return List of the zero fit (zero mean model) coefficients, variance -
+#' scale parameter (scalar), and normalized residuals of length
+#' sum(zeroIndices).
+#' @seealso \code{\link{fitZig}}
+doZeroMStep <-
+function(z, zeroIndices, mmZero)
+{
+ pi=sapply(1:ncol(zeroIndices), function(j) {
+ if (sum(zeroIndices[,j])==0){
+ return(1e-8)
+ }
+ tmp=mean(z[zeroIndices[,j],j],na.rm=TRUE)
+ ifelse(tmp<=1e-8, 1e-8, ifelse(tmp>=1-(1e-8),1-(1e-8),tmp))
+ })
+ zeroLM=lm.fit(mmZero, qlogis(pi))
+ zeroCoef=zeroLM$coef
+
+ r=zeroLM$residuals
+ sigma=sd(r)+(1e-3)
+
+ list(zeroLM=zeroLM, zeroCoef=zeroCoef, sigma=sigma, residuals=r/sigma)
+}
diff --git a/R/exportMat.R b/R/exportMat.R
new file mode 100644
index 0000000..f4629a3
--- /dev/null
+++ b/R/exportMat.R
@@ -0,0 +1,30 @@
+#' Export the normalized MRexperiment dataset as a matrix.
+#'
+#' This function allows the user to take a dataset of counts and output the
+#' dataset to the user's workspace as a tab-delimited file, etc.
+#'
+#'
+#' @aliases exportMatrix exportMat
+#' @param obj A MRexperiment object or count matrix.
+#' @param log Whether or not to log transform the counts - if MRexperiment object.
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param sep Separator for writing out the count matrix.
+#' @param file Output file name.
+#' @return NA
+#' @seealso \code{\link{cumNorm}}
+#' @examples
+#'
+#' data(lungData)
+#' dataDirectory <- system.file("extdata", package="metagenomeSeq")
+#' exportMat(lungData[,1:5],file=file.path(dataDirectory,"tmp.tsv"))
+#' head(read.csv(file=file.path(dataDirectory,"tmp.tsv"),sep="\t"))
+#'
+exportMat <-function(obj,log=TRUE,norm=TRUE,sep="\t",file="~/Desktop/matrix.tsv"){
+ mat = returnAppropriateObj(obj,norm,log)
+ oMat = array(NA,dim=c((nrow(mat)+1),(ncol(mat)+1)));
+ oMat[1,2:ncol(oMat)] = colnames(mat);
+ oMat[2:nrow(oMat),2:ncol(oMat)] = mat;
+ oMat[2:nrow(oMat),1] = rownames(mat);
+ oMat[1,1] = "Taxa and Samples";
+ write(t(oMat),file=file,sep=sep,ncolumns=ncol(oMat));
+}
diff --git a/R/exportStats.R b/R/exportStats.R
new file mode 100644
index 0000000..a530b44
--- /dev/null
+++ b/R/exportStats.R
@@ -0,0 +1,42 @@
+#' Various statistics of the count data.
+#'
+#' A matrix of values for each sample. The matrix consists of sample ids, the
+#' sample scaling factor, quantile value, the number identified features, and library size (depth of coverage).
+#'
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param p Quantile value to calculate the scaling factor and quantiles for
+#' the various samples.
+#' @param file Output file name.
+#' @return None.
+#' @seealso \code{\link{cumNorm}} \code{\link{quantile}}
+#' @examples
+#'
+#' data(lungData)
+#' dataDirectory <- system.file("extdata", package="metagenomeSeq")
+#' exportStats(lungData[,1:5],file=file.path(dataDirectory,"tmp.tsv"))
+#' head(read.csv(file=file.path(dataDirectory,"tmp.tsv"),sep="\t"))
+#'
+exportStats <-function(obj,p= cumNormStat(obj),file="~/Desktop/res.stats.tsv"){
+ xx=MRcounts(obj)
+ xx[xx==0]=NA
+ qs=colQuantiles(xx,probs=p,na.rm=TRUE)
+
+ xx[xx>0] = 1;
+ xx[is.na(xx)]=0
+
+ newMat <- array(NA,dim=c(5,ncol(xx)+1));
+ newMat[1,1] = "Subject"
+ newMat[2,1] = "Scaling factor"
+ newMat[3,1] = "Quantile value"
+ newMat[4,1] = "Number of identified features"
+ newMat[5,1] = "Library size"
+
+ newMat[1,2:ncol(newMat)]<-sampleNames(obj);
+ newMat[2,2:ncol(newMat)]<-unlist(normFactors(obj));
+ newMat[3,2:ncol(newMat)]<-qs;
+ newMat[4,2:ncol(newMat)]<-colSums(xx);
+ newMat[5,2:ncol(newMat)]<-unlist(libSize(obj));
+
+ write((newMat),file = file,sep = "\t",ncolumns = 5);
+}
diff --git a/R/filterData.R b/R/filterData.R
new file mode 100644
index 0000000..b2a6b4d
--- /dev/null
+++ b/R/filterData.R
@@ -0,0 +1,21 @@
+#' Filter datasets according to no. features present in features with at least a certain depth.
+#'
+#' Filter the data based on the number of present features after filtering samples by depth of coverage.
+#' There are many ways to filter the object, this is just one way.
+#'
+#' @param obj A MRexperiment object or count matrix.
+#' @param present Features with at least 'present' postive samples.
+#' @param depth Sampls with at least this much depth of coverage
+#' @return A MRexperiment object.
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' filterData(mouseData)
+#'
+filterData <- function(obj,present=1,depth=1000){
+ mat = returnAppropriateObj(obj,norm=FALSE,log=FALSE)>0
+ cols = which(colSums(MRcounts(obj))>=depth)
+ rows = which(rowSums(mat[,cols])>=present)
+ return(obj[rows,cols])
+}
diff --git a/R/fitDO.R b/R/fitDO.R
new file mode 100644
index 0000000..c8e2cfe
--- /dev/null
+++ b/R/fitDO.R
@@ -0,0 +1,64 @@
+#' Wrapper to calculate Discovery Odds Ratios on feature values.
+#'
+#' This function returns a data frame of p-values, odds ratios, lower and upper
+#' confidence limits for every row of a matrix. The discovery odds ratio is calculated
+#' as using Fisher's exact test on actual counts. The test's hypothesis is whether
+#' or not the discovery of counts for a feature (of all counts) is found in greater proportion
+#' in a particular group.
+#'
+#'
+#' @param obj A MRexperiment object with a count matrix, or a simple count
+#' matrix.
+#' @param cl Group comparison
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param adjust.method Method to adjust p-values by. Default is "FDR". Options
+#' include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+#' "none". See \code{\link{p.adjust}} for more details.
+#' @param cores Number of cores to use.
+#' @param ... Extra options for makeCluster
+#' @return Matrix of odds ratios, p-values, lower and upper confidence intervals
+#' @seealso \code{\link{cumNorm}} \code{\link{fitZig}} \code{\link{fitPA}} \code{\link{fitMeta}}
+#' @examples
+#'
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' lungTrim = lungTrim[-which(rowSums(MRcounts(lungTrim)>0)<20),]
+#' res = fitDO(lungTrim,pData(lungTrim)$SmokingStatus);
+#' head(res)
+#'
+fitDO<-function(obj,cl,norm=TRUE,log=TRUE,adjust.method='fdr',cores=1,...){
+ x = returnAppropriateObj(obj,norm,log)
+ nrows= nrow(x);
+ if(is.null(rownames(x))){rownames(x)=1:nrows}
+
+ sumClass1 = round(sum(x[,cl==levels(cl)[1]]))
+ sumClass2 = round(sum(x[,cl==levels(cl)[2]]))
+
+ cores <- makeCluster(getOption("cl.cores", cores),...)
+ res = parRapply(cl=cores,x,function(i){
+ tbl = table(1-i,cl)
+ if(sum(dim(tbl))!=4){
+ tbl = array(0,dim=c(2,2));
+ tbl[1,1] = round(sum(i[cl==levels(cl)[1]]))
+ tbl[1,2] = round(sum(i[cl==levels(cl)[2]]))
+ tbl[2,1] = sumClass1-tbl[1,1]
+ tbl[2,2] = sumClass2-tbl[1,2]
+ }
+ ft <- fisher.test(tbl,workspace=8e6,alternative="two.sided",conf.int=TRUE)
+ cbind(p=ft$p.value,o=ft$estimate,cl=ft$conf.int[1],cu=ft$conf.int[2])
+ })
+ stopCluster(cores)
+ nres = nrows*4
+ seqs = seq(1,nres,by=4)
+ p = res[seqs]
+ adjp = p.adjust(p,method=adjust.method)
+ o = res[seqs+1]
+ cl = res[seqs+2]
+ cu = res[seqs+3]
+ res = data.frame(cbind(o,cl,cu,p,adjp))
+ colnames(res) = c("oddsRatio","lower","upper","pvalues","adjPvalues")
+ rownames(res) = rownames(x)
+ return(res)
+}
diff --git a/R/fitFeatureModel.R b/R/fitFeatureModel.R
new file mode 100644
index 0000000..85c6d2e
--- /dev/null
+++ b/R/fitFeatureModel.R
@@ -0,0 +1,73 @@
+#' Computes differential abundance analysis using a zero-inflated log-normal model
+#'
+#' Wrapper to actually run zero-inflated log-normal model given a MRexperiment object
+#' and model matrix. User can decide to shrink parameter estimates.
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param mod The model for the count distribution.
+#' @param coef Coefficient of interest to grab log fold-changes.
+#' @param B Number of bootstraps to perform if >1. If >1 performs permutation test.
+#' @param szero TRUE/FALSE, shrink zero component parameters.
+#' @param spos TRUE/FALSE, shrink positive component parameters.
+#' @return A list of objects including:
+#' \itemize{
+#' \item{call - the call made to fitFeatureModel}
+#' \item{fitZeroLogNormal - list of parameter estimates for the zero-inflated log normal model}
+#' \item{design - model matrix}
+#' \item{taxa - taxa names}
+#' \item{counts - count matrix}
+#' \item{pvalues - calculated p-values}
+#' \item{permuttedfits - permutted z-score estimates under the null}
+#' }
+#' @seealso \code{\link{cumNorm}}
+#' @examples
+#'
+#' data(lungData)
+#' lungData = lungData[,-which(is.na(pData(lungData)$SmokingStatus))]
+#' lungData=filterData(lungData,present=30,depth=1)
+#' lungData <- cumNorm(lungData, p=.5)
+#' s <- normFactors(lungData)
+#' pd <- pData(lungData)
+#' mod <- model.matrix(~1+SmokingStatus, data=pd)
+#' lungres1 = fitFeatureModel(lungData,mod)
+#'
+fitFeatureModel<-function(obj,mod,coef=2,B=1,szero=FALSE,spos=TRUE){
+
+ stopifnot(is(obj, "MRexperiment"))
+ if (any(is.na(normFactors(obj))))
+ stop("At least one NA normalization factors")
+ if (any(is.na(libSize(obj))))
+ stop("Calculate the library size first!")
+ if (any(is.na(normFactors(obj)))) {
+ stop("Calculate the normalization factors first!")
+ }
+ nf = normFactors(obj)
+ mmCount = cbind(mod, log(nf/median(nf)))
+ colnames(mmCount)[ncol(mmCount)] = "scalingFactor"
+
+ if(ncol(mmCount)>3){ stop("Can't analyze currently.") }
+ i = permuttedFits = NULL
+
+ # These pieces get to be a part of the new zero-ln model!
+ fitzeroln = fitZeroLogNormal(obj,mmCount,coef=coef,szero=szero,spos=spos)
+ zscore = fitzeroln$logFC/fitzeroln$se
+
+ if(B>1){
+ permutations = replicate(B,sample(mmCount[,coef]))
+ mmCountPerm = mmCount
+
+ permuttedFits = foreach(i = seq(B),.errorhandling="remove",
+ .packages=c("metagenomeSeq","glmnet")) %dopar% {
+ mmCountPerm[,coef] = permutations[,i]
+ permFit = fitZeroLogNormal(obj,mmCountPerm,coef=coef,szero=szero,spos=spos)
+ permFit$logFC/permFit$se
+ }
+ zperm = abs(sapply(permuttedFits,function(i)i))
+ pvals = rowMeans(zperm>=abs(zscore),na.rm=TRUE)
+ } else {
+ pvals = 2*(1-pnorm(abs(zscore)))
+ }
+ res = list(call=match.call(),fitZeroLogNormal=fitzeroln,design=mmCount,
+ taxa=rownames(obj),counts=MRcounts(obj),pvalues=pvals,permuttedFits=permuttedFits)
+ res
+}
\ No newline at end of file
diff --git a/R/fitLogNormal.R b/R/fitLogNormal.R
new file mode 100644
index 0000000..26f7bb2
--- /dev/null
+++ b/R/fitLogNormal.R
@@ -0,0 +1,71 @@
+#' Computes a log-normal linear model and permutation based p-values.
+#'
+#' Wrapper to perform the permutation test on the t-statistic. This is the original
+#' method employed by metastats (for non-sparse large samples). We include CSS normalization
+#' though (optional) and log2 transform the data. In this method the null distribution is not assumed to be a t-dist.
+#'
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param mod The model for the count distribution.
+#' @param useCSSoffset Boolean, whether to include the default scaling
+#' parameters in the model or not.
+#' @param B Number of permutations.
+#' @param coef The coefficient of interest.
+#' @param sl The value to scale by (default=1000).
+#'
+#' @return Call made, fit object from lmFit, t-statistics and p-values for each feature.
+#' @export
+#' @examples
+#'
+#' # This is a simple demonstration
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' k = which(rowSums(MRcounts(lungTrim)>0)<30)
+#' lungTrim = cumNorm(lungTrim)
+#' lungTrim = lungTrim[-k,]
+#' smokingStatus = pData(lungTrim)$SmokingStatus
+#' mod = model.matrix(~smokingStatus)
+#' fit = fitLogNormal(obj = lungTrim,mod=mod,B=1)
+#'
+fitLogNormal <- function(obj,mod,useCSSoffset=TRUE,B=1000,coef=2,sl=1000){
+ if(class(obj)=="MRexperiment"){
+ mat = MRcounts(obj,norm=FALSE,log=FALSE)
+ mat = log2(mat + 1)
+ } else if(class(obj) == "matrix") {
+ mat = obj
+ } else {
+ stop("Object needs to be either a MRexperiment object or matrix")
+ }
+
+ if(useCSSoffset==TRUE){
+ if(any(is.na(normFactors(obj)))){
+ stop("Calculate the normalization factors first!")
+ }
+ mmCount=cbind(mod,log2(normFactors(obj)/sl +1))}
+ else{
+ mmCount=mod
+ }
+
+ # fit of the data
+ fitRes = limma::lmFit(mat,mmCount)
+
+ # The t-statistic
+ tt <- fitRes$coef[,coef] / fitRes$stdev.unscaled[,coef] / fitRes$sigma
+
+ perms = replicate(B,sample(mmCount[,coef]))
+ mmCount1=mmCount[,-coef]
+ nc = ncol(mmCount)
+
+ tobs<- sapply(1:B,function(i){
+ # This code forces the covariate of interest to be a factor (might not apply)
+ mmCountPerm = cbind(mmCount1,factor(perms[,i]))
+ fit = limma::lmFit(mat,mmCountPerm)
+ ttObs <- fit$coef[,nc] / fit$stdev.unscaled[,nc] / fit$sigma
+ ttObs
+ })
+ p = rowMeans(abs(tobs)>=abs(tt))
+
+ dat = list(call=match.call(),fit=fitRes,t = tt,p = p,type="perm")
+ return(dat)
+}
diff --git a/R/fitPA.R b/R/fitPA.R
new file mode 100644
index 0000000..d827962
--- /dev/null
+++ b/R/fitPA.R
@@ -0,0 +1,61 @@
+#' Wrapper to run fisher's test on presence/absence of a feature.
+#'
+#' This function returns a data frame of p-values, odds ratios, lower and upper
+#' confidence limits for every row of a matrix.
+#'
+#'
+#' @param obj A MRexperiment object with a count matrix, or a simple count
+#' matrix.
+#' @param cl Group comparison
+#' @param thres Threshold for defining presence/absence.
+#' @param adjust.method Method to adjust p-values by. Default is "FDR". Options
+#' include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+#' "none". See \code{\link{p.adjust}} for more details.
+#' @param cores Number of cores to use.
+#' @param ... Extra parameters for makeCluster
+#' @return Matrix of odds ratios, p-values, lower and upper confidence intervals
+#' @seealso \code{\link{cumNorm}} \code{\link{fitZig}} \code{\link{fitDO}} \code{\link{fitMeta}}
+#' @examples
+#'
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' lungTrim = lungTrim[-which(rowSums(MRcounts(lungTrim)>0)<20),]
+#' res = fitPA(lungTrim,pData(lungTrim)$SmokingStatus);
+#' head(res)
+#'
+fitPA<-function(obj,cl,thres=0,adjust.method='fdr',cores=1,...){
+ x = returnAppropriateObj(obj,norm=FALSE,log=FALSE)>thres
+ nrows= nrow(x);
+ if(is.null(rownames(x))){rownames(x)=1:nrows}
+
+ nClass1 = sum(cl==levels(cl)[1])
+ nClass2 = sum(cl==levels(cl)[2])
+
+ cores <- makeCluster(getOption("cl.cores", cores),...)
+ res = parRapply(cl=cores,x,function(i){
+ tbl = table(1-i,cl)
+ if(sum(dim(tbl))!=4){
+ tbl = array(0,dim=c(2,2));
+ tbl[1,1] = sum(i[cl==levels(cl)[1]])
+ tbl[1,2] = sum(i[cl==levels(cl)[2]])
+ tbl[2,1] = nClass1-tbl[1,1]
+ tbl[2,2] = nClass2-tbl[1,2]
+ }
+ ft <- fisher.test(tbl,workspace=8e6,alternative="two.sided",conf.int=TRUE)
+ cbind(o=ft$estimate,cl=ft$conf.int[1],cu=ft$conf.int[2],p=ft$p.value)
+ })
+ stopCluster(cores)
+ nres = nrows*4
+ seqs = seq(1,nres,by=4)
+ p = res[seqs+3]
+ adjp = p.adjust(p,method=adjust.method)
+ o = res[seqs]
+ cl = res[seqs+1]
+ cu = res[seqs+2]
+ res = data.frame(cbind(o,cl,cu,p,adjp))
+
+ colnames(res) = c("oddsRatio","lower","upper","pvalues","adjPvalues")
+ rownames(res) = rownames(x)
+ return(res)
+}
diff --git a/R/fitTimeSeries.R b/R/fitTimeSeries.R
new file mode 100644
index 0000000..c3ae47d
--- /dev/null
+++ b/R/fitTimeSeries.R
@@ -0,0 +1,610 @@
+#' Trapezoidal Integration
+#'
+#' Compute the area of a function with values 'y' at the points 'x'.
+#' Function comes from the pracma package.
+#'
+#' @param x x-coordinates of points on the x-axis
+#' @param y y-coordinates of function values
+#' @return Approximated integral of the function from 'min(x)' to 'max(x)'.
+#' Or a matrix of the same size as 'y'.
+#' @rdname trapz
+#' @export
+#' @examples
+#'
+#' # Calculate the area under the sine curve from 0 to pi:
+#' n <- 101
+#' x <- seq(0, pi, len = n)
+#' y <- sin(x)
+#' trapz(x, y) #=> 1.999835504
+#'
+#' # Use a correction term at the boundary: -h^2/12*(f'(b)-f'(a))
+#' h <- x[2] - x[1]
+#' ca <- (y[2]-y[1]) / h
+#' cb <- (y[n]-y[n-1]) / h
+#' trapz(x, y) - h^2/12 * (cb - ca) #=> 1.999999969
+#'
+trapz <- function(x,y){
+ if (missing(y)) {
+ if (length(x) == 0)
+ return(0)
+ y <- x
+ x <- 1:length(x)
+ }
+ if (length(x) == 0)
+ return(0)
+ if (!(is.numeric(x) || is.complex(x)) || !(is.numeric(y) ||
+ is.complex(y)))
+ stop("Arguments 'x' and 'y' must be real or complex.")
+ m <- length(x)
+ xp <- c(x, x[m:1])
+ yp <- c(numeric(m), y[m:1])
+ n <- 2 * m
+ p1 <- sum(xp[1:(n - 1)] * yp[2:n]) + xp[n] * yp[1]
+ p2 <- sum(xp[2:n] * yp[1:(n - 1)]) + xp[1] * yp[n]
+ return(0.5 * (p1 - p2))
+}
+
+#' smoothing-splines anova fit
+#'
+#' Sets up a data-frame with the feature abundance,
+#' class information, time points, sample ids and returns
+#' the fitted values for the fitted model.
+#'
+#' @param formula Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.
+#' @param abundance Numeric vector of abundances.
+#' @param class Class membership (factor of group membership).
+#' @param time Time point vector of relative times (same length as abundance).
+#' @param id Sample / patient id.
+#' @param include Parameters to include in prediction.
+#' @param pd Extra variable.
+#' @param ... Extra parameters for ssanova function (see ?ssanova).
+#' @return \itemize{A list containing:
+#' \item data : Inputed data
+#' \item fit : The interpolated / fitted values for timePoints
+#' \item se : The standard error for CI intervals
+#' \item timePoints : The time points interpolated over
+#' }
+#' @seealso \code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssPermAnalysis}} \code{\link{ssPerm}} \code{\link{ssIntervalCandidate}}
+#' @rdname ssFit
+#' @export
+#' @examples
+#'
+#' # Not run
+#'
+ssFit <- function(formula,abundance,class,time,id,include=c("class", "time:class"),pd,...) {
+ df = data.frame(abundance = abundance, class = factor(class),
+ time=time,id = factor(id),pd)
+
+ # The smoothing splines anova model
+ if(missing(formula)){
+ mod = gss::ssanova(abundance ~ time * class, data=df,...)
+ } else{
+ mod = gss::ssanova(formula,data=df,...)
+ }
+
+ fullTime = seq(min(df$time), max(df$time), by=1)
+ values = data.frame(time=fullTime, class=factor(levels(df[,"class"]))[2])
+ fit = predict(mod, values, include=include, se=TRUE)
+
+ res = list(data=df, fit=fit$fit, se=fit$se, timePoints=fullTime)
+ return(res)
+}
+
+#' class permutations for smoothing-spline time series analysis
+#'
+#' Creates a list of permuted class memberships for the time series permuation tests.
+#'
+#' @param df Data frame containing class membership and sample/patient id label.
+#' @param B Number of permutations.
+#' @return A list of permutted class memberships
+#' @seealso \code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssFit}} \code{\link{ssPermAnalysis}} \code{\link{ssIntervalCandidate}}
+#' @rdname ssPerm
+#' @examples
+#'
+#' # Not run
+#'
+ssPerm <- function(df,B) {
+ dat = data.frame(class=df$class, id=df$id)
+ # id = table(dat$id)
+ id = table(interaction(dat$class,dat$id))
+ id = id[id>0]
+ classes = unique(dat)[,"class"]
+ permList = lapply(1:B,function(i){
+ rep(sample(classes, replace=FALSE),id)
+ })
+ return(permList)
+}
+
+#' smoothing-splines anova fits for each permutation
+#'
+#' Calculates the fit for each permutation and estimates
+#' the area under the null (permutted) model for interesting time
+#' intervals of differential abundance.
+#'
+#' @param data Data used in estimation.
+#' @param formula Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.
+#' @param permList A list of permutted class memberships
+#' @param intTimes Interesting time intervals.
+#' @param timePoints Time points to interpolate over.
+#' @param include Parameters to include in prediction.
+#' @param ... Options for ssanova
+#' @return A matrix of permutted area estimates for time intervals of interest.
+#' @seealso \code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssFit}} \code{\link{ssPerm}} \code{\link{ssIntervalCandidate}}
+#' @rdname ssPermAnalysis
+#' @export
+#' @examples
+#'
+#' # Not run
+#'
+ssPermAnalysis <- function(data,formula,permList,intTimes,timePoints,include=c("class", "time:class"),...){
+ resPerm=matrix(NA, length(permList), nrow(intTimes))
+ permData=data
+ case = data.frame(time=timePoints, class=factor(levels(data$class)[2]))
+ for (j in 1:length(permList)){
+
+ permData$class = permList[[j]]
+ # The smoothing splines anova model
+ if(!missing(formula)){
+ permModel = gss::ssanova(formula, data=permData,...)
+ } else{
+ permModel = gss::ssanova(abundance ~ time * class,data=permData,...)
+ }
+
+ permFit = cbind(timePoints, (2*predict(permModel,case,include=include, se=TRUE)$fit))
+ for (i in 1:nrow(intTimes)){
+ permArea=permFit[which(permFit[,1]==intTimes[i,1]) : which(permFit[,1]==intTimes[i, 2]), ]
+ resPerm[j, i]=metagenomeSeq::trapz(x=permArea[,1], y=permArea[,2])
+ }
+ if(j%%100==0) show(j)
+ }
+ return(resPerm)
+}
+
+#' calculate interesting time intervals
+#'
+#' Calculates time intervals of interest using SS-Anova fitted confidence intervals.
+#'
+#' @param fit SS-Anova fits.
+#' @param standardError SS-Anova se estimates.
+#' @param timePoints Time points interpolated over.
+#' @param positive Positive region or negative region (difference in abundance is positive/negative).
+#' @param C Value for which difference function has to be larger or smaller than (default 0).
+#' @return Matrix of time point intervals of interest
+#' @seealso \code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssFit}} \code{\link{ssPerm}} \code{\link{ssPermAnalysis}}
+#' @rdname ssIntervalCandidate
+#' @export
+#' @examples
+#'
+#' # Not run
+#'
+ssIntervalCandidate <- function(fit, standardError, timePoints, positive=TRUE,C=0){
+ lowerCI = (2*fit - (1.96*2*standardError))
+ upperCI = (2*fit + (1.96*2*standardError))
+ if (positive){
+ abundanceDifference = which( lowerCI>=0 & abs(lowerCI)>=C )
+ }else{
+ abundanceDifference = which( upperCI<=0 & abs(upperCI)>=C )
+ }
+ if (length(abundanceDifference)>0){
+ intIndex=which(diff(abundanceDifference)!=1)
+ intTime=matrix(NA, (length(intIndex)+1), 4)
+ if (length(intIndex)==0){
+ intTime[1,1]=timePoints[abundanceDifference[1]]
+ intTime[1,2]=timePoints[tail(abundanceDifference, n=1)]
+ }else{
+ i=1
+ while(length(intTime)!=0 & length(intIndex)!=0){
+ intTime[i,1]=timePoints[abundanceDifference[1]]
+ intTime[i,2]=timePoints[abundanceDifference[intIndex[1]]]
+ abundanceDifference=abundanceDifference[-c(1:intIndex[1])]
+ intIndex=intIndex[-1]
+ i=i+1
+ }
+ intTime[i,1] = timePoints[abundanceDifference[1]]
+ intTime[i,2] = timePoints[tail(abundanceDifference, n=1)]
+ }
+ }else{
+ intTime=NULL
+ }
+ return(intTime)
+}
+
+#' Discover differentially abundant time intervals using SS-Anova
+#'
+#' Calculate time intervals of interest using SS-Anova fitted models.
+#' Fitting is performed uses Smoothing Spline ANOVA (SS-Anova) to find interesting intervals of time.
+#' Given observations at different time points for two groups, fitSSTimeSeries
+#' calculates a function that models the difference in abundance between two
+#' groups across all time. Using permutations we estimate a null distribution
+#' of areas for the time intervals of interest and report significant intervals of time.
+#' Use of the function for analyses should cite:
+#' "Finding regions of interest in high throughput genomics data using smoothing splines"
+#' Talukder H, Paulson JN, Bravo HC. (In preparation)
+#'
+#' @param obj metagenomeSeq MRexperiment-class object.
+#' @param formula Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.
+#' @param feature Name or row of feature of interest.
+#' @param class Name of column in phenoData of MRexperiment-class object for class memberhip.
+#' @param time Name of column in phenoData of MRexperiment-class object for relative time.
+#' @param id Name of column in phenoData of MRexperiment-class object for sample id.
+#' @param lvl Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).
+#' @param include Parameters to include in prediction.
+#' @param C Value for which difference function has to be larger or smaller than (default 0).
+#' @param B Number of permutations to perform
+#' @param norm When aggregating counts to normalize or not.
+#' @param log Log2 transform.
+#' @param sl Scaling value.
+#' @param ... Options for ssanova
+#' @return List of matrix of time point intervals of interest, Difference in abundance area and p-value, fit, area permutations, and call.
+#' @return A list of objects including:
+#' \itemize{
+#' \item{timeIntervals - Matrix of time point intervals of interest, area of differential abundance, and pvalue.}
+#' \item{data - Data frame of abundance, class indicator, time, and id input.}
+#' \item{fit - Data frame of fitted values of the difference in abundance, standard error estimates and timepoints interpolated over.}
+#' \item{perm - Differential abundance area estimates for each permutation.}
+#' \item{call - Function call.}
+#' }
+#' @rdname fitSSTimeSeries
+#' @seealso \code{\link{cumNorm}} \code{\link{ssFit}} \code{\link{ssIntervalCandidate}} \code{\link{ssPerm}} \code{\link{ssPermAnalysis}} \code{\link{plotTimeSeries}}
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' res = fitSSTimeSeries(obj=mouseData,feature="Actinobacteria",
+#' class="status",id="mouseID",time="relativeTime",lvl='class',B=2)
+#'
+fitSSTimeSeries <- function(obj,formula,feature,class,time,id,lvl=NULL,include=c("class", "time:class"),C=0,B=1000,norm=TRUE,log=TRUE,sl=1000,...) {
+
+ if(!is.null(lvl)){
+ aggData = aggregateByTaxonomy(obj,lvl,norm=norm,sl=sl)
+ abundance = MRcounts(aggData,norm=FALSE,log=log,sl=1)[feature,]
+ } else {
+ abundance = MRcounts(obj,norm=norm,log=log,sl=sl)[feature,]
+ }
+ class = pData(obj)[,class]
+ time = pData(obj)[,time]
+ id = pData(obj)[,id]
+ if(any(sapply(list(id,time,class),length)==0)){
+ stop("provide class, time, and id names")
+ }
+
+ if(!missing(formula)){
+ prep=ssFit(formula=formula,abundance=abundance,class=class,
+ time=time,id=id,include=include,pd=pData(obj),...)
+ } else {
+ prep=ssFit(abundance=abundance,class=class,time=time,id=id,
+ include=include,pd=pData(obj),...)
+ }
+ indexPos = ssIntervalCandidate(fit=prep$fit, standardError=prep$se,
+ timePoints=prep$timePoints, positive=TRUE,C=C)
+ indexNeg = ssIntervalCandidate(fit=prep$fit, standardError=prep$se,
+ timePoints=prep$timePoints, positive=FALSE,C=C)
+ indexAll = rbind(indexPos, indexNeg)
+
+ if(sum(indexAll[,1]==indexAll[,2])>0){
+ indexAll=indexAll[-which(indexAll[,1]==indexAll[,2]),]
+ }
+
+ fit = 2*prep$fit
+ se = 2*prep$se
+ timePoints = prep$timePoints
+ fits = data.frame(fit = fit, se = se, timePoints = timePoints)
+
+ if(!is.null(indexAll)){
+ if(length(indexAll)>0){
+ indexAll=matrix(indexAll,ncol=4)
+ colnames(indexAll)=c("Interval start", "Interval end", "Area", "p.value")
+ predArea = cbind(prep$timePoints, (2*prep$fit))
+ permList = ssPerm(prep$data,B=B)
+ if(!missing(formula)){
+ permResult = ssPermAnalysis(data=prep$data,formula=formula,permList=permList,
+ intTimes=indexAll,timePoints=prep$timePoints,include=include,...)
+ } else {
+ permResult = ssPermAnalysis(data=prep$data,permList=permList,
+ intTimes=indexAll,timePoints=prep$timePoints,include=include,...)
+ }
+
+ for (i in 1:nrow(indexAll)){
+ origArea=predArea[which(predArea[,1]==indexAll[i,1]):which(predArea[,1]==indexAll[i, 2]), ]
+ actArea=trapz(x=origArea[,1], y=origArea[,2])
+ indexAll[i,3] = actArea
+ if(actArea>0){
+ indexAll[i,4] = 1 - (length(which(actArea>permResult[,i]))+1)/(B+1)
+ }else{
+ indexAll[i,4] = (length(which(actArea>permResult[,i]))+1)/(B+1)
+ }
+ if(indexAll[i,4]==0){
+ indexAll[i,4] = 1/(B+1)
+ }
+ }
+
+ res = list(timeIntervals=indexAll,data=prep$data,fit=fits,perm=permResult)
+ return(res)
+ }
+ }else{
+ indexAll = "No statistically significant time intervals detected"
+ res = list(timeIntervals=indexAll,data=prep$data,fit=fits,perm=NULL)
+ return(res)
+ }
+}
+
+#' Discover differentially abundant time intervals
+#'
+#' Calculate time intervals of significant differential abundance.
+#' Currently only one method is implemented (ssanova). fitSSTimeSeries is called with method="ssanova".
+#'
+#' @param obj metagenomeSeq MRexperiment-class object.
+#' @param formula Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.
+#' @param feature Name or row of feature of interest.
+#' @param class Name of column in phenoData of MRexperiment-class object for class memberhip.
+#' @param time Name of column in phenoData of MRexperiment-class object for relative time.
+#' @param id Name of column in phenoData of MRexperiment-class object for sample id.
+#' @param method Method to estimate time intervals of differentially abundant bacteria (only ssanova method implemented currently).
+#' @param lvl Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).
+#' @param include Parameters to include in prediction.
+#' @param C Value for which difference function has to be larger or smaller than (default 0).
+#' @param B Number of permutations to perform.
+#' @param norm When aggregating counts to normalize or not.
+#' @param log Log2 transform.
+#' @param sl Scaling value.
+#' @param ... Options for ssanova
+#' @return List of matrix of time point intervals of interest, Difference in abundance area and p-value, fit, area permutations, and call.
+#' @return A list of objects including:
+#' \itemize{
+#' \item{timeIntervals - Matrix of time point intervals of interest, area of differential abundance, and pvalue.}
+#' \item{data - Data frame of abundance, class indicator, time, and id input.}
+#' \item{fit - Data frame of fitted values of the difference in abundance, standard error estimates and timepoints interpolated over.}
+#' \item{perm - Differential abundance area estimates for each permutation.}
+#' \item{call - Function call.}
+#' }
+#' @rdname fitTimeSeries
+#' @seealso \code{\link{cumNorm}} \code{\link{fitSSTimeSeries}} \code{\link{plotTimeSeries}}
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' res = fitTimeSeries(obj=mouseData,feature="Actinobacteria",
+#' class="status",id="mouseID",time="relativeTime",lvl='class',B=2)
+#'
+fitTimeSeries <- function(obj,formula,feature,class,time,id,method=c("ssanova"),
+ lvl=NULL,include=c("class", "time:class"),C=0,B=1000,
+ norm=TRUE,log=TRUE,sl=1000,...) {
+ if(method=="ssanova"){
+ if(requireNamespace("gss")){
+ if(missing(formula)){
+ res = fitSSTimeSeries(obj=obj,feature=feature,class=class,time=time,id=id,
+ lvl=lvl,C=C,B=B,norm=norm,log=log,sl=sl,include=include,...)
+ } else {
+ res = fitSSTimeSeries(obj=obj,formula=formula,feature=feature,class=class,
+ time=time,id=id,lvl=lvl,C=C,B=B,norm=norm,log=log,sl=sl,
+ include=include,...)
+ }
+ }
+ }
+ res = c(res,call=match.call())
+ return(res)
+}
+
+#' Plot difference function for particular bacteria
+#'
+#' Plot the difference in abundance for significant features.
+#'
+#' @param res Output of fitTimeSeries function
+#' @param C Value for which difference function has to be larger or smaller than (default 0).
+#' @param xlab X-label.
+#' @param ylab Y-label.
+#' @param main Main label.
+#' @param ... Extra plotting arguments.
+#' @return Plot of difference in abundance for significant features.
+#' @rdname plotTimeSeries
+#' @seealso \code{\link{fitTimeSeries}}
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' res = fitTimeSeries(obj=mouseData,feature="Actinobacteria",
+#' class="status",id="mouseID",time="relativeTime",lvl='class',B=10)
+#' plotTimeSeries(res)
+#'
+plotTimeSeries<-function(res,C=0,xlab="Time",ylab="Difference in abundance",main="SS difference function prediction",...){
+ fit = res$fit$fit
+ se = res$fit$se
+ timePoints = res$fit$timePoints
+ confInt95 = 1.96
+ sigDiff = res$timeIntervals
+
+ minValue=min(fit-(confInt95*se))-.5
+ maxValue=max(fit+(confInt95*se))+.5
+
+ plot(x=timePoints, y=fit, ylim=c(minValue, maxValue), xlab=xlab, ylab=ylab, main=main, ...)
+
+ for (i in 1:nrow(sigDiff)){
+ begin=sigDiff[i,1]
+ end=sigDiff[i,2]
+ indBegin=which(timePoints==begin)
+ indEnd=which(timePoints==end)
+ x=timePoints[indBegin:indEnd]
+ y=fit[indBegin:indEnd]
+ xx=c(x, rev(x))
+ yy=c(y, rep(0, length(y)))
+ polygon(x=xx, yy, col="grey")
+ }
+ lines(x=timePoints, y=fit, pch="")
+ lines(x=timePoints, y=fit+(confInt95*se), pch="", lty=2)
+ lines(x=timePoints, y=fit-(confInt95*se), pch="", lty=2)
+ abline(h=C)
+}
+
+#' Plot abundances by class
+#'
+#' Plot the abundance of values for each class using
+#' a spline approach on the estimated full model.
+#'
+#' @param res Output of fitTimeSeries function
+#' @param formula Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.
+#' @param xlab X-label.
+#' @param ylab Y-label.
+#' @param color0 Color of samples from first group.
+#' @param color1 Color of samples from second group.
+#' @param include Parameters to include in prediction.
+#' @param ... Extra plotting arguments.
+#' @return Plot for abundances of each class using a spline approach on estimated null model.
+#' @rdname plotClassTimeSeries
+#' @seealso \code{\link{fitTimeSeries}}
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' res = fitTimeSeries(obj=mouseData,feature="Actinobacteria",
+#' class="status",id="mouseID",time="relativeTime",lvl='class',B=10)
+#' plotClassTimeSeries(res,pch=21,bg=res$data$class,ylim=c(0,8))
+#'
+plotClassTimeSeries<-function(res,formula,xlab="Time",ylab="Abundance",color0="black",
+ color1="red",include=c("1","class", "time:class"),...){
+ dat = res$data
+ if(missing(formula)){
+ mod = gss::ssanova(abundance ~ time * class, data=dat)
+ } else{
+ mod = gss::ssanova(formula,data=dat)
+ }
+
+ timePoints = seq(min(dat$time),max(dat$time),by=1)
+ group0 = data.frame(time=timePoints,class=levels(dat$class)[1])
+ group1 = data.frame(time=timePoints,class=levels(dat$class)[2])
+
+ pred0 = predict(mod, newdata=group0,include=include, se=TRUE)
+ pred1 = predict(mod, newdata=group1,include=include, se=TRUE)
+
+ plot(x=dat$time,y=dat$abundance,xlab=xlab,ylab=ylab,...)
+ lines(x=group0$time,y=pred0$fit,col=color0)
+ lines(x=group0$time,y=pred0$fit+(1.96*pred0$se),lty=2,col=color0)
+ lines(x=group0$time,y=pred0$fit-(1.96*pred0$se),lty=2,col=color0)
+
+ lines(x=group1$time,y=pred1$fit,col=color1)
+ lines(x=group1$time,y=pred1$fit+(1.96*pred1$se),lty=2,col=color1)
+ lines(x=group1$time,y=pred1$fit-(1.96*pred1$se),lty=2,col=color1)
+}
+
+#' Discover differentially abundant time intervals for all bacteria
+#'
+#' Calculate time intervals of significant differential abundance over all
+#' bacteria of a particularly specified level (lvl). If not lvl is specified,
+#' all OTUs are analyzed. Warning, function can take a while
+#'
+#' @param obj metagenomeSeq MRexperiment-class object.
+#' @param lvl Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).
+#' @param B Number of permutations to perform.
+#' @param ... Options for \code{\link{fitTimeSeries}}, except feature.
+#' @return List of lists of matrices of time point intervals of interest, Difference in abundance area and p-value, fit, area permutations.
+#' @return A list of lists for which each includes:
+#' \itemize{
+#' \item{timeIntervals - Matrix of time point intervals of interest, area of differential abundance, and pvalue.}
+#' \item{data - Data frame of abundance, class indicator, time, and id input.}
+#' \item{fit - Data frame of fitted values of the difference in abundance, standard error estimates and timepoints interpolated over.}
+#' \item{perm - Differential abundance area estimates for each permutation.}
+#' \item{call - Function call.}
+#' }
+#' @rdname fitMultipleTimeSeries
+#' @seealso \code{\link{cumNorm}} \code{\link{fitSSTimeSeries}} \code{\link{fitTimeSeries}}
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' res = fitMultipleTimeSeries(obj=mouseData,lvl='phylum',class="status",
+#' id="mouseID",time="relativeTime",B=1)
+#'
+fitMultipleTimeSeries <- function(obj,lvl=NULL,B=1,...) {
+ if(is.null(lvl)){
+ bacteria = seq(nrow(obj))
+ } else {
+ if(is.factor(fData(obj)[,lvl])){
+ fData(obj)[,lvl] = as.character(fData(obj)[,lvl])
+ }
+ bacteria = unique(fData(obj)[,lvl])
+ }
+ fits = lapply(bacteria,function(bact){
+ try(fitTimeSeries(obj,lvl=lvl,feature=bact,B=B,...))
+ })
+ names(fits) = bacteria
+ fits = c(fits,call=match.call())
+ return(fits)
+}
+
+#' With a list of fitTimeSeries results, generate
+#' an MRexperiment that can be plotted with metavizr
+#'
+#' @param obj Output of fitMultipleTimeSeries
+#' @param sampleNames Sample names for plot
+#' @param sampleDescription Description of samples for plot axis label
+#' @param taxonomyLevels Feature names for plot
+#' @param taxonomyHierarchyRoot Root of feature hierarchy for MRexperiment
+#' @param taxonomyDescription Description of features for plot axis label
+#' @param featuresOfInterest The features to select from the fitMultipleTimeSeries output
+#' @return MRexperiment that contains fitTimeSeries data, featureData, and phenoData
+#' @rdname ts2MRexperiment
+#' @seealso \code{\link{fitTimeSeries}} \code{\link{fitMultipleTimeSeries}}
+#' @export
+#' @examples
+#'
+#' data(mouseData)
+#' res = fitMultipleTimeSeries(obj=mouseData,lvl='phylum',class="status",
+#' id="mouseID",time="relativeTime",B=1)
+#' obj = ts2MRexperiment(res)
+#' obj
+#'
+ts2MRexperiment<-function(obj,sampleNames=NULL,
+ sampleDescription="timepoints",
+ taxonomyLevels=NULL,
+ taxonomyHierarchyRoot="bacteria",
+ taxonomyDescription="taxonomy",
+ featuresOfInterest = NULL){
+ if(is.null(obj)){
+ stop("Matrix cannot be null")
+ }
+ if(is.null(sampleNames)){
+ numSamples <- dim(obj[[1]]$fit)[1]
+ sampleNames <- paste("Timepoint", 1:numSamples, sep="_")
+ }
+
+ if(is.null(featuresOfInterest)){
+ hasFit <- lapply(1:length(obj), function(i) which(!is.null(obj[[i]]$fit)))
+ featuresOfInterest <- which(hasFit == 1)
+ }
+
+ if(is.null(taxonomyLevels)){
+ numLevels <- length(featuresOfInterest)
+ taxonomyLevels <- names(obj)[featuresOfInterest]
+ }
+
+ numSamples <- length(sampleNames)
+ numLevels <- length(taxonomyLevels)
+ numFeaturesOfInterest <- length(featuresOfInterest)
+
+ rangeSamples <- 1:numSamples
+ rangeFeaturesOfInterest <- 1:numFeaturesOfInterest
+
+ results <- do.call(rbind, lapply(rangeFeaturesOfInterest,function(i){ t(obj[[featuresOfInterest[i]]]$fit)[1,]}))
+
+ dfSamples <- data.frame(x=rangeSamples,row.names=sampleNames)
+ metaDataSamples <-data.frame(labelDescription=sampleDescription)
+ annotatedDFSamples <- AnnotatedDataFrame()
+ pData(annotatedDFSamples) <- dfSamples
+ varMetadata(annotatedDFSamples) <- metaDataSamples
+ validObject(annotatedDFSamples)
+
+ dfFeatures <- data.frame(taxonomy1=rep(taxonomyHierarchyRoot, numLevels),taxonomy2=taxonomyLevels)
+ metaDataFeatures <-data.frame(labelDescription=paste(taxonomyDescription, 1:2, sep=""))
+ annotatedDFFeatures <- AnnotatedDataFrame()
+ pData(annotatedDFFeatures) <- dfFeatures
+ varMetadata(annotatedDFFeatures) <- metaDataFeatures
+ validObject(annotatedDFFeatures)
+
+ fitTimeSeriesMRexp <- newMRexperiment(counts=results,
+ phenoData=annotatedDFSamples,
+ featureData=annotatedDFFeatures)
+ return(fitTimeSeriesMRexp)
+}
+# load("~/Dropbox/Projects/metastats/package/git/metagenomeSeq/data/mouseData.rda")
+# classMatrix = aggregateByTaxonomy(mouseData,lvl='class',norm=TRUE,out='MRexperiment')
+# data(mouseData)
+# fitTimeSeries(obj=mouseData,feature="Actinobacteria",class="status",id="mouseID",time="relativeTime",lvl='class',B=10)
diff --git a/R/fitZeroLogNormal.R b/R/fitZeroLogNormal.R
new file mode 100644
index 0000000..1cb5767
--- /dev/null
+++ b/R/fitZeroLogNormal.R
@@ -0,0 +1,299 @@
+#' Compute the log fold-change estimates for the zero-inflated log-normal model
+#'
+#' Run the zero-inflated log-normal model given a MRexperiment object
+#' and model matrix. Not for the average user, assumes structure of the model matrix.
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param mod The model for the count distribution.
+#' @param coef Coefficient of interest to grab log fold-changes.
+#' @param szero TRUE/FALSE, shrink zero component parameters.
+#' @param spos TRUE/FALSE, shrink positive component parameters.
+#' @return A list of objects including:
+#' \itemize{
+#' \item{logFC - the log fold-change estimates}
+#' \item{adjFactor - the adjustment factor based on the zero component}
+#' \item{se - standard error estimates}
+#' \item{fitln - parameters from the log-normal fit}
+#' \item{fitzero - parameters from the logistic fit}
+#' \item{zeroRidge - output from the ridge regression}
+#' \item{posRidge - output from the ridge regression}
+#' \item{tauPos - estimated tau^2 for positive component}
+#' \item{tauZero - estimated tau^2 for zero component}
+#' \item{exclude - features to exclude for various reasons, e.g. all zeros}
+#' \item{zeroExclude - features to exclude for various reasons, e.g. all zeros}
+#' }
+#' @seealso \code{\link{cumNorm}} \code{\link{fitFeatureModel}}
+fitZeroLogNormal<-function(obj,mod,coef=2,szero=TRUE,spos=TRUE){
+ positiveMod = mod[,-ncol(mod)]
+ zeroMod = mod
+
+ nf <- normFactors(obj)
+ mat <- MRcounts(obj, norm=TRUE, log=FALSE,sl=median(nf))
+ posIndices = mat>0
+
+ nr = nrow(mat)
+ nc = ncol(mat)
+ exclude = zeroExclude = tauZero = tauPos = posRidge = zeroRidge = NULL
+
+ results = array(NA,dim=c(nr,3))
+ rownames(results) = rownames(mat)
+ colnames(results) = c("logFC","adjFactor","se")
+
+ # calc log-normal component
+ fitln = calcPosComponent(mat,positiveMod,posIndices)
+
+ # Don't calculate shrinkage with special cases
+ zeros2 = which(fitln[,"s2"]==0)
+ rs = rowsum(t(1-(1-posIndices)),positiveMod[,coef])
+ exclude = union(which(rs[1,]<=1),which(rs[2,]<=1))
+ zeroExclude = which(colSums(rs)>=(nc-3))
+ exclude = union(zeros2,exclude); if(length(exclude)==0) exclude=NULL
+ if(length(zeroExclude)==0) zeroExclude=NULL
+
+ sdensity = density(fitln[,"s2"],na.rm=TRUE)
+ smode = sdensity$x[which.max(sdensity$y)]
+ if(length(zeros2)>0) fitln[zeros2,"s2"] = smode
+
+ # shrink positive
+ if(spos==TRUE){
+ shrinkPos<-calcShrinkParameters(fitln,coef,smode,exclude)
+ tauPos = shrinkPos$tau
+ vpost = shrinkPos$v.post
+ fitln[,"s2"] = vpost
+
+ posRidge = sapply(seq(nr),function(i){
+ k = which(posIndices[i,])
+ y = log(mat[i,k])
+ x = positiveMod[k,]
+ l = vpost[i]/(nrow(x)*tauPos)
+ if(i %in% exclude) return(matrix(rep(NA,ncol(positiveMod))))
+ ridge = glmnet(y=y,x=x,lambda=l,alpha=0)
+ as.matrix(coefficients(ridge)[colnames(positiveMod),])
+ })
+ posFittedCoefficients = t(posRidge)
+ rownames(posFittedCoefficients) = rownames(mat)
+ fitln[rownames(posFittedCoefficients),1:ncol(positiveMod)] = posFittedCoefficients
+ }
+ # calc zero component
+ fitzero=calcZeroComponent(mat,zeroMod,posIndices)
+
+ sdensity = density(fitzero[,"s2"],na.rm=TRUE)
+ smode = sdensity$x[which.max(sdensity$y)]
+ if(length(exclude)>0) fitzero[exclude,"s2"] = smode
+
+ # shrink zero
+ if(szero==TRUE){
+ shrinkZero<-calcShrinkParameters(fitzero,coef,smode,exclude)
+ tauZero = shrinkZero$tau
+ vpostZero = shrinkZero$v.post
+ fitzero[,"s2"] = vpostZero
+
+ zeroRidge = sapply(1:nr,function(i){
+ y = posIndices[i,]
+ l = 1/(nc*tauZero)
+ if(i %in% c(zeroExclude,exclude)) return(matrix(rep(NA,ncol(zeroMod))))
+ ridge = glmnet(y=y,x=zeroMod,lambda=l,family="binomial",alpha=0,
+ penalty.factor = c(rep(1,(ncol(zeroMod)-1)),0))
+ as.matrix(coefficients(ridge))[colnames(zeroMod),]
+ })
+ zeroFittedCoefficients = t(zeroRidge)
+ rownames(zeroFittedCoefficients) = rownames(mat)
+ fitzero[rownames(zeroFittedCoefficients),1:ncol(zeroMod)] = zeroFittedCoefficients
+ }
+
+ # calc se
+ se = calcStandardError(zeroMod,fitln,fitzero,coef=coef,exclude=union(exclude,zeroExclude))
+ se[zeroExclude] = sqrt(fitln[zeroExclude,"s2"])
+
+ # calc adjFactor
+ adjFactor = calcZeroAdjustment(fitln,fitzero,zeroMod,coef,exclude=exclude)
+ adjFactor[zeroExclude] = 0
+
+ # calc logFC
+ logFC <- fitln[,coef] + adjFactor
+
+ list(logFC=logFC,adjFactor=adjFactor,se=se,
+ fitln=fitln,fitzero=fitzero,zeroRidge=zeroRidge,posRidge=posRidge,
+ tauPos=tauPos,tauZero=tauZero,exclude=exclude,zeroExclude=zeroExclude)
+}
+#' Positive component
+#'
+#' Fit the positive (log-normal) component
+#'
+#' @param mat A matrix of normalized counts
+#' @param mod A model matrix
+#' @param weights Weight matrix for samples and counts
+#' @seealso \code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+calcPosComponent<-function(mat,mod,weights){
+ fitln <- lmFit(log(mat),mod,weights=weights)
+ b = coefficients(fitln)
+ df = fitln$df
+ res = residuals(fitln,log(mat))
+ s2 = sapply(seq(nrow(res)),function(i){
+ sum(res[i,which(weights[i,])]^2,na.rm=TRUE)/df[i]
+ })
+ fitln<-data.frame(b=b,s2=s2,df=df)
+ rownames(fitln) = rownames(mat)
+ fitln
+}
+#' Zero component
+#'
+#' Fit the zero (logisitic) component
+#'
+#' @param mat A matrix of normalized counts
+#' @param mod A model matrix
+#' @param weights Weight matrix for samples and counts
+#' @seealso \code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+calcZeroComponent<-function(mat,mod,weights){
+ fitzero <- sapply(seq(nrow(mat)), function(i) {
+ fit <- glm.fit(mod, weights[i,], family=binomial())
+ cf = coefficients(fit)
+ df = fit$df.residual
+ mc = exp(mod %*% cf)
+ s2 = sum((weights[i, ] - t(mc/(1 + mc)))^2)/df
+ # s2 = sum(residuals(fit)^2)/df
+ c(beta= cf, s2 = s2, df = df)
+ })
+ fitzero <- data.frame(t(fitzero))
+ rownames(fitzero) = rownames(mat)
+ fitzero
+}
+#' Calculate shrinkage parameters
+#'
+#' Calculate the shrunken variances and variance of parameters of interest across features.
+#'
+#' @param fit A matrix of fits as outputted by calcZeroComponent or calcPosComponent
+#' @param coef Coefficient of interest
+#' @param mins2 minimum variance estimate
+#' @param exclude Vector of features to exclude when shrinking
+#' @seealso \code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+calcShrinkParameters<-function(fit,coef,mins2,exclude=NULL){
+
+ if(is.null(exclude)){
+ shrunkVar <- limma::squeezeVar(fit[,"s2"], fit[,"df"])
+ v.post = shrunkVar$var.post
+ tau <-var(fit[,coef],na.rm=TRUE)
+ } else {
+ v.post = rep(mins2,nrow(fit))
+ shrunkVar <- limma::squeezeVar(fit[-exclude,"s2"], fit[-exclude,"df"])
+ v.post[-exclude] <- shrunkVar$var.post
+ tau <- var(fit[-exclude,coef],na.rm=TRUE)
+ }
+ list(tau=tau,v.post=v.post)
+}
+#' Calculate the zero-inflated component's adjustment factor
+#'
+#' Calculate the log ratio of average marginal probabilities for each sample
+#' having a positive count. This becomes the adjustment factor for the log
+#' fold change.
+#'
+#' @param fitln A matrix with parameters from the log-normal fit
+#' @param fitzero A matrix with parameters from the logistic fit
+#' @param mod The zero component model matrix
+#' @param coef Coefficient of interest
+#' @param exclude List of features to exclude
+#' @seealso \code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+calcZeroAdjustment<-function(fitln,fitzero,mod,coef,exclude=NULL){
+ b = fitln[,1:(ncol(mod)-1)]
+ beta = fitzero[,1:ncol(mod)]
+ # calculate for zero adjust factor
+ mod1 <- mod
+ mod1[,coef] <- 1
+ theta1 <- mod1 %*% t(beta)
+ p1 <- exp(theta1) / (1+exp(theta1))
+ p1 <- t(p1)
+ if(ncol(b)>2) p1 = p1*exp(t(mod[,3:(ncol(mod)-1)]%*%t(b[,3:ncol(b)])))
+ mean_p1 <- rowMeans(p1)
+
+ mod0 <- mod
+ mod0[,coef] <- 0
+ theta0 <- mod0 %*% t(beta)
+ p0 <- exp(theta0) / (1+exp(theta0))
+ p0 <- t(p0)
+ if(ncol(b)>2) p0 = p0*exp(t(mod[,3:(ncol(mod)-1)]%*%t(b[,3:ncol(b)])))
+ mean_p0 <- rowMeans(p0)
+
+ adjFactor <- log(mean_p1/mean_p0)
+ if(!is.null(exclude)) adjFactor[exclude] = NA
+ adjFactor
+}
+
+#' Calculate the zero-inflated log-normal statistic's standard error
+#'
+#' Calculat the se for the model. Code modified from
+#' "Adjusting for covariates in zero-inflated gamma and
+#' zero-inflated log-normal models for semicontinuous data", ED Mills
+#'
+#' @param mod The zero component model matrix
+#' @param fitln A matrix with parameters from the log-normal fit
+#' @param fitzero A matrix with parameters from the logistic fit
+#' @param coef Coefficient of interest
+#' @param exclude List of features to exclude
+#' @seealso \code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+calcStandardError<-function(mod,fitln,fitzero,coef=2,exclude=NULL){
+ mod0 = mod1 = mod
+ mod1[,coef] <- 1
+ mod0[,coef] <- 0
+ ve = rep(NA,nrow(fitln))
+ features = seq(nrow(fitln))
+ if(length(exclude)>0) features = features[-exclude]
+
+# a) need to speed up
+# b) need to include more covariates
+
+ fullvar = sapply(features,function(i){
+ beta = fitzero[i,1:ncol(mod)]
+ b = fitln[i,1:(ncol(mod)-1)]
+ s = as.numeric(fitln[i,"s2"])
+
+ mu0 = as.vector(exp(mod0[,-ncol(mod)]%*%t(b) + .5*s))
+ mu1 = as.vector(exp(mod1[,-ncol(mod)]%*%t(b) + .5*s))
+
+ # calculate for zero adjust factor
+ theta <- mod %*% t(beta)
+ theta1 <- mod1 %*% t(beta)
+ theta0 <- mod0 %*% t(beta)
+ p <- t(exp(theta) / (1+exp(theta)))
+ p1 <- t(exp(theta1) / (1+exp(theta1)))
+ p0 <- t(exp(theta0) / (1+exp(theta0)))
+
+ checkInverse <- function(m){
+ class(try(qr.solve(m),silent=T))=="matrix"
+ }
+
+ Dp2 <- diag(length(p))*as.vector(p*(1-p))
+ infz = t(mod)%*%Dp2%*%mod
+ Dp <- diag(length(p))*as.vector(p)
+ infln = t(mod[,-ncol(mod)])%*%Dp%*%mod[,-ncol(mod)]
+
+ if(checkInverse(infz)) {
+ invinf_z <-qr.solve(infz)
+ } else {
+ return(NA)
+ }
+ if(checkInverse(infln)) {
+ invinf_ln<-as.numeric(s)*qr.solve(infln)
+ } else {
+ return(NA)
+ }
+ invInfFull = as.matrix( bdiag(invinf_z,invinf_ln, (2*s^2/sum(p))) )
+
+ logRatioBeta0<- (mean(p1*(1-p1)*mu0)/mean(p1*mu0)) - (mean(p0*(1-p0)*mu0)/mean(p0*mu0))
+ logRatioBeta1<-mean(p1*(1-p1)*mu0)/mean(p1*mu0)
+ logRatioBeta2<- (mean(mod[,3]*p1*(1-p1)*mu0)/mean(p1*mu0)) - (mean(mod[,3]*p0*(1-p0)*mu0)/mean(p0*mu0))
+ # logRatioB2<- (mean(mod[,3]*t(p1)*exp(mod0%*%t(b)))/mean(t(p1)*exp(mod0%*%t(b))))-
+ # (mean(mod[,3]*t(p0)*exp(mod0%*%t(b)))/mean(t(p0)*exp(mod0%*%t(b))))
+ # logRatioFull = t(c(logRatioBeta0,logRatioBeta1,logRatioBeta2,0,1,logRatioB2,0))
+ logRatioFull = t(c(logRatioBeta0,logRatioBeta1,logRatioBeta2,0,1,0))
+ logRatioVar = logRatioFull%*%invInfFull%*%t(logRatioFull)
+ logRatioVar
+ })
+ if(!is.null(exclude)){
+ if(length(features)>0){
+ ve[features] = fullvar
+ }
+ } else {
+ ve = fullvar
+ }
+ sqrt(ve)
+}
diff --git a/R/fitZig.R b/R/fitZig.R
new file mode 100644
index 0000000..d174e6f
--- /dev/null
+++ b/R/fitZig.R
@@ -0,0 +1,274 @@
+#' Computes the weighted fold-change estimates and t-statistics.
+#'
+#' Wrapper to actually run the Expectation-maximization algorithm and estimate
+#' $f_count$ fits. Maximum-likelihood estimates are approximated using the EM
+#' algorithm where we treat mixture membership $delta_ij = 1$ if $y_ij$ is
+#' generated from the zero point mass as latent indicator variables. The
+#' density is defined as $f_zig(y_ij = pi_j(S_j)*f_0(y_ij) +(1-pi_j (S_j)) *
+#' f_count(y_ij; mu_i, sigma_i^2)$. The log-likelihood in this extended model
+#' is: $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+#' pi_j(s_j)+(1-delta_ij) log (1-pi_j (s_j))$. The responsibilities are defined
+#' as $z_ij = pr(delta_ij=1 | data)$.
+#'
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param mod The model for the count distribution.
+#' @param zeroMod The zero model, the model to account for the change in the
+#' number of OTUs observed as a linear effect of the depth of coverage.
+#' @param useCSSoffset Boolean, whether to include the default scaling
+#' parameters in the model or not.
+#' @param control The settings for fitZig.
+#' @param useMixedModel Estimate the correlation between duplicate
+#' features or replicates using duplicateCorrelation.
+#' @param ... Additional parameters for duplicateCorrelation.
+#' @return A list of objects including:
+#' \itemize{
+#' \item{call - the call made to fitZig}
+#' \item{fit - 'MLArrayLM' Limma object of the weighted fit}
+#' \item{countResiduals - standardized residuals of the fit}
+#' \item{z - matrix of the posterior probabilities}
+#' \item{eb - output of eBayes, moderated t-statistics, moderated F-statistics, etc}
+#' \item{taxa - vector of the taxa names}
+#' \item{counts - the original count matrix input}
+#' \item{zeroMod - the zero model matrix}
+#' \item{zeroCoef - the zero model fitted results}
+#' \item{stillActive - convergence}
+#' \item{stillActiveNLL - nll at convergence}
+#' \item{dupcor - correlation of duplicates}
+#' }
+#' @export
+#' @seealso \code{\link{cumNorm}} \code{\link{zigControl}}
+#' @examples
+#'
+#' # This is a simple demonstration
+#' data(lungData)
+#' k = grep("Extraction.Control",pData(lungData)$SampleType)
+#' lungTrim = lungData[,-k]
+#' k = which(rowSums(MRcounts(lungTrim)>0)<30)
+#' lungTrim = cumNorm(lungTrim)
+#' lungTrim = lungTrim[-k,]
+#' smokingStatus = pData(lungTrim)$SmokingStatus
+#' mod = model.matrix(~smokingStatus)
+#' # The maxit is not meant to be 1 - this is for demonstration/speed
+#' settings = zigControl(maxit=1,verbose=FALSE)
+#' fit = fitZig(obj = lungTrim,mod=mod,control=settings)
+#'
+fitZig <- function(obj,
+ mod,
+ zeroMod=NULL,
+ useCSSoffset=TRUE,
+ control=zigControl(),
+ useMixedModel=FALSE,
+ ...)
+{
+ stopifnot( is( obj, "MRexperiment" ) )
+ if(any(is.na(normFactors(obj)))) stop("At least one NA normalization factors")
+ if(any(is.na(libSize(obj)))) stop("Calculate the library size first!")
+
+ y <- MRcounts(obj, norm=FALSE, log=FALSE)
+ nc <- ncol(y) #nsamples
+ nr <- nrow(y) #nfeatures
+
+ # Normalization step
+ Nmatrix <- log2(y + 1)
+
+ # Initializing the model matrix
+ if (useCSSoffset == TRUE){
+ if (any(is.na(normFactors(obj)))) {
+ stop("Calculate the normalization factors first!")
+ }
+ mmCount <- cbind(mod, log2(normFactors(obj)/1000 + 1))
+ colnames(mmCount)[ncol(mmCount)] <- "scalingFactor"
+ } else {
+ mmCount <- mod
+ }
+
+ if (is.null(zeroMod)) {
+ if (any(is.na(libSize(obj)))) {
+ stop("Calculate the library size first!")
+ }
+
+ mmZero <- model.matrix(~1+log(libSize(obj)))
+ } else {
+ mmZero <- zeroMod
+ }
+
+ dat <- .do_fitZig(Nmatrix, mmCount, mmZero, control=control, useMixedModel=useMixedModel, ...)
+
+ assayData(obj)[["z"]] <- dat$z
+ assayData(obj)[["zUsed"]] <- dat$zUsed
+ dat$zUsed <- NULL
+
+ dat <- c(dat, list(call=match.call(),taxa=rownames(obj),counts=y))
+ dat
+}
+
+.do_fitZig <- function(y,
+ count_model_matrix,
+ zero_model_matrix,
+ control=zigControl(),
+ useMixedModel=FALSE,
+ ...)
+{
+ # Initialization
+ tol <- control$tol
+ maxit <- control$maxit
+ verbose <- control$verbose
+ dfMethod <- control$dfMethod
+ pvalMethod <- control$pvalMethod
+
+ nr <- nrow(y)
+ nc <- ncol(y)
+
+ zeroIndices <- (y == 0)
+ z <- matrix(0, nrow=nr, ncol=nc)
+ z[zeroIndices] <- 0.5
+ zUsed <- z
+
+ curIt <- 0
+ nllOld <- rep(Inf, nr)
+ nll <- rep(Inf, nr)
+ nllUSED <- nll
+ stillActive <- rep(TRUE, nr)
+ stillActiveNLL <- rep(1, nr)
+ dupcor <- NULL
+
+ modRank <- ncol(count_model_matrix)
+ # E-M Algorithm
+ while (any(stillActive) && (curIt < maxit)) {
+
+ # M-step for count density (each feature independently)
+ if(curIt == 0){
+ fit <- doCountMStep(z, y, count_model_matrix, stillActive, dfMethod=dfMethod)
+ } else {
+ fit <- doCountMStep(z, y, count_model_matrix, stillActive, fit2=fit, dfMethod=dfMethod)
+ }
+
+ # M-step for zero density (all features together)
+ zeroCoef <- doZeroMStep(z, zeroIndices, zero_model_matrix)
+
+ # E-step
+ z <- doEStep(fit$residuals, zeroCoef$residuals, zeroIndices)
+ zzdata <- getZ(z, zUsed, stillActive, nll, nllUSED);
+ zUsed <- zzdata$zUsed;
+
+ # NLL
+ nll <- getNegativeLogLikelihoods(z, fit$residuals, zeroCoef$residuals)
+ eps <- getEpsilon(nll, nllOld)
+ active <- isItStillActive(eps, tol,stillActive,stillActiveNLL,nll)
+ stillActive <- active$stillActive;
+ stillActiveNLL <- active$stillActiveNLL;
+ if (verbose == TRUE){
+ cat(sprintf("it=%2d, nll=%0.2f, log10(eps+1)=%0.2f, stillActive=%d\n", curIt, mean(nll,na.rm=TRUE), log10(max(eps,na.rm=TRUE)+1), sum(stillActive)))
+ }
+ nllOld <- nll
+ curIt <- curIt + 1
+
+ if (sum(rowSums((1-z) > 0) <= modRank, na.rm=TRUE) > 0) {
+ k <- which(rowSums((1-z) > 0) <= modRank)
+ stillActive[k] <- FALSE;
+ stillActiveNLL[k] <- nll[k]
+ }
+ }
+
+ if (useMixedModel == TRUE) {
+ dupcor <- duplicateCorrelation(y, count_model_matrix, weights=(1-z), ...)
+ fit$fit <- limma::lmFit(y, count_model_matrix, weights=(1-z), correlation=dupcor$consensus, ...)
+ countCoef <- fit$fit$coefficients
+ countMu <- tcrossprod(countCoef, count_model_matrix)
+ fit$residuals <- sweep((y-countMu), 1, fit$fit$sigma, "/")
+ }
+
+ eb <- limma::eBayes(fit$fit)
+ dat <- list(fit=fit$fit, countResiduals=fit$residuals,
+ z=z, zUsed=zUsed, eb=eb, zeroMod=zero_model_matrix, stillActive=stillActive,
+ stillActiveNLL=stillActiveNLL, zeroCoef=zeroCoef, dupcor=dupcor)
+ dat
+}
+
+# #' Function to perform fitZig bootstrap
+# #'
+# #' Calculates bootstrap stats
+# #'
+# #' @param y Log-transformed matrix
+# #' @param y string for the y-axis
+# #' @param norm is the data normalized?
+# #' @param log is the data logged?
+# #' @return vector of x,y labels
+# #'
+# performBoostrap<-function(fit){
+
+
+# zeroIndices=(y==0)
+# z=matrix(0,nrow=nr, ncol=nc)
+# z[zeroIndices]=0.5
+# zUsed = z
+
+# curIt=0
+# nllOld=rep(Inf, nr)
+# nll=rep(Inf, nr)
+# nllUSED=nll
+# stillActive=rep(TRUE, nr)
+# stillActiveNLL=rep(1, nr)
+
+# tt <- fit$fit$coef[,coef] / fit$fit$stdev.unscaled[,coef] / fit$fit$sigma
+# perms = replicate(B,sample(mmCount[,coef]))
+# mmCount1=mmCount[,-coef]
+
+# # Normalization step
+# Nmatrix = log2(y+1)
+
+# # Initializing the model matrix
+# if(useCSSoffset==TRUE){
+# if(any(is.na(normFactors(obj)))){stop("Calculate the normalization factors first!")}
+# mmCount=cbind(mod,log2(normFactors(obj)/1000 +1))
+# colnames(mmCount)[ncol(mmCount)] = "scalingFactor"
+# }
+# else{
+# mmCount=mod
+# }
+
+# if(is.null(zeroMod)){
+# if(any(is.na(libSize(obj)))){ stop("Calculate the library size first!") }
+# mmZero=model.matrix(~1+log(libSize(obj)))
+# } else{
+# mmZero=zeroMod
+# }
+
+# modRank=ncol(mmCount)
+# # E-M Algorithm
+# while(any(stillActive) && curIt<maxit) {
+
+# # M-step for count density (each feature independently)
+# if(curIt==0){
+# fit=doCountMStep(z, Nmatrix, mmCount, stillActive,dfMethod=dfMethod);
+# } else {
+# fit=doCountMStep(z, Nmatrix, mmCount, stillActive,fit2=fit,dfMethod=dfMethod)
+# }
+
+# # M-step for zero density (all features together)
+# zeroCoef = doZeroMStep(z, zeroIndices, mmZero)
+
+# # E-step
+# z = doEStep(fit$residuals, zeroCoef$residuals, zeroIndices)
+# zzdata<-getZ(z,zUsed,stillActive,nll,nllUSED);
+# zUsed = zzdata$zUsed;
+# # NLL
+# nll = getNegativeLogLikelihoods(z, fit$residuals, zeroCoef$residuals)
+# eps = getEpsilon(nll, nllOld)
+# active = isItStillActive(eps, tol,stillActive,stillActiveNLL,nll)
+# stillActive = active$stillActive;
+# stillActiveNLL = active$stillActiveNLL;
+# if(verbose==TRUE){
+# cat(sprintf("it=%2d, nll=%0.2f, log10(eps+1)=%0.2f, stillActive=%d\n", curIt, mean(nll,na.rm=TRUE), log10(max(eps,na.rm=TRUE)+1), sum(stillActive)))
+# }
+# nllOld=nll
+# curIt=curIt+1
+
+# if(sum(rowSums((1-z)>0)<=modRank,na.rm=TRUE)>0){
+# k = which(rowSums((1-z)>0)<=modRank)
+# stillActive[k] = FALSE;
+# stillActiveNLL[k] = nll[k]
+# }
+# }
+# }
diff --git a/R/getCountDensity.R b/R/getCountDensity.R
new file mode 100644
index 0000000..616566e
--- /dev/null
+++ b/R/getCountDensity.R
@@ -0,0 +1,22 @@
+#' Compute the value of the count density function from the count model
+#' residuals.
+#'
+#' Calculate density values from a normal: $f(x) = 1/(sqrt (2 pi ) sigma )
+#' e^-((x - mu )^2/(2 sigma^2))$. Maximum-likelihood estimates are
+#' approximated using the EM algorithm where we treat mixture membership
+#' $deta_ij$ = 1 if $y_ij$ is generated from the zero point mass as latent
+#' indicator variables. The density is defined as $f_zig(y_ij = pi_j(S_j) cdot
+#' f_0(y_ij) +(1-pi_j (S_j))cdot f_count(y_ij;mu_i,sigma_i^2)$. The
+#' log-likelihood in this extended model is $(1-delta_ij) log
+#' f_count(y;mu_i,sigma_i^2 )+delta_ij log pi_j(s_j)+(1-delta_ij)log (1-pi_j
+#' (sj))$. The responsibilities are defined as $z_ij = pr(delta_ij=1 | data)$.
+#'
+#'
+#' @param residuals Residuals from the count model.
+#' @param log Whether or not we are calculating from a log-normal distribution.
+#' @return Density values from the count model residuals.
+#' @seealso \code{\link{fitZig}}
+getCountDensity <-
+function(residuals, log=FALSE){
+ dnorm(residuals,log=log)
+}
diff --git a/R/getEpsilon.R b/R/getEpsilon.R
new file mode 100644
index 0000000..d9b8403
--- /dev/null
+++ b/R/getEpsilon.R
@@ -0,0 +1,22 @@
+#' Calculate the relative difference between iterations of the negative
+#' log-likelihoods.
+#'
+#' Maximum-likelihood estimates are approximated using the EM algorithm where
+#' we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+#' zero point mass as latent indicator variables. The log-likelihood in this
+#' extended model is $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+#' pi_j(s_j)+(1-delta_ij)log (1-pi_j (sj))$. The responsibilities are defined
+#' as $z_ij = pr(delta_ij=1 | data)$.
+#'
+#'
+#' @param nll Vector of size M with the current negative log-likelihoods.
+#' @param nllOld Vector of size M with the previous iterations negative
+#' log-likelihoods.
+#' @return Vector of size M of the relative differences between the previous
+#' and current iteration nll.
+#' @seealso \code{\link{fitZig}}
+getEpsilon <-
+function(nll, nllOld){
+ eps=(nllOld-nll)/nllOld
+ ifelse(!is.finite(nllOld), Inf, eps)
+}
diff --git a/R/getNegativeLogLikelihoods.R b/R/getNegativeLogLikelihoods.R
new file mode 100644
index 0000000..61f814d
--- /dev/null
+++ b/R/getNegativeLogLikelihoods.R
@@ -0,0 +1,27 @@
+#' Calculate the negative log-likelihoods for the various features given the
+#' residuals.
+#'
+#' Maximum-likelihood estimates are approximated using the EM algorithm where
+#' we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+#' zero point mass as latent indicator variables. The log-likelihood in this
+#' extended model is $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+#' pi_j(s_j)+(1-delta_ij)log (1-pi_j (sj))$. The responsibilities are defined
+#' as $z_ij = pr(delta_ij=1 | data and current values)$.
+#'
+#'
+#' @param z Matrix (m x n) of estimate responsibilities (probabilities that a
+#' count comes from a spike distribution at 0).
+#' @param countResiduals Residuals from the count model.
+#' @param zeroResiduals Residuals from the zero model.
+#' @return Vector of size M of the negative log-likelihoods for the various
+#' features.
+#' @seealso \code{\link{fitZig}}
+getNegativeLogLikelihoods <-
+function(z, countResiduals, zeroResiduals){
+ pi=getPi(zeroResiduals)
+ countDensity=getCountDensity(countResiduals, log=TRUE)
+ res=(1-z) * countDensity
+ res=res+sweep(z, 2, log(pi), FUN="*")
+ res=res+sweep(1-z,2,log(1-pi), FUN="*")
+ -rowSums(res)
+}
diff --git a/R/getPi.R b/R/getPi.R
new file mode 100644
index 0000000..775db7b
--- /dev/null
+++ b/R/getPi.R
@@ -0,0 +1,17 @@
+#' Calculate the mixture proportions from the zero model / spike mass model
+#' residuals.
+#'
+#' F(x) = 1 / (1 + exp(-(x-m)/s)) (the CDF of the logistic distribution).
+#' Provides the probability that a real-valued random variable X with a given
+#' probability distribution will be found at a value less than or equal to x.
+#' The output are the mixture proportions for the samples given the residuals
+#' from the zero model.
+#'
+#'
+#' @param residuals Residuals from the zero model.
+#' @return Mixture proportions for each sample.
+#' @seealso \code{\link{fitZig}}
+getPi <-
+function(residuals){
+ plogis(residuals)
+}
diff --git a/R/getZ.R b/R/getZ.R
new file mode 100644
index 0000000..a10f2c5
--- /dev/null
+++ b/R/getZ.R
@@ -0,0 +1,29 @@
+#' Calculate the current Z estimate responsibilities (posterior probabilities)
+#'
+#' Calculate the current Z estimate responsibilities (posterior probabilities)
+#'
+#'
+#' @param z Matrix (m x n) of estimate responsibilities (probabilities that a
+#' count comes from a spike distribution at 0).
+#' @param zUsed Matrix (m x n) of estimate responsibilities (probabilities that
+#' a count comes from a spike distribution at 0) that are actually used
+#' (following convergence).
+#' @param stillActive A vector of size M booleans saying if a feature is still
+#' active or not.
+#' @param nll Vector of size M with the current negative log-likelihoods.
+#' @param nllUSED Vector of size M with the converged negative log-likelihoods.
+#' @return A list of updated zUsed and nllUSED.
+#' @seealso \code{\link{fitZig}}
+getZ <-
+function(z,zUsed,stillActive,nll,nllUSED){
+
+ nllUSED[stillActive] = nll[stillActive]
+ k =which(nll< (nllUSED))
+ if(length(k)>0){
+ zUsed[k,]=z[k,]
+ nllUSED[k] = nll[k]
+ }
+ zUsed[stillActive,] = z[stillActive,]
+ dat = list(zUsed = zUsed,nllUSED = nllUSED)
+ return(dat);
+}
diff --git a/R/isItStillActive.R b/R/isItStillActive.R
new file mode 100644
index 0000000..d891574
--- /dev/null
+++ b/R/isItStillActive.R
@@ -0,0 +1,24 @@
+#' Function to determine if a feature is still active.
+#'
+#' In the Expectation Maximization routine features posterior probabilities routinely converge based on a tolerance threshold. This function checks
+#' whether or not the feature's negative log-likelihood (measure of the fit) has changed or not.
+#'
+#' @param eps Vector of size M (features) representing the relative difference between the new nll and old nll.
+#' @param tol The threshold tolerance for the difference
+#' @param stillActive A vector of size M booleans saying if a feature is still active or not.
+#' @param stillActiveNLL A vector of size M recording the negative log-likelihoods of the various features, updated for those still active.
+#' @param nll Vector of size M with the current negative log-likelihoods.
+#' @return None.
+#'
+#' @name isItStillActive
+#' @seealso \code{\link{fitZig}}
+#'
+isItStillActive <-
+function(eps, tol,stillActive,stillActiveNLL,nll){
+ stillActive[stillActive]=!is.finite(eps[stillActive]) | eps[stillActive]>tol
+ stillActive[which(is.na(eps))]=FALSE
+
+ stillActiveNLL[stillActive]=nll[stillActive]
+ dat = list(stillActive=stillActive,stillActiveNLL = stillActiveNLL)
+ return(dat)
+}
diff --git a/R/loadBiom.R b/R/loadBiom.R
new file mode 100644
index 0000000..3e7d8e1
--- /dev/null
+++ b/R/loadBiom.R
@@ -0,0 +1,19 @@
+#' Load objects organized in the Biom format.
+#'
+#' Wrapper to load Biom formatted object.
+#'
+#' @param file The biom object filepath.
+#' @return A MRexperiment object.
+#' @seealso \code{\link{loadMeta}} \code{\link{loadPhenoData}} \code{\link{newMRexperiment}} \code{\link{biom2MRexperiment}}
+#' @examples
+#'
+#' #library(biomformat)
+#' rich_dense_file = system.file("extdata", "rich_dense_otu_table.biom", package = "biomformat")
+#' x = loadBiom(rich_dense_file)
+#' x
+loadBiom <- function(file){
+ requireNamespace("biomformat")
+ x = biomformat::read_biom(file);
+ mrobj = biom2MRexperiment(x);
+ return(mrobj);
+}
diff --git a/R/loadMeta.R b/R/loadMeta.R
new file mode 100644
index 0000000..e2f7d5a
--- /dev/null
+++ b/R/loadMeta.R
@@ -0,0 +1,26 @@
+#' Load a count dataset associated with a study.
+#'
+#' Load a matrix of OTUs in a tab delimited format
+#'
+#'
+#' @aliases loadMeta metagenomicLoader
+#' @param file Path and filename of the actual data file.
+#' @param sep File delimiter.
+#' @return A list with objects 'counts' and 'taxa'.
+#' @seealso \code{\link{loadPhenoData}}
+#' @examples
+#'
+#' dataDirectory <- system.file("extdata", package="metagenomeSeq")
+#' lung = loadMeta(file.path(dataDirectory,"CHK_NAME.otus.count.csv"))
+#'
+loadMeta <- function(file,sep="\t")
+{
+ dat2 <- read.table(file,header=FALSE,sep=sep,nrows=1,stringsAsFactors=FALSE);
+ subjects <- as.character(dat2[1,-1]);
+ classes <-c("character",rep("numeric",length(subjects)));
+ dat3 <- read.table(file,header=FALSE,skip=1,sep=sep,colClasses=classes,row.names=1);
+ colnames(dat3) = subjects
+ taxa<- rownames(dat3);
+ obj <- list(counts=as.data.frame(dat3), taxa=as.data.frame(taxa))
+ return(obj);
+}
diff --git a/R/loadMetaQ.R b/R/loadMetaQ.R
new file mode 100644
index 0000000..b8cd7e2
--- /dev/null
+++ b/R/loadMetaQ.R
@@ -0,0 +1,28 @@
+#' Load a count dataset associated with a study set up in a Qiime format.
+#'
+#' Load a matrix of OTUs in Qiime's format
+#'
+#'
+#' @aliases loadMetaQ qiimeLoader
+#' @param file Path and filename of the actual data file.
+#' @return An list with 'counts' containing the count data, 'taxa' containing the otu annotation, and 'otus'.
+#' @seealso \code{\link{loadMeta}} \code{\link{loadPhenoData}}
+#' @examples
+#'
+#' # see vignette
+#'
+loadMetaQ <- function(file) {
+ dat2 <- read.delim(file,header=FALSE,stringsAsFactors=FALSE,nrows=1,skip=1);
+ len = ncol(dat2)
+ subjects = as.character(dat2[1,-c(1,len)]);
+ classes <-c("character",rep("numeric",(len-2)),"character");
+ dat3 <- read.delim(file,header=TRUE,colClasses=classes,skip=1);
+ taxa<- dat3[,len];
+ taxa<-as.matrix(taxa);
+ matrix <- dat3[,-c(1,len)]
+ colnames(matrix) = subjects;
+ otus = dat3[,1];
+ rownames(matrix) = otus;
+ obj <- list(counts=as.data.frame(matrix), taxa=as.data.frame(taxa),otus = as.data.frame(otus))
+ return(obj);
+}
diff --git a/R/loadPhenoData.R b/R/loadPhenoData.R
new file mode 100644
index 0000000..ea5ca7d
--- /dev/null
+++ b/R/loadPhenoData.R
@@ -0,0 +1,52 @@
+#' Load a clinical/phenotypic dataset associated with a study.
+#'
+#' Load a matrix of metadata associated with a study.
+#'
+#'
+#' @aliases loadPhenoData phenoData
+#' @param file Path and filename of the actual clinical file.
+#' @param tran Boolean. If the covariates are along the columns and samples
+#' along the rows, then tran should equal TRUE.
+#' @param sep The separator for the file.
+#' @return The metadata as a dataframe.
+#' @seealso \code{\link{loadMeta}}
+#' @examples
+#'
+#' dataDirectory <- system.file("extdata", package="metagenomeSeq")
+#' clin = loadPhenoData(file.path(dataDirectory,"CHK_clinical.csv"),tran=TRUE)
+#'
+loadPhenoData <-function(file,tran=TRUE,sep="\t")
+{
+ dat2 <- read.table(file,header=FALSE,sep=sep);
+
+# no. of subjects
+ subjects <- array(0,dim=c(ncol(dat2)-1));
+ for(i in 1:length(subjects)) {
+ subjects[i] <- as.character(dat2[1,i+1]);
+ }
+# no. of rows
+ rows <- nrow(dat2);
+
+# load remaining counts
+ matrix <- array(NA, dim=c(length(subjects),rows-1));
+ covar = array(NA,dim=c(rows-1,1));
+
+ for(i in 1:(rows)-1){
+ for(j in 1:(length(subjects))){
+ matrix[j,i] <- as.character(dat2[i+1,j+1]);
+ }
+ covar[i] = as.character(dat2[i+1,1]);
+ }
+
+
+ phenoData<-as.data.frame(matrix);
+
+ colnames(phenoData) = covar;
+ if(length(unique(subjects))==(length(subjects))){
+ rownames(phenoData) = subjects;
+ }
+ if(tran==TRUE){
+ phenoData = as.data.frame(t(phenoData))
+ }
+ return(phenoData);
+}
diff --git a/R/mergeMRexperiments.R b/R/mergeMRexperiments.R
new file mode 100644
index 0000000..0117530
--- /dev/null
+++ b/R/mergeMRexperiments.R
@@ -0,0 +1,103 @@
+#' Extract the essentials of an MRexperiment.
+#'
+#' @param obj MRexperiment-class object.
+#'
+#' @return \itemize{A list containing:
+#' \item counts : Count data
+#' \item librarySize : The column sums / library size / sequencing depth
+#' \item normFactors : The normalization scaling factors
+#' \item pheno : phenotype table
+#' \item feat : feature table
+#' }
+#'
+#' @examples
+#'
+#' data(mouseData)
+#' head(metagenomeSeq:::extractMR(mouseData))
+#'
+extractMR<-function(obj){
+ mat = MRcounts(obj)
+ ls = as.vector(libSize(obj))
+ norm= as.vector(normFactors(obj))
+ pd = pData(obj)
+ fd = fData(obj)
+ dat = list(counts=mat,librarySize=ls,normFactors=norm,pheno=pd,feat=fd)
+ return(dat)
+}
+
+#' Merge two tables
+#'
+#' @param x Table 1.
+#' @param y Table 2.
+#'
+#' @return Merged table
+#'
+mergeTable<-function(x,y){
+ rows = union(rownames(x),rownames(y))
+ cols = union(colnames(x),colnames(y))
+ fullmat = array(NA,dim=c(length(rows),length(cols)))
+ rownames(fullmat) = rows
+ colnames(fullmat) = cols
+ fullmat[rownames(x),colnames(x)] = as.matrix(x)
+ fullmat[rownames(y),colnames(y)] = as.matrix(y)
+ fullmat
+}
+
+#' Merge two MRexperiment objects together
+#'
+#' This function will take two MRexperiment objects and merge them together finding common
+#' OTUs. If there are OTUs not found in one of the two MRexperiments then a message will
+#' announce this and values will be coerced to zero for the second table.
+#'
+#' @param x MRexperiment-class object 1.
+#' @param y MRexperiment-class object 2.
+#'
+#' @return Merged MRexperiment-class object.
+#' @export
+#'
+#' @examples
+#' data(mouseData)
+#' newobj = mergeMRexperiments(mouseData,mouseData)
+#' newobj
+#'
+#' # let me know if people are interested in an option to merge by keys instead of row names.
+#' data(lungData)
+#' newobj = mergeMRexperiments(mouseData,lungData)
+#' newobj
+mergeMRexperiments<-function(x,y){
+ xdat = extractMR(x)
+ ydat = extractMR(y)
+ xmat = xdat$counts; ymat = ydat$counts
+ cnames = union(colnames(xmat),colnames(ymat))
+ if(length(cnames)!=(ncol(x)+ncol(y))){
+ message("MRexperiment 1 and 2 share sample ids; adding labels to sample ids.")
+ newXnames = paste(colnames(xmat),"x",sep=".")
+ newYnames = paste(colnames(ymat),"y",sep=".")
+ cnames = union(newXnames,newYnames)
+ colnames(xdat$counts) =
+ rownames(xdat$pheno) =
+ names(xdat$normFactors) =
+ names(xdat$librarySize) =
+ newXnames
+ colnames(ydat$counts) =
+ rownames(ydat$pheno) =
+ names(ydat$normFactors) =
+ names(ydat$librarySize) =
+ newYnames
+ }
+ counts = mergeTable(xdat$counts,ydat$counts)
+ pheno = as.data.frame(mergeTable(xdat$pheno,ydat$pheno))
+ feat = as.data.frame(mergeTable(xdat$feat,ydat$feat))
+ librarySize = c(xdat$librarySize,ydat$librarySize)
+ normFactors = c(xdat$normFactors,ydat$normFactors)
+ if(any(is.na(counts))){
+ message("There were OTUs not shared between objects. Coercing values to 0.")
+ counts[is.na(counts)] = 0
+ }
+ obj = newMRexperiment(counts=counts,
+ normFactors=normFactors,
+ libSize=librarySize,
+ phenoData = AnnotatedDataFrame(pheno),
+ featureData=AnnotatedDataFrame(feat))
+ return(obj)
+}
diff --git a/R/misc.R b/R/misc.R
new file mode 100644
index 0000000..1f6c931
--- /dev/null
+++ b/R/misc.R
@@ -0,0 +1,70 @@
+#' Table of features unique to a group
+#'
+#' Creates a table of features, their index, number of positive samples in a group,
+#' and the number of reads in a group. Can threshold features by a minimum no. of reads
+#' or no. of samples.
+#'
+#' @param obj Either a MRexperiment object or matrix.
+#' @param cl A vector representing assigning samples to a group.
+#' @param nsamples The minimum number of positive samples.
+#' @param nreads The minimum number of raw reads.
+#' @return Table of features unique to a group
+#' @examples
+#' data(mouseData)
+#' head(uniqueFeatures(mouseData[1:100,],cl=pData(mouseData)[,3]))
+#'
+uniqueFeatures<-function(obj,cl,nsamples=0,nreads=0){
+ if (class(obj) == "MRexperiment") {
+ mat = MRcounts(obj, norm = FALSE, log = FALSE)
+ }
+ else if (class(obj) == "matrix") {
+ mat = obj
+ }
+ else {
+ stop("Object needs to be either a MRexperiment object or matrix")
+ }
+ res = by(t(mat),cl,colSums)
+ res = do.call("rbind",res)
+ kreads = (colSums(res==0)>0)
+
+ mat = mat>0
+ resPos = by(t(mat),cl,colSums)
+ resPos = do.call("rbind",resPos)
+ ksamples = (colSums(resPos==0)>0)
+
+ featureIndices = intersect(which(ksamples),which(kreads))
+ numberReads = t(res[,featureIndices])
+ colnames(numberReads) = paste("Reads in",colnames(numberReads))
+ numberPosSamples = t(resPos[,featureIndices])
+ colnames(numberPosSamples) = paste("Samp. in",colnames(numberPosSamples))
+ featureIndices = featureIndices
+ featureNames = rownames(mat[featureIndices,])
+
+ df = cbind(featureIndices,numberPosSamples,numberReads)
+ interesting = which(rowSums(numberReads)>=nreads & rowSums(numberPosSamples)>=nsamples)
+ df[interesting,]
+}
+
+#' Function to make labels simpler
+#'
+#' Beginning to transition to better axes for plots
+#'
+#' @param x string for the x-axis
+#' @param y string for the y-axis
+#' @param norm is the data normalized?
+#' @param log is the data logged?
+#' @return vector of x,y labels
+#' @examples
+#' metagenomeSeq::makeLabels(norm=TRUE,log=TRUE)
+makeLabels<-function(x="samples",y="abundance",norm,log){
+ yl = xl = ""
+ if(log == TRUE){
+ yl = paste(yl,"Log2")
+ }
+ if(norm == TRUE){
+ yl = paste(yl,"normalized")
+ }
+ yl = paste(yl,y)
+ xl = paste(xl,x)
+ return(c(xl,yl))
+}
diff --git a/R/plotBubble.R b/R/plotBubble.R
new file mode 100644
index 0000000..cd8aea9
--- /dev/null
+++ b/R/plotBubble.R
@@ -0,0 +1,96 @@
+#' Basic plot of binned vectors.
+#'
+#' This function plots takes two vectors, calculates the contingency table and
+#' plots circles sized by the contingency table value. Optional significance vectors
+#' of the values significant will shade the circles by proportion of significance.
+#'
+#'
+#' @param yvector A vector of values represented along y-axis.
+#' @param xvector A vector of values represented along x-axis.
+#' @param sigvector A vector of the names of significant features (names should match x/yvector).
+#' @param nbreaks Number of bins to break yvector and xvector into.
+#' @param ybreak The values to break the yvector at.
+#' @param xbreak The values to break the xvector at.
+#' @param scale Scaling of circle bin sizes.
+#' @param local Boolean to shade by signficant bin numbers (TRUE) or overall proportion (FALSE).
+#' @param ... Additional plot arguments.
+#' @return A matrix of features along rows, and the group membership along columns.
+#' @seealso \code{\link{plotMRheatmap}}
+#' @examples
+#'
+#' data(mouseData)
+#' mouseData = mouseData[which(rowSums(mouseData)>139),]
+#' sparsity = rowMeans(MRcounts(mouseData)==0)
+#' lor = log(fitPA(mouseData,cl=pData(mouseData)[,3])$oddsRatio)
+#' plotBubble(lor,sparsity,main="lor ~ sparsity")
+#' # Example 2
+#' x = runif(100000)
+#' y = runif(100000)
+#' plotBubble(y,x)
+#'
+plotBubble<-function(yvector,xvector,sigvector=NULL,nbreaks=10, ybreak=quantile(yvector,p=seq(0,1,length.out=nbreaks)),
+ xbreak=quantile(xvector,p=seq(0,1,length.out=nbreaks)),scale=1,local=FALSE,...){
+
+ ybreaks = cut(yvector,breaks=ybreak,include.lowest=TRUE)
+ xbreaks = cut(xvector,breaks=xbreak,include.lowest=TRUE)
+ contTable = lapply(levels(xbreaks),function(i){
+ k = which(xbreaks==i)
+ sapply(levels(ybreaks),function(j){
+ length(which(ybreaks[k]==j))
+ })
+ })
+ names(contTable) = levels(xbreaks)
+ yvec = 1:length(levels(ybreaks))
+ nc = length(yvec)
+
+ if(!is.null(sigvector)){
+ # I am calculating contTable twice if sigvector==TRUE
+ # This can be changed to if else statement to return two rows
+ contSig = lapply(levels(xbreaks),function(i){
+ k = which(xbreaks==i)
+ sapply(levels(ybreaks),function(j){
+ x = sum(names(yvector[k])[which(ybreaks[k]==j)]%in%sigvector)/length(which(ybreaks[k]==j))
+ if(is.na(x)) x = 0
+ x
+ })
+ })
+ if(local==TRUE){
+ contSigTable = sapply(contSig,function(i){i})
+ linMap <- function(x, a, b) approxfun(range(x), c(a, b))(x)
+ if(length(levels(ybreak))!=length(levels(xbreak))) {
+ warning("Not square matrix - this is not implemented currently")
+ }
+ contSigTable = matrix(linMap(contSigTable,a=0,b=1),nrow=length(levels(ybreaks)))
+ for(i in 1:length(levels(ybreaks))){
+ contSig[[i]] = contSigTable[,i]
+ }
+ }
+ } else {
+ contSig = lapply(levels(xbreaks),function(i){
+ k = which(xbreaks==i)
+ sapply(levels(ybreaks),function(j){
+ 1
+ })
+ })
+ }
+
+ medianSizes = median(unlist(contTable))
+ plot(y=yvec,x=rep(1,nc),cex=scale*contTable[[1]]/medianSizes,
+ xlim=c(-0.25,nc+.25),ylim=c(-0.25,nc+.25),bty="n",xaxt="n",yaxt="n",
+ xlab="",ylab="",pch=21,...,bg=rgb(blue=1,red=0,green=0,alpha=contSig[[1]]))
+ for(i in 2:length(contTable)){
+ points(y=yvec,x=rep(i,nc),cex =scale*contTable[[i]]/medianSizes,pch=21,bg=rgb(blue=1,red=0,green=0,alpha=contSig[[i]]))
+ }
+ axis(1,at = 1:nc,labels=levels(xbreaks),las=2,cex.axis=.5)
+ axis(2,at = 1:nc,labels=levels(ybreaks),las=2,cex.axis=.5)
+
+ res = cbind(as.character(ybreaks),as.character(xbreaks))
+ colnames(res) = c("yvector","xvector")
+ rownames(res) = names(yvector)
+ if(is.null(sigvector)){
+ sig = rep(0,nrow(res))
+ sig[which(rownames(res)%in%sigvector)] = 1
+ res = cbind(res,sig)
+ }
+ invisible(res)
+}
diff --git a/R/plotCorr.R b/R/plotCorr.R
new file mode 100644
index 0000000..980933f
--- /dev/null
+++ b/R/plotCorr.R
@@ -0,0 +1,35 @@
+#' Basic correlation plot function for normalized or unnormalized counts.
+#'
+#' This function plots a heatmap of the "n" features with greatest variance
+#' across rows.
+#'
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param n The number of features to plot. This chooses the "n" features with greatest variance.
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param fun Function to calculate pair-wise relationships. Default is pearson
+#' correlation
+#' @param ... Additional plot arguments.
+#' @return plotted correlation matrix
+#' @seealso \code{\link{cumNormMat}}
+#' @examples
+#'
+#' data(mouseData)
+#' plotCorr(obj=mouseData,n=200,cexRow = 0.4,cexCol = 0.4,trace="none",dendrogram="none",
+#' col = colorRampPalette(brewer.pal(9, "RdBu"))(50))
+#'
+plotCorr <- function(obj,n,norm=TRUE,log=TRUE,fun=cor,...) {
+ mat = returnAppropriateObj(obj,norm,log)
+ otusToKeep <- which(rowSums(mat) > 0)
+ otuVars = rowSds(mat[otusToKeep, ])
+ otuIndices = otusToKeep[order(otuVars, decreasing = TRUE)[1:n]]
+ mat2 = mat[otuIndices, ]
+ cc = as.matrix(fun(t(mat2)))
+ hc = hclust(dist(mat2))
+ otuOrder = hc$order
+ cc = cc[otuOrder, otuOrder]
+ heatmap.2(t(cc),...)
+ invisible(t(cc))
+}
+
diff --git a/R/plotFeature.R b/R/plotFeature.R
new file mode 100644
index 0000000..7f008f0
--- /dev/null
+++ b/R/plotFeature.R
@@ -0,0 +1,73 @@
+#' Basic plot function of the raw or normalized data.
+#'
+#' This function plots the abundance of a particular OTU by class. The function
+#' is the typical manhattan plot of the abundances.
+#'
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param otuIndex The row to plot
+#' @param classIndex A list of the samples in their respective groups.
+#' @param col A vector to color samples by.
+#' @param sort Boolean, sort or not.
+#' @param sortby Default is sort by library size, alternative vector for sorting
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param sl Scaling factor - if MRexperiment and norm=TRUE.
+#' @param ... Additional plot arguments.
+#' @return counts and classindex
+#' @seealso \code{\link{cumNorm}}
+#' @examples
+#'
+#' data(mouseData)
+#' classIndex=list(Western=which(pData(mouseData)$diet=="Western"))
+#' classIndex$BK=which(pData(mouseData)$diet=="BK")
+#' otuIndex = 8770
+#'
+#' par(mfrow=c(2,1))
+#' dates = pData(mouseData)$date
+#' plotFeature(mouseData,norm=FALSE,log=FALSE,otuIndex,classIndex,
+#' col=dates,sortby=dates,ylab="Raw reads")
+#'
+plotFeature<-function(obj,otuIndex,classIndex,col="black",sort=TRUE,sortby=NULL,norm=TRUE,log=TRUE,sl=1000,...){
+ mat = returnAppropriateObj(obj,norm,log,sl)
+ fmat = mat[otuIndex,]
+ ylmin = min(fmat)
+ ylmax = max(fmat)
+
+ nplots = length(classIndex)
+ nms = names(classIndex)
+
+ counts = lapply(classIndex,function(i){
+ fmat[i]
+ })
+ if(sort==TRUE){
+ if(is.null(sortby)){
+ ord = lapply(classIndex,function(i){
+ order(colSums(mat[,i]))
+ })
+ } else{
+ ord = lapply(classIndex,function(i){
+ order(sortby[i])
+ })
+ }
+ } else {
+ ord = lapply(classIndex,function(i){
+ 1:length(i)
+ })
+ }
+ if(length(col)>1){
+ col = as.integer(factor(col))
+ col4groups = lapply(1:length(classIndex),function(i){
+ cindex = classIndex[[i]]
+ oindex = ord[[i]]
+ col[cindex[oindex]]
+ })
+ }
+ for(i in 1:nplots){
+ vals = counts[[i]][ord[[i]]]
+ if(exists("col4groups")) colors = col4groups[[i]]
+ else colors = col
+ plot(vals,xlab=nms[i],type="h",col=colors,ylim=c(ylmin,ylmax),...)
+ }
+ invisible(cbind(counts,ord))
+}
diff --git a/R/plotGenus.R b/R/plotGenus.R
new file mode 100644
index 0000000..5885747
--- /dev/null
+++ b/R/plotGenus.R
@@ -0,0 +1,69 @@
+#' Basic plot function of the raw or normalized data.
+#'
+#' This function plots the abundance of a particular OTU by class. The function
+#' uses the estimated posterior probabilities to make technical zeros
+#' transparent.
+#'
+#'
+#' @aliases genusPlot plotGenus
+#' @param obj An MRexperiment object with count data.
+#' @param otuIndex A list of the otus with the same annotation.
+#' @param classIndex A list of the samples in their respective groups.
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param no Which of the otuIndex to plot.
+#' @param jitter.factor Factor value for jitter
+#' @param pch Standard pch value for the plot command.
+#' @param labs Whether to include group labels or not. (TRUE/FALSE)
+#' @param xlab xlabel for the plot.
+#' @param ylab ylabel for the plot.
+#' @param jitter Boolean to jitter the count data or not.
+#' @param ... Additional plot arguments.
+#' @return plotted data
+#' @seealso \code{\link{cumNorm}}
+#' @examples
+#'
+#' data(mouseData)
+#' classIndex=list(controls=which(pData(mouseData)$diet=="BK"))
+#' classIndex$cases=which(pData(mouseData)$diet=="Western")
+#' otuIndex = grep("Strep",fData(mouseData)$family)
+#' otuIndex=otuIndex[order(rowSums(MRcounts(mouseData)[otuIndex,]),decreasing=TRUE)]
+#' plotGenus(mouseData,otuIndex,classIndex,no=1:2,xaxt="n",norm=FALSE,ylab="Strep normalized log(cpt)")
+#'
+plotGenus <-
+function(obj,otuIndex,classIndex,norm=TRUE,log=TRUE,no=1:length(otuIndex),labs=TRUE,xlab=NULL,ylab=NULL,jitter=TRUE,jitter.factor=1,pch=21,...){
+
+ mat = returnAppropriateObj(obj,norm,log)
+ l=lapply(otuIndex[no], function(i) lapply(classIndex, function(j) {
+ mat[i,j]
+ }))
+
+ l=unlist(l,recursive=FALSE)
+ if(!is.list(l)) stop("l must be a list\n")
+ y=unlist(l)
+ x=rep(seq(along=l),sapply(l,length))
+
+ z = posteriorProbs(obj)
+ #if(!is.null(z)){
+ # z = 1-z;
+ # lz=lapply(classIndex,function(j){(z[otuIndex[no],j])})
+ # z = unlist(lz)
+ # blackCol=t(col2rgb("black"))
+ # col=rgb(blackCol,alpha=z)
+ #} else {
+ blackCol=t(col2rgb("black"))
+ col=rgb(blackCol)
+ #}
+ if(jitter) x=jitter(x,jitter.factor)
+
+ if(is.null(ylab)){ylab="Normalized log(cpt)"}
+ if(is.null(xlab)){xlab="Groups of comparison"}
+
+ plot(x,y,col=col,pch=pch,xlab=xlab,ylab=ylab,xaxt="n",...)
+ if(labs==TRUE){
+ gp = rep(names(classIndex),length(no))
+ axis(1,at=seq(1:length(gp)),gp)
+ }
+
+ invisible(list(x=x,y=y))
+}
diff --git a/R/plotMRheatmap.R b/R/plotMRheatmap.R
new file mode 100644
index 0000000..90dbc93
--- /dev/null
+++ b/R/plotMRheatmap.R
@@ -0,0 +1,37 @@
+#' Basic heatmap plot function for normalized counts.
+#'
+#' This function plots a heatmap of the 'n' features with greatest variance
+#' across rows (or other statistic).
+#'
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param n The number of features to plot. This chooses the 'n' features of greatest positive statistic.
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param fun Function to select top 'n' features.
+#' @param ... Additional plot arguments.
+#' @return plotted matrix
+#' @seealso \code{\link{cumNormMat}}
+#' @examples
+#'
+#' data(mouseData)
+#' trials = pData(mouseData)$diet
+#' heatmapColColors=brewer.pal(12,"Set3")[as.integer(factor(trials))];
+#' heatmapCols = colorRampPalette(brewer.pal(9, "RdBu"))(50)
+#' #### version using sd
+#' plotMRheatmap(obj=mouseData,n=200,cexRow = 0.4,cexCol = 0.4,trace="none",
+#' col = heatmapCols,ColSideColors = heatmapColColors)
+#' #### version using MAD
+#' plotMRheatmap(obj=mouseData,n=50,fun=mad,cexRow = 0.4,cexCol = 0.4,trace="none",
+#' col = heatmapCols,ColSideColors = heatmapColColors)
+#'
+plotMRheatmap <- function(obj,n,norm=TRUE,log=TRUE,fun=sd,...) {
+ mat = returnAppropriateObj(obj,norm,log)
+
+ otusToKeep = which(rowSums(mat)>0);
+ otuStats = apply(mat[otusToKeep,],1,fun);
+ otuIndices = otusToKeep[order(otuStats,decreasing=TRUE)[1:n]];
+ mat2=mat[otuIndices,];
+ heatmap.2(mat2,...);
+ invisible(mat2)
+}
diff --git a/R/plotOTU.R b/R/plotOTU.R
new file mode 100644
index 0000000..89c02b1
--- /dev/null
+++ b/R/plotOTU.R
@@ -0,0 +1,64 @@
+#' Basic plot function of the raw or normalized data.
+#'
+#' This function plots the abundance of a particular OTU by class. The function
+#' uses the estimated posterior probabilities to make technical zeros
+#' transparent.
+#'
+#'
+#' @param obj A MRexperiment object with count data.
+#' @param otu The row number/OTU to plot.
+#' @param classIndex A list of the samples in their respective groups.
+#' @param log Whether or not to log2 transform the counts - if MRexperiment object.
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param jitter.factor Factor value for jitter.
+#' @param pch Standard pch value for the plot command.
+#' @param labs Whether to include group labels or not. (TRUE/FALSE)
+#' @param xlab xlabel for the plot.
+#' @param ylab ylabel for the plot.
+#' @param jitter Boolean to jitter the count data or not.
+#' @param ... Additional plot arguments.
+#' @return Plotted values
+#' @seealso \code{\link{cumNorm}}
+#' @examples
+#'
+#' data(mouseData)
+#' classIndex=list(controls=which(pData(mouseData)$diet=="BK"))
+#' classIndex$cases=which(pData(mouseData)$diet=="Western")
+#' # you can specify whether or not to normalize, and to what level
+#' plotOTU(mouseData,otu=9083,classIndex,norm=FALSE,main="9083 feature abundances")
+#'
+plotOTU <-
+function(obj,otu,classIndex,log=TRUE,norm=TRUE,jitter.factor=1,pch=21,labs=TRUE,xlab=NULL,ylab=NULL,jitter=TRUE,...){
+ mat = returnAppropriateObj(obj,norm,log)
+
+ l=lapply(classIndex, function(j){
+ mat[otu,j]
+ })
+
+ z = posteriorProbs(obj)
+ y=unlist(l)
+ x=rep(seq(along=l),sapply(l,length))
+
+ if(!is.null(z)){
+ z = 1-z;
+ lz=lapply(classIndex,function(j){(z[otu,j])})
+ z = unlist(lz)
+ blackCol=t(col2rgb("black"))
+ col=rgb(blackCol,alpha=z)
+ } else {
+ blackCol=t(col2rgb("black"))
+ col=rgb(blackCol)
+ }
+
+ if(jitter) x=jitter(x,jitter.factor)
+
+ if(is.null(ylab)){ylab="Normalized log(cpt)"}
+ if(is.null(xlab)){xlab="Groups of comparison"}
+
+ plot(x,y,col=col,pch=pch,bg=col,xlab=xlab,ylab=ylab,xaxt="n",...)
+ if(labs==TRUE){
+ gp = names(classIndex)
+ axis(1,at=seq(1:length(gp)),gp)
+ }
+ invisible(list(x=x,y=y))
+}
diff --git a/R/plotOrd.R b/R/plotOrd.R
new file mode 100644
index 0000000..9ff2a3b
--- /dev/null
+++ b/R/plotOrd.R
@@ -0,0 +1,59 @@
+#' Plot of either PCA or MDS coordinates for the distances of normalized or unnormalized counts.
+#'
+#' This function plots the PCA / MDS coordinates for the "n" features of interest. Potentially uncovering batch
+#' effects or feature relationships.
+#'
+#'
+#' @param obj A MRexperiment object or count matrix.
+#' @param tran Transpose the matrix.
+#' @param comp Which components to display
+#' @param usePCA TRUE/FALSE whether to use PCA or MDS coordinates (TRUE is PCA).
+#' @param useDist TRUE/FALSE whether to calculate distances.
+#' @param distfun Distance function, default is stats::dist
+#' @param dist.method If useDist==TRUE, what method to calculate distances.
+#' @param norm Whether or not to normalize the counts - if MRexperiment object.
+#' @param log Whether or not to log2 the counts - if MRexperiment object.
+#' @param n Number of features to make use of in calculating your distances.
+#' @param ... Additional plot arguments.
+#' @return coordinates
+#' @seealso \code{\link{cumNormMat}}
+#' @examples
+#'
+#' data(mouseData)
+#' cl = pData(mouseData)[,3]
+#' plotOrd(mouseData,tran=TRUE,useDist=TRUE,pch=21,bg=factor(cl),usePCA=FALSE)
+#'
+plotOrd<-function(obj,tran=TRUE,comp=1:2,norm=TRUE,log=TRUE,usePCA=TRUE,useDist=FALSE,distfun=stats::dist,dist.method="euclidian",n=NULL,...){
+ mat = returnAppropriateObj(obj,norm,log)
+ if(useDist==FALSE & usePCA==FALSE) stop("Classical MDS requires distances")
+ if(is.null(n)) n = min(nrow(mat),1000)
+ if(length(comp)>2) stop("Can't display more than two components")
+
+ otusToKeep <- which(rowSums(mat)>0)
+ otuVars<-rowSds(mat[otusToKeep,])
+ otuIndices<-otusToKeep[order(otuVars,decreasing=TRUE)[seq_len(n)]]
+ mat <- mat[otuIndices,]
+
+ if(tran==TRUE){
+ mat = t(mat)
+ }
+ if(useDist==TRUE){
+ d <- distfun(mat,method=dist.method)
+ } else{ d = mat }
+
+ if(usePCA==FALSE){
+ ord = cmdscale(d,k = max(comp))
+ xl = paste("MDS component:",comp[1])
+ yl = paste("MDS component:",comp[2])
+ } else{
+ pcaRes <- prcomp(d)
+ ord <- pcaRes$x
+ vars <- pcaRes$sdev^2
+ vars <- round(vars/sum(vars),5)*100
+ xl <- sprintf("PCA %s: %.2f%% variance",colnames(ord)[comp[1]], vars[comp[1]])
+ yl <- sprintf("PCA %s: %.2f%% variance",colnames(ord)[comp[2]], vars[comp[2]])
+ }
+
+ plot(ord[,comp],ylab=yl,xlab=xl,...)
+ invisible(ord[,comp])
+}
diff --git a/R/plotRare.R b/R/plotRare.R
new file mode 100644
index 0000000..cb712a6
--- /dev/null
+++ b/R/plotRare.R
@@ -0,0 +1,42 @@
+#' Plot of rarefaction effect
+#'
+#' This function plots the number of observed features vs. the depth of coverage.
+#'
+#' @param obj A MRexperiment object with count data or matrix.
+#' @param cl Vector of classes for various samples.
+#' @param ... Additional plot arguments.
+#' @return Library size and number of detected features
+#' @seealso \code{\link{plotOrd}}, \code{\link{plotMRheatmap}}, \code{\link{plotCorr}}, \code{\link{plotOTU}}, \code{\link{plotGenus}}
+#' @examples
+#'
+#' data(mouseData)
+#' cl = factor(pData(mouseData)[,3])
+#' res = plotRare(mouseData,cl=cl,pch=21,bg=cl)
+#' tmp=lapply(levels(cl), function(lv) lm(res[,"ident"]~res[,"libSize"]-1, subset=cl==lv))
+#' for(i in 1:length(levels(cl))){
+#' abline(tmp[[i]], col=i)
+#' }
+#' legend("topleft", c("Diet 1","Diet 2"), text.col=c(1,2),box.col=NA)
+#'
+plotRare<-function(obj,cl=NULL,...){
+ if(class(obj)=="MRexperiment"){
+ mat = MRcounts(obj,norm=FALSE,log=FALSE)
+ totalCounts = libSize(obj)
+ } else if(class(obj) == "matrix") {
+ mat = obj
+ totalCounts=colSums(mat)
+ } else {
+ stop("Object needs to be either a MRexperiment object or matrix")
+ }
+ numFeatures=colSums(mat!=0)
+
+ if(is.null(cl)){
+ plot(totalCounts, numFeatures, xlab = "Depth of coverage", ylab = "Number of detected features",...)
+ } else{
+ plot(totalCounts, numFeatures, xlab = "Depth of coverage", ylab = "Number of detected features",col=factor(cl),...)
+ }
+
+ dat = cbind(totalCounts,numFeatures);
+ colnames(dat) = c("libSize","ident")
+ invisible(dat)
+}
diff --git a/R/zigControl.R b/R/zigControl.R
new file mode 100644
index 0000000..4eada99
--- /dev/null
+++ b/R/zigControl.R
@@ -0,0 +1,29 @@
+#' Settings for the fitZig function
+#'
+#' @param tol The tolerance for the difference in negative log likelihood estimates for a feature to remain active.
+#' @param maxit The maximum number of iterations for the expectation-maximization algorithm.
+#' @param verbose Whether to display iterative step summary statistics or not.
+#' @param dfMethod Either 'default' or 'modified' (by responsibilities).
+#' @param pvalMethod Either 'default' or 'bootstrap'.
+#' @return The value for the tolerance, maximum no. of iterations, and the verbose warning.
+#' @note \code{\link{fitZig}} makes use of zigControl.
+#'
+#' @name zigControl
+#' @aliases settings2
+#' @seealso \code{\link{fitZig}} \code{\link{cumNorm}} \code{\link{plotOTU}}
+#' @examples
+#' control = zigControl(tol=1e-10,maxit=10,verbose=FALSE)
+#'
+zigControl <-function(tol=1e-4,maxit=10,verbose=TRUE,dfMethod="modified",pvalMethod="default"){
+ # to do: add stop if not
+ DFMETHODS <- c("default", "modified")
+ PMETHODS <- c("default", "bootstrap")
+ dfMethod <- DFMETHODS[pmatch(dfMethod, DFMETHODS)]
+ pvalMethod<- PMETHODS[pmatch(pvalMethod,PMETHODS)]
+
+ stopifnot(dfMethod%in%DFMETHODS)
+ stopifnot(pvalMethod%in%PMETHODS)
+
+ set <-list(tol=tol,maxit=maxit,verbose=verbose,dfMethod=dfMethod,pvalMethod=pvalMethod);
+ return(set)
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2c356d7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+metagenomeSeq
+=============
+
+Statistical analysis for sparse high-throughput sequencing
+
+[![Travis-CI Build Status](https://travis-ci.org/HCBravoLab/metagenomeSeq.svg?branch=master)](https://travis-ci.org/HCBravoLab/metagenomeSeq)
+<a href="http://www.bioconductor.org/packages/devel/bioc/html/metagenomeSeq.html#since"><img border="0" src="http://www.bioconductor.org/shields/years-in-bioc/metagenomeSeq.svg" title="How long since the package was first in a released Bioconductor version (or is it in devel only)."></a> <a href="http://bioconductor.org/packages/stats/bioc/metagenomeSeq.html"><img border="0" src="http://www.bioconductor.org/shields/downloads/metagenomeSeq.svg" title="Percentile (top 5/20/50% or 'availabl [...]
+
+
+metagenomeSeq is designed to determine features (be it Operational Taxanomic Unit (OTU), species, etc.)
+that are differentially abundant between two or more groups of multiple samples. metagenomeSeq is designed
+to address the effects of both normalization and undersampling of microbial communities on disease
+association detection and the testing of feature correlations.
+
+To install the latest release version of metagenomeSeq:
+```S
+source("http://bioconductor.org/biocLite.R")
+biocLite("metagenomeSeq")
+```
+
+To install the latest development version of metagenomeSeq:
+```S
+install.packages("devtools")
+library("devtools")
+install_github("Bioconductor-mirror/metagenomeSeq")
+```
+
+Author: [Joseph Nathaniel Paulson](http://bcb.dfci.harvard.edu/~jpaulson), Hisham Talukder, [Mihai Pop](http://www.cbcb.umd.edu/~mpop), [Hector Corrada Bravo](http://www.cbcb.umd.edu/~hcorrada)
+
+Maintainer: Joseph N. Paulson : jpaulson at jimmy.harvard.edu
+
+Website: www.cbcb.umd.edu/software/metagenomeSeq
diff --git a/build/vignette.rds b/build/vignette.rds
new file mode 100644
index 0000000..5705571
Binary files /dev/null and b/build/vignette.rds differ
diff --git a/data/lungData.rda b/data/lungData.rda
new file mode 100644
index 0000000..65098a3
Binary files /dev/null and b/data/lungData.rda differ
diff --git a/data/mouseData.rda b/data/mouseData.rda
new file mode 100644
index 0000000..048d321
Binary files /dev/null and b/data/mouseData.rda differ
diff --git a/debian/README.test b/debian/README.test
deleted file mode 100644
index 98dc1a1..0000000
--- a/debian/README.test
+++ /dev/null
@@ -1,10 +0,0 @@
-Notes on how this package can be tested.
-────────────────────────────────────────
-
-You can run the test suite by doing
-
-R --no-save <<EOT
-BiocGenerics:::testPackage("metagenomeSeq")
-EOT
-
- -- Andreas Tille <tille at debian.org> Mon, 16 Jun 2014 16:28:55 +0200
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 5d04434..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,22 +0,0 @@
-r-bioc-metagenomeseq (1.16.0-2) unstable; urgency=medium
-
- * Add missing test dependency: r-cran-testthat
- * debhelper 10
- * d/watch: version=4
-
- -- Andreas Tille <tille at debian.org> Sun, 15 Jan 2017 15:46:55 +0100
-
-r-bioc-metagenomeseq (1.16.0-1) unstable; urgency=medium
-
- * New upstream version
- * Convert to dh-r
- * Generic BioConductor homepage
- * Use testthat for autopkgtest since other unittest is empty
-
- -- Andreas Tille <tille at debian.org> Fri, 04 Nov 2016 14:55:51 +0100
-
-r-bioc-metagenomeseq (1.14.2-1) unstable; urgency=low
-
- * Initial release (closes: #835135)
-
- -- Andreas Tille <tille at debian.org> Mon, 22 Aug 2016 22:15:51 +0200
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index f599e28..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-10
diff --git a/debian/control b/debian/control
deleted file mode 100644
index df914dc..0000000
--- a/debian/control
+++ /dev/null
@@ -1,34 +0,0 @@
-Source: r-bioc-metagenomeseq
-Maintainer: Debian Med Packaging Team <debian-med-packaging at lists.alioth.debian.org>
-Uploaders: Andreas Tille <tille at debian.org>
-Section: gnu-r
-Priority: optional
-Build-Depends: debhelper (>= 10),
- dh-r,
- r-base-dev,
- r-bioc-biobase,
- r-bioc-limma,
- r-cran-glmnet,
- r-cran-rcolorbrewer,
- r-cran-matrixstats,
- r-cran-foreach,
- r-cran-matrix,
- r-cran-gplots
-Standards-Version: 3.9.8
-Vcs-Browser: https://anonscm.debian.org/viewvc/debian-med/trunk/packages/R/r-bioc-metagenomeseq/trunk/
-Vcs-Svn: svn://anonscm.debian.org/debian-med/trunk/packages/R/r-bioc-metagenomeseq/trunk/
-Homepage: https://bioconductor.org/packages/metagenomeSeq/
-
-Package: r-bioc-metagenomeseq
-Architecture: all
-Depends: ${R:Depends},
- ${misc:Depends}
-Recommends: ${R:Recommends}
-Suggests: ${R:Suggests}
-Description: GNU R statistical analysis for sparse high-throughput sequencing
- MetagenomeSeq is designed to determine features (be it Operational
- Taxanomic Unit (OTU), species, etc.) that are differentially abundant
- between two or more groups of multiple samples. metagenomeSeq is
- designed to address the effects of both normalization and under-sampling
- of microbial communities on disease association detection and the
- testing of feature correlations.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 73e629c..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,106 +0,0 @@
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: metagenomeSeq
-Upstream-Contact: Joseph N. Paulson <jpaulson at jimmy.harvard.edu>
-Source: https://bioconductor.org/packages/metagenomeSeq/
-
-Files: *
-Copyright: © 2010-2016 Joseph N. Paulson <jpaulson at jimmy.harvard.edu>
-License: Artistic-2.0
-
-Files: debian/*
-Copyright: 2016 Andreas Tille <tille at debian.org>
-License: Artistic-2.0
-
-License: Artistic-2.0
- The "Artistic License"
- .
- Preamble
- .
- 1. You may make and give away verbatim copies of the source form of the
- Standard Version of this Package without restriction, provided that
- you duplicate all of the original copyright notices and associated
- disclaimers.
- .
- 2. You may apply bug fixes, portability fixes and other modifications
- derived from the Public Domain or from the Copyright Holder. A
- Package modified in such a way shall still be considered the Standard
- Version.
- .
- 3. You may otherwise modify your copy of this Package in any way,
- provided that you insert a prominent notice in each changed file stating
- how and when you changed that file, and provided that you do at least
- ONE of the following:
- .
- a) place your modifications in the Public Domain or otherwise make them
- Freely Available, such as by posting said modifications to Usenet or
- an equivalent medium, or placing the modifications on a major archive
- site such as uunet.uu.net, or by allowing the Copyright Holder to include
- your modifications in the Standard Version of the Package.
- .
- b) use the modified Package only within your corporation or organization.
- .
- c) rename any non-standard executables so the names do not conflict
- with standard executables, which must also be provided, and provide
- a separate manual page for each non-standard executable that clearly
- documents how it differs from the Standard Version.
- .
- d) make other distribution arrangements with the Copyright Holder.
- .
- 4. You may distribute the programs of this Package in object code or
- executable form, provided that you do at least ONE of the following:
- .
- a) distribute a Standard Version of the executables and library files,
- together with instructions (in the manual page or equivalent) on where
- to get the Standard Version.
- .
- b) accompany the distribution with the machine-readable source of
- the Package with your modifications.
- .
- c) give non-standard executables non-standard names, and clearly
- document the differences in manual pages (or equivalent), together
- with instructions on where to get the Standard Version.
- .
- d) make other distribution arrangements with the Copyright Holder.
- .
- 5. You may charge a reasonable copying fee for any distribution of this
- Package. You may charge any fee you choose for support of this Package.
- You may not charge a fee for this Package itself. However, you may
- distribute this Package in aggregate with other (possibly commercial)
- programs as part of a larger (possibly commercial) software distribution
- provided that you do not advertise this Package as a product of your
- own. You may embed this Package's interpreter within an executable of
- yours (by linking); this shall be construed as a mere form of
- aggregation, provided that the complete Standard Version of the
- interpreter is so embedded.
- .
- 6. The scripts and library files supplied as input to or produced as
- output from the programs of this Package do not automatically fall under
- the copyright of this Package, but belong to whoever generated them, and
- may be sold commercially, and may be aggregated with this Package. If
- such scripts or library files are aggregated with this Package via the
- so-called "undump" or "unexec" methods of producing a binary executable
- image, then distribution of such an image shall neither be construed as
- a distribution of this Package nor shall it fall under the restrictions
- of Paragraphs 3 and 4, provided that you do not represent such an
- executable image as a Standard Version of this Package.
- .
- 7. C subroutines (or comparably compiled subroutines in other
- languages) supplied by you and linked into this Package in order to
- emulate subroutines and variables of the language defined by this
- Package shall not be considered part of this Package, but are the
- equivalent of input as in Paragraph 6, provided these subroutines do
- not change the language in any way that would cause it to fail the
- regression tests for the language.
- .
- 8. Aggregation of this Package with a commercial distribution is always
- permitted provided that the use of this Package is embedded; that is,
- when no overt attempt is made to make this Package's interfaces visible
- to the end user of the commercial distribution. Such use shall not be
- construed as a distribution of this Package.
- .
- 9. The name of the Copyright Holder may not be used to endorse or promote
- products derived from this software without specific prior written permission.
- .
- 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/debian/docs b/debian/docs
deleted file mode 100644
index 960011c..0000000
--- a/debian/docs
+++ /dev/null
@@ -1,3 +0,0 @@
-tests
-debian/README.test
-debian/tests/run-unit-test
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 68d9a36..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/make -f
-
-%:
- dh $@ --buildsystem R
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/debian/tests/control b/debian/tests/control
deleted file mode 100644
index b044b0c..0000000
--- a/debian/tests/control
+++ /dev/null
@@ -1,3 +0,0 @@
-Tests: run-unit-test
-Depends: @, r-cran-testthat
-Restrictions: allow-stderr
diff --git a/debian/tests/run-unit-test b/debian/tests/run-unit-test
deleted file mode 100644
index ae67c0b..0000000
--- a/debian/tests/run-unit-test
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh -e
-
-oname=metagenomeSeq
-pkg=r-bioc-`echo $oname | tr '[A-Z]' '[a-z]'`
-
-if [ "$ADTTMP" = "" ] ; then
- ADTTMP=`mktemp -d /tmp/${pkg}-test.XXXXXX`
- trap "rm -rf $ADTTMP" 0 INT QUIT ABRT PIPE TERM
-fi
-cd $ADTTMP
-cp -a /usr/share/doc/${pkg}/tests/* $ADTTMP
-find . -name "*.gz" -exec gunzip \{\} \;
-LC_ALL=C R --no-save < testthat.R
diff --git a/debian/watch b/debian/watch
deleted file mode 100644
index 8e57cec..0000000
--- a/debian/watch
+++ /dev/null
@@ -1,3 +0,0 @@
-version=4
-opts=downloadurlmangle=s?^(.*)\.\.?http:$1packages/release/bioc? \
- http://www.bioconductor.org/packages/release/bioc/html/metagenomeSeq.html .*/metagenomeSeq_([\d\.]+)\.tar\.gz
diff --git a/inst/CITATION b/inst/CITATION
new file mode 100644
index 0000000..5faf6e7
--- /dev/null
+++ b/inst/CITATION
@@ -0,0 +1,50 @@
+citHeader("Please cite the top for the original statistical method and normalization method implemented in metagenomeSeq and the bottom for the software/vignette guide. Time series analysis/function is described in the third citation.")
+
+citEntry(entry="article",
+ title = "Differential abundance analysis for microbial marker-gene surveys",
+ author = personList( as.person("Joseph N. Paulson"),
+ as.person("Oscar Colin Stine"),
+ as.person("Hector Corrada Bravo"),
+ as.person("Mihai Pop")),
+ year = 2013,
+ journal = "Nat Meth",
+ volume = "advance online publication",
+ pages = "",
+ doi = "10.1038/nmeth.2658",
+ url = "http://www.nature.com/nmeth/journal/vaop/ncurrent/abs/nmeth.2658.html",
+ textVersion =
+ paste("JN Paulson, OC Stine, HC Bravo, M Pop. ",
+ "Differential abundance analysis for microbial marker-gene surveys.",
+ "Nat Meth", "Accepted" ) )
+
+citEntry(entry="manual",
+ title = "metagenomeSeq: Statistical analysis for sparse high-throughput sequncing.",
+ author = personList( as.person("Joseph N. Paulson"),
+ as.person("Mihai Pop"),
+ as.person("Hector Corrada Bravo")),
+ year = 2013,
+ note = "Bioconductor package",
+ url = "http://www.cbcb.umd.edu/software/metagenomeSeq",
+
+ textVersion =
+ paste("JN Paulson, H Talukder, M Pop, HC Bravo. ",
+ "metagenomeSeq: Statistical analysis for sparse high-throughput sequencing. ",
+ "Bioconductor package: ", packageVersion("metagenomeSeq"), ". http://cbcb.umd.edu/software/metagenomeSeq",sep="") )
+
+citEntry(entry="article",
+ title = "Longitudinal differential abundance analysis of marker-gene surveys",
+ author = personList( as.person("Hisham Talukder*"),
+ as.person("Joseph N. Paulson*"),
+ as.person("Hector Corrada Bravo")),
+ year = "2014",
+ journal = "XX",
+ volume = "",
+ pages = "",
+ doi = "",
+ url = "",
+ textVersion =
+ paste("H Talukder*, JN Paulson*, HC Bravo.",
+ "Longitudinal differential abundance analysis of marker-gene surveys.",
+ "Submitted")
+)
+
diff --git a/inst/doc/fitTimeSeries.R b/inst/doc/fitTimeSeries.R
new file mode 100644
index 0000000..762ed2f
--- /dev/null
+++ b/inst/doc/fitTimeSeries.R
@@ -0,0 +1,120 @@
+## ----include=FALSE-------------------------------------------------------
+require(knitr)
+opts_chunk$set(concordance=TRUE,tidy=TRUE)
+
+## ----config,echo=FALSE-----------------------------------------
+options(width = 65)
+options(continue=" ")
+options(warn=-1)
+set.seed(42)
+
+## ----requireMetagenomeSeq,warning=FALSE,message=FALSE----------
+library(metagenomeSeq)
+library(gss)
+
+## ----dataset2,tidy=FALSE---------------------------------------
+data(mouseData)
+mouseData
+
+## ----createMRexperiment1---------------------------------------
+# Creating mock sample replicates
+sampleID = rep(paste("sample",1:10,sep=":"),times=20)
+# Creating mock class membership
+class = rep(c(rep(0,5),rep(1,5)),times=20)
+# Creating mock time
+time = rep(1:20,each=10)
+
+phenotypeData = AnnotatedDataFrame(data.frame(sampleID,class,time))
+# Creating mock abundances
+set.seed(1)
+# No difference
+measurement1 = rnorm(200,mean=100,sd=1)
+# Some difference
+measurement2 = rnorm(200,mean=100,sd=1)
+measurement2[1:5]=measurement2[1:5] + 100
+measurement2[11:15]=measurement2[11:15] + 100
+measurement2[21:25]=measurement2[21:25] + 50
+mat = rbind(measurement1,measurement2)
+colnames(mat) = 1:200
+mat[1:2,1:10]
+
+## ----createMRexperiment2---------------------------------------
+# This is an example of potential lvl's to aggregate by.
+data(mouseData)
+colnames(fData(mouseData))
+
+## ----createMRexperiment3,tidy=FALSE----------------------------
+obj = newMRexperiment(counts=mat,phenoData=phenotypeData)
+obj
+res1 = fitTimeSeries(obj,feature=1,
+ class='class',time='time',id='sampleID',
+ B=10,norm=FALSE,log=FALSE)
+res2 = fitTimeSeries(obj,feature=2,
+ class='class',time='time',id='sampleID',
+ B=10,norm=FALSE,log=FALSE)
+
+
+classInfo = factor(res1$data$class)
+par(mfrow=c(3,1))
+plotClassTimeSeries(res1,pch=21,bg=classInfo)
+plotTimeSeries(res2)
+plotClassTimeSeries(res2,pch=21,bg=classInfo)
+
+## ----timeSeries------------------------------------------------
+res = fitTimeSeries(obj=mouseData,lvl="class",feature="Actinobacteria",class="status",id="mouseID",time="relativeTime",B=10)
+
+# We observe a time period of differential abundance for "Actinobacteria"
+res$timeIntervals
+
+str(res)
+
+## ----timeSeriesAllClasses, tidy=FALSE--------------------------
+classes = unique(fData(mouseData)[,"class"])
+
+timeSeriesFits = lapply(classes,function(i){
+ fitTimeSeries(obj=mouseData,
+ feature=i,
+ class="status",
+ id="mouseID",
+ time="relativeTime",
+ lvl='class',
+ C=.3,# a cutoff for 'interesting'
+ B=1) # B is the number of permutations and should clearly not be 1
+ })
+names(timeSeriesFits) = classes
+
+# Removing classes of bacteria without a potentially
+# interesting time interval difference.
+timeSeriesFits = sapply(timeSeriesFits,function(i){i[[1]]})[-grep("No",timeSeriesFits)]
+
+# Naming the various interesting time intervals.
+for(i in 1:length(timeSeriesFits)){
+ rownames(timeSeriesFits[[i]]) =
+ paste(
+ paste(names(timeSeriesFits)[i]," interval",sep=""),
+ 1:nrow(timeSeriesFits[[i]]),sep=":"
+ )
+}
+
+# Merging into a table.
+timeSeriesFits = do.call(rbind,timeSeriesFits)
+
+# Correcting for multiple testing.
+pvalues = timeSeriesFits[,"p.value"]
+adjPvalues = p.adjust(pvalues,"bonferroni")
+timeSeriesFits = cbind(timeSeriesFits,adjPvalues)
+
+head(timeSeriesFits)
+
+## ----timeSeriesPlotting----------------------------------------
+par(mfrow=c(2,1))
+plotClassTimeSeries(res,pch=21,
+ bg=res$data$class,ylim=c(0,8))
+plotTimeSeries(res)
+
+## ----cite------------------------------------------------------
+citation("metagenomeSeq")
+
+## ----sessionInfo-----------------------------------------------
+sessionInfo()
+
diff --git a/inst/doc/fitTimeSeries.Rnw b/inst/doc/fitTimeSeries.Rnw
new file mode 100644
index 0000000..4ca891a
--- /dev/null
+++ b/inst/doc/fitTimeSeries.Rnw
@@ -0,0 +1,278 @@
+%\VignetteIndexEntry{fitTimeSeries: differential abundance analysis through time or location}
+%\VignetteEngine{knitr::knitr}
+\documentclass[a4paper,11pt]{article}
+\usepackage{url}
+\usepackage{afterpage}
+\usepackage{hyperref}
+\usepackage{geometry}
+\usepackage{cite}
+\geometry{hmargin=2.5cm, vmargin=2.5cm}
+\usepackage{graphicx}
+\usepackage{courier}
+\bibliographystyle{unsrt}
+
+\begin{document}
+<<include=FALSE>>=
+require(knitr)
+opts_chunk$set(concordance=TRUE,tidy=TRUE)
+@
+
+\title{{\textbf{\texttt{fitTimeSeries}: Longitudinal differential abundance analysis for marker-gene surveys}}}
+\author{Hisham Talukder, Joseph N. Paulson, Hector Corrada Bravo\\[1em]\\ Applied Mathematics $\&$ Statistics, and Scientific Computation\\ Center for Bioinformatics and Computational Biology\\ University of Maryland, College Park\\[1em]\\ \texttt{jpaulson at umiacs.umd.edu}}
+\date{Modified: February 18, 2015. Compiled: \today}
+\maketitle
+\tableofcontents
+
+\newpage
+
+<<config,echo=FALSE>>=
+options(width = 65)
+options(continue=" ")
+options(warn=-1)
+set.seed(42)
+@
+
+\section{Introduction}
+\textbf{This is a vignette specifically for the fitTimeSeries function. For a full list of functions available in the package:
+help(package=metagenomeSeq). For more information about a particular function call: ?function.}
+
+Smoothing spline regression models~\cite{Wahba:1990} are commonly used to model longitudinal data and form the basis for methods used in a large number of applications ~\cite{networkped1,LongCrisp}. Specifically, an extension of the methodology called Smoothing-Spline ANOVA~\cite{Gu} is capable of directly estimating a smooth function of interest while incorporating other covariates in the model.
+
+A common approach to detect regions/times of interest in a genome or for differential abundance is to model differences between two groups with respect to the quantitative measurements as smooth functions and perform statistical inference on these models. In particular, widely used methods for region finding using DNA methylation data use local regression methods to estimate these smooth functions. An important aspect of these tools is their ability to incorporate sample characteristics [...]
+
+\subsection{Problem Formulation}
+We model data in the following form:
+$$
+Y_{itk}= f_i(t,x_{k})+e_{tk}
+$$
+where i represents group factor (diet, health status, etc.), $t$ represents series factor (for example, time or location), $k$ represents replicate observations, $x_{k}$ are covariates for sample $k$ (including an indicator for group
+membership $I\{k \in i\}$) and $e_{tk}$ are independent $N(0,\sigma^2)$ errors. We assume $f_i$ to be a smooth function, defined in an interval $[a,b]$, that can be parametric, non-parametric or a mixture of both.
+
+Our goal is to identify intervals where the absolute difference between two groups $\eta_d(t)=f_1(t, \cdot)-f_2(t, \cdot)$ is large, that is, regions, $R_{t_1,t_2}$, where:
+$R_{t_1,t_2}=
+\{t_1,t_2 \in x
+\textit{ such that }
+| \eta_{d}(x) |
+\ge C \}$
+and $C$ is a predefined constant threshold.
+
+To identify these areas we use hypothesis testing using the area $A_{t_1,t_2}=\int_{R_{t_1,t_2}}\eta_d(t) dt$ under the estimated function of $\eta_d(t)$ as a statistic with null and alternative hypotheses
+$$
+ H_0: A_{t_1,t_2} \le K
+$$
+$$
+ H_1: A_{t_1,t_2} > K
+$$
+with $K$ some fixed threshold.
+
+We employ a permutation-based method to calculate a null distribution of the area statistics $A_(t1,t2)$'s. To do this,
+the group-membership indicator variables (0-1 binary variable) are randomly permuted $B$ times, e.g., $B=1000$ and the
+method above is used to estimate the difference function $\eta_d^b$ (in this case simulating the null hypothesis) and an area
+statistics $A_(t1,t2)^b$ for each random permutation. Estimates $A_(t1,t2)^b$ are then used to construct an empirical
+estimate of $A_(t1,t2)$ under the null hypothesis. The observed area, $A_(t1,t2)^*$, is compared to the empirical null
+distribution to calculate a p-value. Figure 1 illustrates the relationship between $R_(t1,t2)$ and $A_(t1,t2)$. The key
+is to estimate regions $R_(t1,t2)$ where point-wise confidence intervals would be appropriate.
+
+\section{Data preparation}
+Data should be preprocessed and prepared in tab-delimited files. Measurements are stored in a matrix with samples along the
+columns and features along the rows. For example, given $m$ features and $n$ samples, the entries in a marker-gene or
+metagenomic count matrix \textbf{C} ($m, n$), $c_{ij}$, are the number of reads annotated for a particular feature $i$
+(whether it be OTU, species, genus, etc.) in sample $j$.
+Alternatively, the measurements could be some quantitative measurement such as methylation percentages or CD4 levels.\\
+
+\begin{center}
+$\bordermatrix{ &sample_1&sample_2&\ldots &sample_n\cr feature_1&c_{11} & c_{12} & \ldots & c_{1n}\cr feature_2& c_{21} & c_{22} & \ldots & c_{2n}\cr \vdots & \vdots & \vdots & \ddots & \vdots\cr feature_m & c_{m1} & c_{m2} &\ldots & c_{mn}}$
+\end{center}
+
+Data should be stored in a file (tab-delimited by default) with sample names along the first row, feature names in the first
+column and should be loaded into R and formatted into a MRexperiment object. To prepare the data please read the section on data preparation in the full metagenomeSeq vignette - \texttt{vignette("metagenomeSeq")}.
+
+\subsection{Example datasets}
+There is a time-series dataset included as an examples in the \texttt{metagenomeSeq} package. Data needs to be in a \texttt{MRexperiment} object format to normalize, run the statistical tests, and visualize. As an example, throughout the vignette we'll use the following datasets.
+To understand a \texttt{fitTimeSeries}'s usage or included data simply enter ?\texttt{fitTimeSeries}.
+
+<<requireMetagenomeSeq,warning=FALSE,message=FALSE>>=
+library(metagenomeSeq)
+library(gss)
+@
+
+\begin{enumerate}
+\setcounter{enumi}{1}
+\item Humanized gnotobiotic mouse gut \cite{ts_mouse}:
+Twelve germ-free adult male C57BL/6J mice were fed a low-fat, plant polysaccharide-rich diet. Each mouse was gavaged with healthy adult human fecal material. Following the fecal transplant, mice remained on the low-fat, plant polysacchaaride-rich diet for four weeks, following which a subset of 6 were switched to a high-fat and high-sugar diet for eight weeks. Fecal samples for each mouse went through PCR amplification of the bacterial 16S rRNA gene V2 region weekly. Details of experimen [...]
+\url{http://gordonlab.wustl.edu/TurnbaughSE_10_09/STM_2009.html}
+
+\end{enumerate}
+<<dataset2,tidy=FALSE>>=
+data(mouseData)
+mouseData
+@
+
+
+\subsection{Creating a \texttt{MRexperiment} object with other measurements}
+
+For a fitTimeSeries analysis a minimal MRexperiment-object is required and can be created using the function \texttt{newMRexperiment} which takes a count matrix described above and phenoData (annotated data frame).
+\texttt{Biobase} provides functions to create annotated data frames.
+
+<<createMRexperiment1>>=
+# Creating mock sample replicates
+sampleID = rep(paste("sample",1:10,sep=":"),times=20)
+# Creating mock class membership
+class = rep(c(rep(0,5),rep(1,5)),times=20)
+# Creating mock time
+time = rep(1:20,each=10)
+
+phenotypeData = AnnotatedDataFrame(data.frame(sampleID,class,time))
+# Creating mock abundances
+set.seed(1)
+# No difference
+measurement1 = rnorm(200,mean=100,sd=1)
+# Some difference
+measurement2 = rnorm(200,mean=100,sd=1)
+measurement2[1:5]=measurement2[1:5] + 100
+measurement2[11:15]=measurement2[11:15] + 100
+measurement2[21:25]=measurement2[21:25] + 50
+mat = rbind(measurement1,measurement2)
+colnames(mat) = 1:200
+mat[1:2,1:10]
+@
+
+If phylogenetic information exists for the features and there is a desire to aggregate
+measurements based on similar annotations choosing the featureData column name in lvl will aggregate measurements using the default parameters in the \texttt{aggregateByTaxonomy} function.
+
+<<createMRexperiment2>>=
+# This is an example of potential lvl's to aggregate by.
+data(mouseData)
+colnames(fData(mouseData))
+@
+
+Here we create the actual MRexperiment to run through fitTimeSeries.
+<<createMRexperiment3,tidy=FALSE>>=
+obj = newMRexperiment(counts=mat,phenoData=phenotypeData)
+obj
+res1 = fitTimeSeries(obj,feature=1,
+ class='class',time='time',id='sampleID',
+ B=10,norm=FALSE,log=FALSE)
+res2 = fitTimeSeries(obj,feature=2,
+ class='class',time='time',id='sampleID',
+ B=10,norm=FALSE,log=FALSE)
+
+
+classInfo = factor(res1$data$class)
+par(mfrow=c(3,1))
+plotClassTimeSeries(res1,pch=21,bg=classInfo)
+plotTimeSeries(res2)
+plotClassTimeSeries(res2,pch=21,bg=classInfo)
+@
+
+\section{Time series analysis}
+Implemented in the \texttt{fitTimeSeries} function is a method for calculating time intervals for which
+bacteria are differentially abundant. Fitting is performed using Smoothing Splines ANOVA (SS-ANOVA),
+as implemented in the \texttt{gss} package. Given observations at multiple time points for two groups
+the method calculates a function modeling the difference in abundance across all time. Using group membership permutations we
+estimate a null distribution of areas under the difference curve for the time intervals of interest and report significant intervals of time. Here we provide a real example from the microbiome of two groups of mice on different diets.
+
+The gnotobiotic mice come from a longitudinal study ideal for this type of analysis.
+We choose to perform our analysis at the class level and look for
+differentially abundant time intervals for "Actinobacteria".
+For demonstrations sake we perform only 10 permutations.
+
+If you find the method useful, please cite:
+"Longitudinal differential abundance analysis for marker-gene surveys"
+Talukder H*, Paulson JN*, Bravo HC. (Submitted)
+
+<<timeSeries>>=
+res = fitTimeSeries(obj=mouseData,lvl="class",feature="Actinobacteria",class="status",id="mouseID",time="relativeTime",B=10)
+
+# We observe a time period of differential abundance for "Actinobacteria"
+res$timeIntervals
+
+str(res)
+@
+
+For example, to test every class in the mouse dataset:
+<<timeSeriesAllClasses, tidy=FALSE>>=
+classes = unique(fData(mouseData)[,"class"])
+
+timeSeriesFits = lapply(classes,function(i){
+ fitTimeSeries(obj=mouseData,
+ feature=i,
+ class="status",
+ id="mouseID",
+ time="relativeTime",
+ lvl='class',
+ C=.3,# a cutoff for 'interesting'
+ B=1) # B is the number of permutations and should clearly not be 1
+ })
+names(timeSeriesFits) = classes
+
+# Removing classes of bacteria without a potentially
+# interesting time interval difference.
+timeSeriesFits = sapply(timeSeriesFits,function(i){i[[1]]})[-grep("No",timeSeriesFits)]
+
+# Naming the various interesting time intervals.
+for(i in 1:length(timeSeriesFits)){
+ rownames(timeSeriesFits[[i]]) =
+ paste(
+ paste(names(timeSeriesFits)[i]," interval",sep=""),
+ 1:nrow(timeSeriesFits[[i]]),sep=":"
+ )
+}
+
+# Merging into a table.
+timeSeriesFits = do.call(rbind,timeSeriesFits)
+
+# Correcting for multiple testing.
+pvalues = timeSeriesFits[,"p.value"]
+adjPvalues = p.adjust(pvalues,"bonferroni")
+timeSeriesFits = cbind(timeSeriesFits,adjPvalues)
+
+head(timeSeriesFits)
+@
+Please see the help page for \texttt{fitTimeSeries} for parameters. Note, only two groups can be compared to each other and the time parameter must be an actual value (currently no support for posix, etc.).
+
+\subsection{Paramaters}
+There are a number of parameters for the \texttt{fitTimeSeries} function. We list and provide a brief discussion below. For
+parameters influencing \texttt{ssanova}, \texttt{aggregateByTaxonomy}, \texttt{MRcounts} type ?function for more details.
+\begin{itemize}
+ \item obj - the metagenomeSeq MRexperiment-class object.
+ \item feature - Name or row of feature of interest.
+ \item class - Name of column in phenoData of MRexperiment-class object for class memberhip.
+ \item time - Name of column in phenoData of MRexperiment-class object for relative time.
+ \item id - Name of column in phenoData of MRexperiment-class object for sample id.
+ \item method - Method to estimate time intervals of differentially abundant bacteria (only ssanova method implemented currently).
+ \item lvl - Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).
+ \item C - Value for which difference function has to be larger or smaller than (default 0).
+ \item B - Number of permutations to perform (default 1000)
+ \item norm - When aggregating counts to normalize or not. (see MRcounts)
+ \item log - Log2 transform. (see MRcounts)
+ \item sl - Scaling value. (see MRcounts)
+ \item ... - Options for ssanova
+
+\end{itemize}
+
+\section{Visualization of features}
+To help with visualization and analysis of datasets \texttt{metagenomeSeq} has several plotting functions to gain insight of the model fits and the differentially abundant time intervals using \texttt{plotClassTimeSeries} and \texttt{plotTimeSeries} on the result. More plots will be updated.
+<<timeSeriesPlotting>>=
+par(mfrow=c(2,1))
+plotClassTimeSeries(res,pch=21,
+ bg=res$data$class,ylim=c(0,8))
+plotTimeSeries(res)
+@
+
+\section{Summary}
+
+\texttt{metagenomeSeq}'s \texttt{fitTimeSeries} is a novel methodology for differential abundance testing of longitudinal data. If you make use of the statistical method please cite our paper. If you made use of the manual/software, please cite the manual/software!
+
+\subsection{Citing fitTimeSeries}
+<<cite>>=
+citation("metagenomeSeq")
+@
+
+\subsection{Session Info}
+<<sessionInfo>>=
+sessionInfo()
+@
+
+\bibliography{fitTimeSeries}
+\end{document}
diff --git a/inst/doc/fitTimeSeries.pdf b/inst/doc/fitTimeSeries.pdf
new file mode 100644
index 0000000..be51fe1
Binary files /dev/null and b/inst/doc/fitTimeSeries.pdf differ
diff --git a/inst/doc/metagenomeSeq.R b/inst/doc/metagenomeSeq.R
new file mode 100644
index 0000000..f12d244
--- /dev/null
+++ b/inst/doc/metagenomeSeq.R
@@ -0,0 +1,299 @@
+## ----include=FALSE-------------------------------------------------------
+require(knitr)
+opts_chunk$set(concordance=TRUE,tidy=TRUE)
+
+## ----config,echo=FALSE------------------------------------
+options(width = 60)
+options(continue=" ")
+options(warn=-1)
+set.seed(42)
+
+## ----requireMetagenomeSeq,warning=FALSE,message=FALSE-----
+library(metagenomeSeq)
+
+## ----loadBiom---------------------------------------------
+# reading in a biom file
+library(biomformat)
+biom_file <- system.file("extdata", "min_sparse_otu_table.biom", package = "biomformat")
+b <- read_biom(biom_file)
+biom2MRexperiment(b)
+
+## ----writeBiom,eval=FALSE---------------------------------
+# data(mouseData)
+# # options include to normalize or not
+# b <- MRexperiment2biom(mouseData)
+# write_biom(b,biom_file="~/Desktop/otu_table.biom")
+
+## ----loadData---------------------------------------------
+dataDirectory <- system.file("extdata", package="metagenomeSeq")
+lung = loadMeta(file.path(dataDirectory,"CHK_NAME.otus.count.csv"))
+dim(lung$counts)
+
+## ----loadTaxa---------------------------------------------
+taxa = read.delim(file.path(dataDirectory,"CHK_otus.taxonomy.csv"),stringsAsFactors=FALSE)
+
+## ----loadClin---------------------------------------------
+clin = loadPhenoData(file.path(dataDirectory,"CHK_clinical.csv"),tran=TRUE)
+ord = match(colnames(lung$counts),rownames(clin))
+clin = clin[ord,]
+head(clin[1:2,])
+
+## ----createMRexperiment1----------------------------------
+phenotypeData = AnnotatedDataFrame(clin)
+phenotypeData
+
+## ----createMRexperiment2----------------------------------
+OTUdata = AnnotatedDataFrame(taxa)
+OTUdata
+
+## ----createMRexperiment3,tidy=FALSE-----------------------
+obj = newMRexperiment(lung$counts,phenoData=phenotypeData,featureData=OTUdata)
+# Links to a paper providing further details can be included optionally.
+# experimentData(obj) = annotate::pmid2MIAME("21680950")
+obj
+
+## ----dataset1,tidy=FALSE----------------------------------
+data(lungData)
+lungData
+
+## ----dataset2,tidy=FALSE----------------------------------
+data(mouseData)
+mouseData
+
+## ----pdata------------------------------------------------
+phenoData(obj)
+head(pData(obj),3)
+
+## ----fdata------------------------------------------------
+featureData(obj)
+head(fData(obj)[,-c(2,10)],3)
+
+## ----MRcounts---------------------------------------------
+head(MRcounts(obj[,1:2]))
+
+## ---------------------------------------------------------
+featuresToKeep = which(rowSums(obj)>=100)
+samplesToKeep = which(pData(obj)$SmokingStatus=="Smoker")
+obj_smokers = obj[featuresToKeep,samplesToKeep]
+obj_smokers
+head(pData(obj_smokers),3)
+
+## ----normFactors------------------------------------------
+head(normFactors(obj))
+normFactors(obj) <- rnorm(ncol(obj))
+head(normFactors(obj))
+
+## ----libSize----------------------------------------------
+head(libSize(obj))
+libSize(obj) <- rnorm(ncol(obj))
+head(libSize(obj))
+
+## ----filterData-------------------------------------------
+data(mouseData)
+filterData(mouseData,present=10,depth=1000)
+
+## ----mergeMRexperiment------------------------------------
+data(mouseData)
+newobj = mergeMRexperiments(mouseData,mouseData)
+newobj
+
+## ----calculateNormFactors---------------------------------
+data(lungData)
+p=cumNormStatFast(lungData)
+
+## ----normalizeData----------------------------------------
+lungData = cumNorm(lungData,p=p)
+
+## ----saveData---------------------------------------------
+mat = MRcounts(lungData,norm=TRUE,log=TRUE)[1:5,1:5]
+exportMat(mat,file=file.path(dataDirectory,"tmp.tsv"))
+
+## ----exportStats------------------------------------------
+exportStats(lungData[,1:5],file=file.path(dataDirectory,"tmp.tsv"))
+head(read.csv(file=file.path(dataDirectory,"tmp.tsv"),sep="\t"))
+
+## ----removeData, echo=FALSE-------------------------------
+system(paste("rm",file.path(dataDirectory,"tmp.tsv")))
+
+## ----fitFeatureModel--------------------------------------
+data(lungData)
+lungData = lungData[,-which(is.na(pData(lungData)$SmokingStatus))]
+lungData=filterData(lungData,present=30,depth=1)
+lungData <- cumNorm(lungData, p=.5)
+pd <- pData(lungData)
+mod <- model.matrix(~1+SmokingStatus, data=pd)
+lungres1 = fitFeatureModel(lungData,mod)
+head(MRcoefs(lungres1))
+
+## ----preprocess,dev='pdf',out.width='.55\\linewidth',out.height='.55\\linewidth',fig.cap='Relative difference for the median difference in counts from the reference.',fig.align='center',warning=FALSE----
+data(lungData)
+controls = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-controls]
+rareFeatures = which(rowSums(MRcounts(lungTrim)>0)<10)
+lungTrim = lungTrim[-rareFeatures,]
+lungp = cumNormStat(lungTrim,pFlag=TRUE,main="Trimmed lung data")
+lungTrim = cumNorm(lungTrim,p=lungp)
+
+## ----zigTesting-------------------------------------------
+smokingStatus = pData(lungTrim)$SmokingStatus
+bodySite = pData(lungTrim)$SampleType
+normFactor = normFactors(lungTrim)
+normFactor = log2(normFactor/median(normFactor) + 1)
+mod = model.matrix(~smokingStatus+bodySite + normFactor)
+settings = zigControl(maxit=10,verbose=TRUE)
+fit = fitZig(obj = lungTrim,mod=mod,useCSSoffset = FALSE,
+ control=settings)
+
+# The default, useCSSoffset = TRUE, automatically includes the CSS scaling normalization factor.
+
+## ----contrasts--------------------------------------------
+# maxit=1 is for demonstration purposes
+settings = zigControl(maxit=1,verbose=FALSE)
+mod = model.matrix(~bodySite)
+colnames(mod) = levels(bodySite)
+# fitting the ZIG model
+res = fitZig(obj = lungTrim,mod=mod,control=settings)
+# The output of fitZig contains a list of various useful items. hint: names(res).
+#
+# Probably the most useful is the limma 'MLArrayLM' object called fit.
+zigFit = res$fit
+finalMod = res$fit$design
+
+contrast.matrix = makeContrasts(BAL.A-BAL.B,OW-PSB,levels=finalMod)
+fit2 = contrasts.fit(zigFit, contrast.matrix)
+fit2 = eBayes(fit2)
+topTable(fit2)
+
+# See help pages on decideTests, topTable, topTableF, vennDiagram, etc.
+
+## ----fittedResult,tidy=TRUE-------------------------------
+taxa =
+ sapply(strsplit(as.character(fData(lungTrim)$taxa),split=";"),
+ function(i){i[length(i)]})
+head(MRcoefs(fit,taxa=taxa,coef=2))
+
+## ----timeSeries-------------------------------------------
+# vignette("fitTimeSeries")
+
+## ----perm-------------------------------------------------
+coeffOfInterest = 2
+res = fitLogNormal(obj = lungTrim, mod = mod, useCSSoffset = FALSE, B = 10, coef = coeffOfInterest)
+
+# extract p.values and adjust for multiple testing
+# res$p are the p-values calculated through permutation
+adjustedPvalues = p.adjust(res$p,method="fdr")
+
+# extract the absolute fold-change estimates
+foldChange = abs(res$fit$coef[,coeffOfInterest])
+
+# determine features still significant and order by the
+sigList = which(adjustedPvalues <= .05)
+sigList = sigList[order(foldChange[sigList])]
+
+# view the top taxa associated with the coefficient of interest.
+head(taxa[sigList])
+
+## ----presenceAbsence--------------------------------------
+classes = pData(mouseData)$diet
+res = fitPA(mouseData[1:5,],cl=classes)
+# Warning - the p-value is calculating 1 despite a high odd's ratio.
+head(res)
+
+## ----discOdds---------------------------------------------
+classes = pData(mouseData)$diet
+res = fitDO(mouseData[1:100,],cl=classes,norm=FALSE,log=FALSE)
+head(res)
+
+## ----corTest----------------------------------------------
+cors = correlationTest(mouseData[55:60,],norm=FALSE,log=FALSE)
+head(cors)
+
+## ----uniqueFeatures---------------------------------------
+cl = pData(mouseData)[["diet"]]
+uniqueFeatures(mouseData,cl,nsamples = 10,nreads = 100)
+
+## ----aggTax-----------------------------------------------
+obj = aggTax(mouseData,lvl='phylum',out='matrix')
+head(obj[1:5,1:5])
+
+## ----aggSamp----------------------------------------------
+obj = aggSamp(mouseData,fct='mouseID',out='matrix')
+head(obj[1:5,1:5])
+
+## ----interactiveDisplay-----------------------------------
+# Calling display on the MRexperiment object will start a browser session with interactive plots.
+
+# require(interactiveDisplay)
+# display(mouseData)
+
+## ----heatmapData,fig.cap='Left) Abundance heatmap (plotMRheatmap). Right) Correlation heatmap (plotCorr).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth'----
+trials = pData(mouseData)$diet
+heatmapColColors=brewer.pal(12,"Set3")[as.integer(factor(trials))];
+heatmapCols = colorRampPalette(brewer.pal(9, "RdBu"))(50)
+
+# plotMRheatmap
+plotMRheatmap(obj=mouseData,n=200,cexRow = 0.4,cexCol = 0.4,trace="none",
+ col = heatmapCols,ColSideColors = heatmapColColors)
+
+# plotCorr
+plotCorr(obj=mouseData,n=200,cexRow = 0.25,cexCol = 0.25,
+ trace="none",dendrogram="none",col=heatmapCols)
+
+## ----MDSandRareplots,fig.cap='Left) CMDS of features (plotOrd). Right) Rarefaction effect (plotRare).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth'----
+cl = factor(pData(mouseData)$diet)
+
+# plotOrd - can load vegan and set distfun = vegdist and use dist.method="bray"
+plotOrd(mouseData,tran=TRUE,usePCA=FALSE,useDist=TRUE,bg=cl,pch=21)
+
+# plotRare
+res = plotRare(mouseData,cl=cl,pch=21,bg=cl)
+
+# Linear fits for plotRare / legend
+tmp=lapply(levels(cl), function(lv)
+ lm(res[,"ident"]~res[,"libSize"]-1, subset=cl==lv))
+for(i in 1:length(levels(cl))){
+ abline(tmp[[i]], col=i)
+}
+legend("topleft", c("Diet 1","Diet 2"), text.col=c(1,2),box.col=NA)
+
+## ----plotOTUData,fig.cap='Left) Abundance plot (plotOTU). Right) Multiple OTU abundances (plotGenus).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth',tidy=TRUE----
+head(MRtable(fit,coef=2,taxa=1:length(fData(lungTrim)$taxa)))
+patients=sapply(strsplit(rownames(pData(lungTrim)),split="_"),
+ function(i){
+ i[3]
+ })
+pData(lungTrim)$patients=patients
+classIndex=list(smoker=which(pData(lungTrim)$SmokingStatus=="Smoker"))
+classIndex$nonsmoker=which(pData(lungTrim)$SmokingStatus=="NonSmoker")
+otu = 779
+
+# plotOTU
+plotOTU(lungTrim,otu=otu,classIndex,main="Neisseria meningitidis")
+
+# Now multiple OTUs annotated similarly
+x = fData(lungTrim)$taxa[otu]
+otulist = grep(x,fData(lungTrim)$taxa)
+
+# plotGenus
+plotGenus(lungTrim,otulist,classIndex,labs=FALSE,
+ main="Neisseria meningitidis")
+
+lablist<- c("S","NS")
+axis(1, at=seq(1,6,by=1), labels = rep(lablist,times=3))
+
+## ----plotFeatureData,fig.cap='Plot of raw abundances',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth',tidy=TRUE----
+classIndex=list(Western=which(pData(mouseData)$diet=="Western"))
+classIndex$BK=which(pData(mouseData)$diet=="BK")
+otuIndex = 8770
+
+# par(mfrow=c(1,2))
+dates = pData(mouseData)$date
+plotFeature(mouseData,norm=FALSE,log=FALSE,otuIndex,classIndex,
+ col=dates,sortby=dates,ylab="Raw reads")
+
+## ----cite-------------------------------------------------
+citation("metagenomeSeq")
+
+## ----sessionInfo------------------------------------------
+sessionInfo()
+
diff --git a/inst/doc/metagenomeSeq.Rnw b/inst/doc/metagenomeSeq.Rnw
new file mode 100644
index 0000000..2ded587
--- /dev/null
+++ b/inst/doc/metagenomeSeq.Rnw
@@ -0,0 +1,725 @@
+%\VignetteIndexEntry{metagenomeSeq: statistical analysis for sparse high-throughput sequencing}
+%\VignetteEngine{knitr::knitr}
+\documentclass[a4paper,11pt]{article}
+\usepackage{url}
+\usepackage{afterpage}
+\usepackage{hyperref}
+\usepackage{geometry}
+\usepackage{cite}
+\geometry{hmargin=2.5cm, vmargin=2.5cm}
+\usepackage{graphicx}
+\usepackage{courier}
+\bibliographystyle{unsrt}
+
+\begin{document}
+<<include=FALSE>>=
+require(knitr)
+opts_chunk$set(concordance=TRUE,tidy=TRUE)
+@
+
+\title{{\textbf{\texttt{metagenomeSeq}: Statistical analysis for sparse high-throughput sequencing}}}
+\author{Joseph Nathaniel Paulson\\[1em]\\ Applied Mathematics $\&$ Statistics, and Scientific Computation\\ Center for Bioinformatics and Computational Biology\\ University of Maryland, College Park\\[1em]\\ \texttt{jpaulson at umiacs.umd.edu}}
+\date{Modified: October 4, 2016. Compiled: \today}
+\maketitle
+\tableofcontents
+
+\newpage
+
+<<config,echo=FALSE>>=
+options(width = 60)
+options(continue=" ")
+options(warn=-1)
+set.seed(42)
+@
+
+\section{Introduction}
+
+\textbf{This is a vignette for pieces of an association study pipeline. For a full list of functions available in the package: help(package=metagenomeSeq). For more information about a particular function call: ?function.} See \textit{fitFeatureModel} for our latest development.
+
+
+To load the metagenomeSeq library:
+<<requireMetagenomeSeq,warning=FALSE,message=FALSE>>=
+library(metagenomeSeq)
+@
+
+Metagenomics is the study of genetic material targeted directly from an environmental community.
+Originally focused on exploratory and validation projects, these studies now focus on understanding the differences in microbial communities caused by phenotypic differences.
+Analyzing high-throughput sequencing data has been a challenge to researchers due to the unique biological and technological biases that are present in marker-gene survey data.
+
+ We present a R package, \texttt{metagenomeSeq}, that implements methods developed to account for previously unaddressed biases specific to high-throughput sequencing microbial marker-gene survey data. Our method implements a novel normalization technique and method to account for sparsity due to undersampling. Other methods include
+ White \textit{et al.}'s Metastats and Segata \textit{et al.}'s LEfSe. The first is a non-parametric permutation test on $t$-statistics and the second is a non-parametric Kruskal-Wallis test followed by subsequent wilcox rank-sum tests on subgroups to guard against positive discoveries of differential abundance driven by potential confounders - neither address normalization nor sparsity.
+
+This vignette describes the basic protocol when using \texttt{metagenomeSeq}.
+A normalization method able to control for biases in measurements across taxanomic features and a mixture model that implements a zero-inflated Gaussian distribution to account for varying depths of coverage are implemented.
+Using a linear model methodology, it is easy to include confounding sources of variability and interpret results.
+Additionally, visualization functions are provided to examine discoveries.
+
+The software was designed to determine features (be it Operational Taxanomic Unit (OTU), species, etc.) that are differentially abundant between two or more groups of multiple samples.
+The software was also designed to address the effects of both normalization and undersampling of microbial communities on disease association detection and testing of feature correlations.
+
+\begin{figure}
+\centerline{\includegraphics[width=.55\textwidth]{overview.pdf}}
+\caption{General overview. metagenomeSeq requires the user to convert their data into MRexperiment objects. Using those MRexperiment objects, one can normalize their data, run statistical tests (abundance or presence-absence), and visualize or save results.}
+\end{figure}
+
+\newpage
+\section{Data preparation}
+Microbial marker-gene sequence data is preprocessed and counts are algorithmically defined
+from project-specific sequence data by clustering reads according to read similarity.
+Given $m$ features and $n$ samples, the elements in a count matrix
+\textbf{C} ($m, n$), $c_{ij}$, are the number of reads annotated for a particular
+feature $i$ (whether it be OTU, species, genus, etc.) in sample $j$. \\
+
+
+\begin{center}
+$\bordermatrix{ &sample_1&sample_2&\ldots &sample_n\cr feature_1&c_{11} & c_{12} & \ldots & c_{1n}\cr feature_2& c_{21} & c_{22} & \ldots & c_{2n}\cr \vdots & \vdots & \vdots & \ddots & \vdots\cr feature_m & c_{m1} & c_{m2} &\ldots & c_{mn}}$
+\end{center}
+
+Count data should be stored in a delimited (tab by default) file with sample names
+along the first row and feature names along the first column.
+
+Data is prepared and formatted as a \texttt{MRexperiment} object. For an overview of the internal structure please see Appendix A.
+
+
+\subsection{Biom-Format}
+You can load in BIOM file format data, the output of many commonly used, using the \texttt{loadBiom} function.
+The \texttt{biom2MRexperiment} and \texttt{MRexperiment2biom} functions serve as a gateway between the \texttt{biom-class} object defined in the \textbf{biom} package and a \texttt{MRexperiment-class} object. BIOM format files IO is available thanks to the \texttt{biomformat} package.
+
+As an example, we show how one can read in a BIOM file and convert it to a \texttt{MRexperiment} object.
+<<loadBiom>>=
+# reading in a biom file
+library(biomformat)
+biom_file <- system.file("extdata", "min_sparse_otu_table.biom", package = "biomformat")
+b <- read_biom(biom_file)
+biom2MRexperiment(b)
+@
+
+As an example, we show how one can write a \texttt{MRexperiment} object out as a BIOM file.
+Here is an example writing out the mouseData \texttt{MRexperiment} object to a BIOM file.
+<<writeBiom,eval=FALSE>>=
+data(mouseData)
+# options include to normalize or not
+b <- MRexperiment2biom(mouseData)
+write_biom(b,biom_file="~/Desktop/otu_table.biom")
+@
+
+\subsection{Loading count data}
+Following preprocessing and annotation of sequencing data \texttt{metagenomeSeq} requires a count matrix with features along rows and samples along the columns.
+\texttt{metagenomeSeq} includes functions for loading delimited files of counts
+\texttt{loadMeta} and phenodata \texttt{loadPhenoData}.
+
+As an example, a portion of the lung microbiome \cite{charlson}
+OTU matrix is provided in \texttt{metagenomeSeq}'s library "extdata" folder.
+The OTU matrix is stored as a tab delimited file.
+\texttt{loadMeta} loads the taxa and counts into a list.
+
+<<loadData>>=
+dataDirectory <- system.file("extdata", package="metagenomeSeq")
+lung = loadMeta(file.path(dataDirectory,"CHK_NAME.otus.count.csv"))
+dim(lung$counts)
+@
+
+
+\subsection{Loading taxonomy}
+Next we want to load the annotated taxonomy. Check to make sure that your taxa annotations and OTUs are in the same order as your matrix rows.
+
+<<loadTaxa>>=
+taxa = read.delim(file.path(dataDirectory,"CHK_otus.taxonomy.csv"),stringsAsFactors=FALSE)
+@
+
+As our OTUs appear to be in order with the count matrix we loaded earlier, the next step is to load phenodata.
+
+\textbf{Warning}: features need to have the same names as the rows of the count matrix when we create the MRexperiment object for provenance purposes.
+
+\subsection{Loading metadata}
+Phenotype data can be optionally loaded into \texttt{R} with \texttt{loadPhenoData}. This function loads the data as a list.
+
+<<loadClin>>=
+clin = loadPhenoData(file.path(dataDirectory,"CHK_clinical.csv"),tran=TRUE)
+ord = match(colnames(lung$counts),rownames(clin))
+clin = clin[ord,]
+head(clin[1:2,])
+@
+
+
+\textbf{Warning}: phenotypes must have the same names as the columns on the count matrix when we create the MRexperiment object for provenance purposes.
+
+\subsection{Creating a \texttt{MRexperiment} object}
+
+Function \texttt{newMRexperiment} takes a count matrix, phenoData (annotated data frame), and featureData (annotated data frame) as input.
+\texttt{Biobase} provides functions to create annotated data frames.
+Library sizes (depths of coverage) and normalization factors are also optional inputs.
+
+
+<<createMRexperiment1>>=
+phenotypeData = AnnotatedDataFrame(clin)
+phenotypeData
+@
+
+A feature annotated data frame. In this example it is simply the OTU numbers, but it can as easily be the annotated taxonomy at multiple levels.
+
+<<createMRexperiment2>>=
+OTUdata = AnnotatedDataFrame(taxa)
+OTUdata
+@
+
+
+<<createMRexperiment3,tidy=FALSE>>=
+obj = newMRexperiment(lung$counts,phenoData=phenotypeData,featureData=OTUdata)
+# Links to a paper providing further details can be included optionally.
+# experimentData(obj) = annotate::pmid2MIAME("21680950")
+obj
+@
+
+\subsection{Example datasets}
+There are two datasets included as examples in the \texttt{metagenomeSeq} package. Data needs to be in a \texttt{MRexperiment} object format to normalize, run statistical tests, and visualize. As an example, throughout the vignette we'll use the following datasets.
+To understand a function's usage or included data simply enter ?functionName.
+
+\begin{enumerate}
+\item Human lung microbiome \cite{charlson}:
+The lung microbiome consists of respiratory flora sampled from six healthy individuals. Three healthy nonsmokers and three healthy smokers. The upper lung tracts were sampled by oral wash and oro-/nasopharyngeal swabs. Samples were taken using two bronchoscopes, serial bronchoalveolar lavage and lower airway protected brushes.
+\end{enumerate}
+<<dataset1,tidy=FALSE>>=
+data(lungData)
+lungData
+@
+
+\begin{enumerate}
+\setcounter{enumi}{1}
+\item Humanized gnotobiotic mouse gut \cite{ts_mouse}:
+Twelve germ-free adult male C57BL/6J mice were fed a low-fat, plant polysaccharide-rich diet. Each mouse was gavaged with healthy adult human fecal material. Following the fecal transplant, mice remained on the low-fat, plant polysacchaaride-rich diet for four weeks, following which a subset of 6 were switched to a high-fat and high-sugar diet for eight weeks. Fecal samples for each mouse went through PCR amplification of the bacterial 16S rRNA gene V2 region weekly. Details of experimen [...]
+\url{http://gordonlab.wustl.edu/TurnbaughSE_10_09/STM_2009.html}
+
+\end{enumerate}
+<<dataset2,tidy=FALSE>>=
+data(mouseData)
+mouseData
+@
+
+\newpage
+\subsection{Useful commands}
+Phenotype information can be accessed with the \verb+phenoData+ and \verb+pData+ methods:
+<<pdata>>=
+phenoData(obj)
+head(pData(obj),3)
+@
+
+Feature information can be accessed with the \verb+featureData+ and \verb+fData+ methods:
+<<fdata>>=
+featureData(obj)
+head(fData(obj)[,-c(2,10)],3)
+@
+\newpage
+The raw or normalized counts matrix can be accessed with the \verb+MRcounts+ function:
+<<MRcounts>>=
+head(MRcounts(obj[,1:2]))
+@
+
+A \texttt{MRexperiment-class} object can be easily subsetted, for example:
+<<>>=
+featuresToKeep = which(rowSums(obj)>=100)
+samplesToKeep = which(pData(obj)$SmokingStatus=="Smoker")
+obj_smokers = obj[featuresToKeep,samplesToKeep]
+obj_smokers
+head(pData(obj_smokers),3)
+@
+
+Alternative normalization scaling factors can be accessed or replaced with the \verb+normFactors+ method:
+<<normFactors>>=
+head(normFactors(obj))
+normFactors(obj) <- rnorm(ncol(obj))
+head(normFactors(obj))
+@
+
+Library sizes (sequencing depths) can be accessed or replaced with the \verb+libSize+ method:
+<<libSize>>=
+head(libSize(obj))
+libSize(obj) <- rnorm(ncol(obj))
+head(libSize(obj))
+@
+
+\newpage
+Additionally, data can be filtered to maintain a threshold of minimum depth or OTU presence:
+<<filterData>>=
+data(mouseData)
+filterData(mouseData,present=10,depth=1000)
+@
+
+Two \texttt{MRexperiment-class} objects can be merged with the \texttt{mergeMRexperiments} function, e.g.:
+
+<<mergeMRexperiment>>=
+data(mouseData)
+newobj = mergeMRexperiments(mouseData,mouseData)
+newobj
+@
+
+
+\newpage
+\section{Normalization}
+Normalization is required due to varying depths of coverage across samples. \texttt{cumNorm} is a normalization method that calculates scaling factors equal to the sum of counts up to a particular quantile.
+
+Denote the $l$th quantile of sample $j$ as $q_j^l$, that is, in sample $j$ there are $l$ taxonomic features with counts smaller than $q_j^l$. For $l= \lfloor .95m \rfloor$ then $q_j^l$ corresponds to the 95th percentile of the count distribution for sample $j$.
+
+
+Denote $s_j^l= \sum_{(i|c_{ij}\leq q_j^l)}c_{ij}$ as the sum of counts for sample $j$ up to the $l$th quantile. Our normalization chooses a value $\hat{l}\leq m$ to define a normalization scaling factor for each sample to produce normalized counts $\tilde{c_{ij}}$ = $\frac{c_{ij}}{s_j^{\hat{l}}}N$ where $N$ is an appropriately chosen normalization constant. See Appendix C for more information on how our method calculates the proper percentile.
+
+These normalization factors are stored in the experiment summary slot. Functions to determine the proper percentile \texttt{cumNormStat}, save normalized counts \texttt{exportMat}, or save various sample statistics \texttt{exportStats} are also provided.
+Normalized counts can be called easily by \texttt{cumNormMat(MRexperimentObject)} or \texttt{MRcounts(MRexperimentObject,norm=TRUE,log=FALSE)}.
+
+\subsection{Calculating normalization factors}
+After defining a \texttt{MRexperiment} object, the first step is to calculate the proper percentile by which to normalize counts. There are several options in calculating and visualizing the relative differences in the reference. Figure 3 is an example from the lung dataset.
+
+<<calculateNormFactors>>=
+data(lungData)
+p=cumNormStatFast(lungData)
+@
+
+\noindent
+To calculate the scaling factors we simply run \texttt{cumNorm}
+
+<<normalizeData>>=
+lungData = cumNorm(lungData,p=p)
+@
+
+The user can alternatively choose different percentiles for the normalization scheme by specifying $p$.
+
+There are other functions, including \texttt{normFactors}, \texttt{cumNormMat}, that return the normalization factors or a normalized matrix for a specified percentile. To see a full list of functions please refer to the manual and help pages.
+
+\subsection{Exporting data}
+To export normalized count matrices:
+<<saveData>>=
+mat = MRcounts(lungData,norm=TRUE,log=TRUE)[1:5,1:5]
+exportMat(mat,file=file.path(dataDirectory,"tmp.tsv"))
+@
+
+\noindent
+To save sample statistics (sample scaling factor, quantile value, number of identified features and library size):
+<<exportStats>>=
+exportStats(lungData[,1:5],file=file.path(dataDirectory,"tmp.tsv"))
+head(read.csv(file=file.path(dataDirectory,"tmp.tsv"),sep="\t"))
+@
+
+
+<<removeData, echo=FALSE>>=
+system(paste("rm",file.path(dataDirectory,"tmp.tsv")))
+@
+
+\newpage
+\section{Statistical testing}
+Now that we have taken care of normalization we can address the effects of under sampling on the detecting differentially abundant features (OTUs, genes, etc). This is our latest development and we recommend \textit{fitFeatureModel} over \textit{fitZig}. \textit{MRcoefs}, \textit{MRtable} and \textit{MRfulltable} are useful summary tables of the model outputs.
+
+\subsection{Zero-inflated Log-Normal mixture model for each feature}
+By reparametrizing our zero-inflation model, we're able to fit a zero-inflated model for each specific OTU separately.
+We currently recommend using the zero-inflated log-normal model as implemented in \textit{fitFeatureModel}.
+
+\subsubsection{Example using fitFeatureModel for differential abundance testing}
+
+Here is an example comparing smoker's and non-smokers lung microbiome.
+
+<<fitFeatureModel>>=
+data(lungData)
+lungData = lungData[,-which(is.na(pData(lungData)$SmokingStatus))]
+lungData=filterData(lungData,present=30,depth=1)
+lungData <- cumNorm(lungData, p=.5)
+pd <- pData(lungData)
+mod <- model.matrix(~1+SmokingStatus, data=pd)
+lungres1 = fitFeatureModel(lungData,mod)
+head(MRcoefs(lungres1))
+@
+
+\subsection{Zero-inflated Gaussian mixture model}
+The depth of coverage in a sample is directly related to how many features are detected in a sample motivating our zero-inflated Gaussian (ZIG) mixture model. Figure 2 is representative of the linear relationship between depth of coverage and OTU identification ubiquitous in marker-gene survey datasets currently available. For a quick overview of the mathematical model see Appendix B.
+
+\begin{figure}
+\centerline{\includegraphics[width=.55\textwidth]{metagenomeSeq_figure1.png}}
+\caption{\footnotesize{The number of unique features is plotted against depth of coverage for samples from the Human Microbiome Project \cite{hmp}. Including the depth of coverage and the interaction of body site and sequencing site we are able to acheive an adjusted $\mathrm{R}^2$ of .94. The zero-inflated Gaussian mixture was developed to account for missing features.}}\label{fig1}
+\end{figure}
+
+Function \texttt{fitZig} performs a complex mathematical optimization routine to estimate probabilities that a zero for a particular feature in a sample is a technical zero or not. The function relies heavily on the \texttt{limma} package \cite{limma}. Design matrices can be created in R by using the \texttt{model.matrix} function and are inputs for \texttt{fitZig}.
+
+For large survey studies it is often pertinent to include phenotype information or confounders into a design matrix when testing the association between the abundance of taxonomic features and a phenotype phenotype of interest (disease, for
+instance). Our linear model methodology can easily incorporate these
+confounding covariates in a straightforward manner. \texttt{fitZig} output includes weighted fits for each of the $m$ features. Results can be filtered and saved using \texttt{MRcoefs} or \texttt{MRtable}.
+
+\subsubsection{Example using fitZig for differential abundance testing}
+\textbf{Warning}: The user should restrict significant features to those with a minimum number of positive samples. What this means is that one should not claim features are significant unless the effective number of samples is above a particular percentage. For example, fold-change estimates might be unreliable if an entire group does not have a positive count for the feature in question.
+
+
+We recommend the user remove features based on the number of estimated effective samples, please see \texttt{calculateEffectiveSamples}. We recommend removing features with less than the average number of effective samples in all features. In essence, setting eff = .5 when using \texttt{MRcoefs}, \texttt{MRfulltable}, or \texttt{MRtable}. To find features absent from a group the function \texttt{uniqueFeatures} provides a table of the feature ids, the number of positive features and read [...]
+
+In our analysis of the lung microbiome data, we can remove features that are not present in many samples, controls, and calculate the normalization factors. The user needs to decide which metadata should be included in the linear model.
+
+<<preprocess,dev='pdf',out.width='.55\\linewidth',out.height='.55\\linewidth',fig.cap='Relative difference for the median difference in counts from the reference.',fig.align='center',warning=FALSE>>=
+data(lungData)
+controls = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-controls]
+rareFeatures = which(rowSums(MRcounts(lungTrim)>0)<10)
+lungTrim = lungTrim[-rareFeatures,]
+lungp = cumNormStat(lungTrim,pFlag=TRUE,main="Trimmed lung data")
+lungTrim = cumNorm(lungTrim,p=lungp)
+@
+
+After the user defines an appropriate model matrix for hypothesis testing there are optional inputs to \texttt{fitZig}, including settings determined by \texttt{zigControl}. We ask the user to review the help files for both \texttt{fitZig} and \texttt{zigControl}. For this example we include body site as covariates and want to test for the bacteria differentially abundant between smokers and non-smokers.
+
+<<zigTesting>>=
+smokingStatus = pData(lungTrim)$SmokingStatus
+bodySite = pData(lungTrim)$SampleType
+normFactor = normFactors(lungTrim)
+normFactor = log2(normFactor/median(normFactor) + 1)
+mod = model.matrix(~smokingStatus+bodySite + normFactor)
+settings = zigControl(maxit=10,verbose=TRUE)
+fit = fitZig(obj = lungTrim,mod=mod,useCSSoffset = FALSE,
+ control=settings)
+
+# The default, useCSSoffset = TRUE, automatically includes the CSS scaling normalization factor.
+@
+
+The result, \texttt{fit}, is a list providing detailed estimates of the fits including a
+\texttt{limma} fit in \texttt{fit\$fit} and an \texttt{ebayes} statistical fit in \texttt{fit\$eb}.
+This data can be analyzed like any \texttt{limma} fit and in this example, the column of
+the fitted coefficientsrepresents the fold-change for our "smoker" vs. "nonsmoker" analysis.
+
+Looking at the particular analysis just performed, there appears to be OTUs representing two
+\textit{Prevotella}, two \textit{Neisseria}, a \textit{Porphyromonas} and a \textit{Leptotrichia} that are differentially abundant. One should check that similarly annotated OTUs are not equally differentially abundant in controls.
+
+Alternatively, the user can input a model with their own normalization factors including them directly in the model matrix and specifying the option \texttt{useCSSoffset = FALSE} in fitZig.
+
+\subsubsection{Multiple groups}
+Assuming there are multiple groups it is possible to make use of Limma's topTable functions for F-tests
+and contrast functions to compare multiple groups and covariates of interest. The output of fitZig includes a 'MLArrayLM' Limma object that can be called on by other functions. When running fitZig by default there is an additional covariate added to the design matrix. The fit and the ultimate design matrix are crucial for contrasts.
+<<contrasts>>=
+# maxit=1 is for demonstration purposes
+settings = zigControl(maxit=1,verbose=FALSE)
+mod = model.matrix(~bodySite)
+colnames(mod) = levels(bodySite)
+# fitting the ZIG model
+res = fitZig(obj = lungTrim,mod=mod,control=settings)
+# The output of fitZig contains a list of various useful items. hint: names(res).
+#
+# Probably the most useful is the limma 'MLArrayLM' object called fit.
+zigFit = res$fit
+finalMod = res$fit$design
+
+contrast.matrix = makeContrasts(BAL.A-BAL.B,OW-PSB,levels=finalMod)
+fit2 = contrasts.fit(zigFit, contrast.matrix)
+fit2 = eBayes(fit2)
+topTable(fit2)
+
+# See help pages on decideTests, topTable, topTableF, vennDiagram, etc.
+@
+Further specific details can be found in section 9.3 and beyond of the Limma user guide. The take home message is that to make use of any Limma functions one needs to extract the final model matrix used: \textit{res\$fit\$design} and the MLArrayLM Limma fit object: \textit{res\$fit}.
+
+\subsubsection{Exporting fits}
+Currently functions are being developed to wrap and output results more neatly, but \texttt{MRcoefs}, \texttt{MRtable}, \texttt{MRfulltable} can be used to view coefficient fits and related statistics and export the data with optional output values - see help files to learn how they differ. An important note is that the \texttt{by} variable controls which coefficients are of interest whereas \texttt{coef} determines the display.\\
+
+To only consider features that are found in a large percentage of effectively positive (positive samples + the weight of zero counts included in the Gaussian mixture) use the \textbf{eff} option in the \texttt{MRtables}.
+
+<<fittedResult,tidy=TRUE>>=
+taxa =
+ sapply(strsplit(as.character(fData(lungTrim)$taxa),split=";"),
+ function(i){i[length(i)]})
+head(MRcoefs(fit,taxa=taxa,coef=2))
+@
+
+\subsection{Time series analysis}
+Implemented in the \texttt{fitTimeSeries} function is a method for calculating time intervals for which bacteria are
+differentially abundant. Fitting is performed using Smoothing Splines ANOVA (SS-ANOVA), as implemented in the \texttt{gss}
+package. Given observations at multiple time points for two groups the method calculates a function modeling the difference
+in abundance across all time. Using group membership permutations weestimate a null distribution of areas under the difference
+curve for the time intervals of interest and report significant intervals of time.
+
+Use of the function for analyses should cite:
+"Finding regions of interest in high throughput genomics data using smoothing splines"
+Talukder H, Paulson JN, Bravo HC. (Submitted)
+
+For a description of how to perform a time-series / genome based analysis call the \texttt{fitTimeSeries} vignette.
+<<timeSeries>>=
+# vignette("fitTimeSeries")
+@
+
+\subsection{Log Normal permutation test}
+Included is a standard log normal linear model with permutation based p-values permutation. We show the fit for the same model as above using 10 permutations providing p-value resolution to the tenth. The \texttt{coef} parameter refers to the coefficient of interest to test. We first generate the list of significant features.
+
+<<perm>>=
+coeffOfInterest = 2
+res = fitLogNormal(obj = lungTrim, mod = mod, useCSSoffset = FALSE, B = 10, coef = coeffOfInterest)
+
+# extract p.values and adjust for multiple testing
+# res$p are the p-values calculated through permutation
+adjustedPvalues = p.adjust(res$p,method="fdr")
+
+# extract the absolute fold-change estimates
+foldChange = abs(res$fit$coef[,coeffOfInterest])
+
+# determine features still significant and order by the
+sigList = which(adjustedPvalues <= .05)
+sigList = sigList[order(foldChange[sigList])]
+
+# view the top taxa associated with the coefficient of interest.
+head(taxa[sigList])
+@
+
+\subsection{Presence-absence testing}
+The hypothesis for the implemented presence-absence test is that the proportion/odds of a given feature present is higher/lower among one group of individuals compared to another, and we want to test whether any difference in the proportions observed is significant. We use Fisher's exact test to create a 2x2 contingency table and calculate p-values, odd's ratios, and confidence intervals. \texttt{fitPA} calculates the presence-absence for each organism and returns a table of p-values, o [...]
+
+<<presenceAbsence>>=
+classes = pData(mouseData)$diet
+res = fitPA(mouseData[1:5,],cl=classes)
+# Warning - the p-value is calculating 1 despite a high odd's ratio.
+head(res)
+@
+
+\subsection{Discovery odds ratio testing}
+The hypothesis for the implemented discovery test is that the proportion of observed counts for a feature of all counts are comparable between groups. We use Fisher's exact test to create a 2x2 contingency table and calculate p-values, odd's ratios, and confidence intervals. \texttt{fitDO} calculates the proportion of counts for each organism and returns a table of p-values, odd's ratios, and confidence intervals. The function will accept either a \texttt{MRexperiment} object or matrix.
+
+<<discOdds>>=
+classes = pData(mouseData)$diet
+res = fitDO(mouseData[1:100,],cl=classes,norm=FALSE,log=FALSE)
+head(res)
+@
+
+\subsection{Feature correlations}
+To test the correlations of abundance features, or samples, in a pairwise fashion we have implemented \texttt{correlationTest} and \texttt{correctIndices}. The \texttt{correlationTest} function will calculate basic pearson, spearman, kendall correlation statistics for the rows of the input and report the associated p-values. If a vector of length ncol(obj) it will also calculate the correlation of each row with the associated vector.
+
+<<corTest>>=
+cors = correlationTest(mouseData[55:60,],norm=FALSE,log=FALSE)
+head(cors)
+@
+\textbf{Caution:} http://www.ncbi.nlm.nih.gov/pubmed/23028285
+
+\subsection{Unique OTUs or features}
+To find features absent from any number of classes the function \texttt{uniqueFeatures} provides a table of the feature ids, the number of positive features and reads for each group. Thresholding for the number of positive samples or reads required are options.
+
+<<uniqueFeatures>>=
+cl = pData(mouseData)[["diet"]]
+uniqueFeatures(mouseData,cl,nsamples = 10,nreads = 100)
+@
+
+\newpage
+\section{Aggregating counts}
+Normalization is recommended at the OTU level. However, functions are in place to aggregate
+the count matrix (normalized or not), based on a particular user defined level. Using the
+featureData information in the MRexperiment object, calling \texttt{aggregateByTaxonomy} or \texttt{aggTax} on a MRexperiment object and declaring particular featureData column name (i.e.
+'genus') will aggregate counts to the desired level with the aggfun function (default colSums). Possible aggfun alternatives include colMeans and colMedians.
+
+<<aggTax>>=
+obj = aggTax(mouseData,lvl='phylum',out='matrix')
+head(obj[1:5,1:5])
+@
+
+Additionally, aggregating samples can be done using the
+phenoData information in the MRexperiment object. Calling \texttt{aggregateBySample} or \texttt{aggsamp} on a MRexperiment object and declaring a particular phenoData column name (i.e.
+'diet') will aggregate counts with the aggfun function (default rowMeans). Possible aggfun alternatives include rowSums and rowMedians.
+
+<<aggSamp>>=
+obj = aggSamp(mouseData,fct='mouseID',out='matrix')
+head(obj[1:5,1:5])
+@
+
+The \texttt{aggregateByTaxonomy},\texttt{aggregateBySample}, \texttt{aggTax} \texttt{aggSamp} functions are flexible enough to put in either 1) a matrix with a vector of labels or 2) a MRexperiment object with a vector of labels or featureData column name. The function can also output either a matrix or MRexperiment object.
+
+\newpage
+\section{Visualization of features}
+
+To help with visualization and analysis of datasets \texttt{metagenomeSeq} has several plotting functions to gain insight of the dataset's overall structure and particular individual features. An initial interactive exploration of the data can be displayed with the \texttt{display} function.
+
+For an overall look at the dataset we provide a number of plots including heatmaps of feature counts: \texttt{plotMRheatmap}, basic feature correlation structures: \texttt{plotCorr},
+PCA/MDS coordinates of samples or features: \texttt{plotOrd}, rarefaction effects: \texttt{plotRare} and contingency table
+style plots: \texttt{plotBubble}.
+
+
+Other plotting functions look at particular features such as the abundance for a single feature: \texttt{plotOTU} and \texttt{plotFeature}, or of multiple features at once:
+\texttt{plotGenus}. Plotting multiple OTUs with similar annotations allows for
+additional control of false discoveries.
+
+\subsection{Interactive Display}
+Due to recent advances in the \texttt{interactiveDisplay} package, calling the \texttt{display} function on
+\texttt{MRexperiment} objects will bring up a browser to explore your data through several interactive visualizations.
+For more detailed interactive visualizations one might be interested in the shiny-phyloseq package.
+
+<<interactiveDisplay>>=
+# Calling display on the MRexperiment object will start a browser session with interactive plots.
+
+# require(interactiveDisplay)
+# display(mouseData)
+@
+
+\subsection{Structural overview}
+Many studies begin by comparing the abundance composition across
+sample or feature phenotypes. Often a first step of data analysis is a
+heatmap, correlation or co-occurence plot or some other data exploratory method.
+The following functions have been implemented to provide a first step overview
+of the data:
+
+
+\begin{enumerate}
+\item \texttt{plotMRheatmap} - heatmap of abundance estimates (Fig. 4 left)
+\item \texttt{plotCorr} - heatmap of pairwise correlations (Fig. 4 right)
+\item \texttt{plotOrd} - PCA/CMDS components (Fig. 5 left)
+\item \texttt{plotRare} - rarefaction effect (Fig. 5 right)
+\item \texttt{plotBubble} - contingency table style plot (see help)
+\end{enumerate}
+
+\noindent
+Each of the above can include phenotypic information in helping to explore the data.
+
+Below we show an example of how to create a heatmap and hierarchical clustering of $\log_2$
+transformed counts for the 200 OTUs with the largest overall variance.
+Red values indicate counts close to zero. Row color labels indicate OTU
+taxonomic class; column color labels indicate diet (green = high fat,
+yellow = low fat). Notice the samples cluster by diet in these cases
+and there are obvious clusters. We then plot a correlation matrix for the same features.
+
+<<heatmapData,fig.cap='Left) Abundance heatmap (plotMRheatmap). Right) Correlation heatmap (plotCorr).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth'>>=
+trials = pData(mouseData)$diet
+heatmapColColors=brewer.pal(12,"Set3")[as.integer(factor(trials))];
+heatmapCols = colorRampPalette(brewer.pal(9, "RdBu"))(50)
+
+# plotMRheatmap
+plotMRheatmap(obj=mouseData,n=200,cexRow = 0.4,cexCol = 0.4,trace="none",
+ col = heatmapCols,ColSideColors = heatmapColColors)
+
+# plotCorr
+plotCorr(obj=mouseData,n=200,cexRow = 0.25,cexCol = 0.25,
+ trace="none",dendrogram="none",col=heatmapCols)
+@
+
+Below is an example of plotting CMDS plots of the data and the rarefaction effect at the OTU level. None of the data is removed (we recommend removing outliers typically).
+<<MDSandRareplots,fig.cap='Left) CMDS of features (plotOrd). Right) Rarefaction effect (plotRare).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth'>>=
+cl = factor(pData(mouseData)$diet)
+
+# plotOrd - can load vegan and set distfun = vegdist and use dist.method="bray"
+plotOrd(mouseData,tran=TRUE,usePCA=FALSE,useDist=TRUE,bg=cl,pch=21)
+
+# plotRare
+res = plotRare(mouseData,cl=cl,pch=21,bg=cl)
+
+# Linear fits for plotRare / legend
+tmp=lapply(levels(cl), function(lv)
+ lm(res[,"ident"]~res[,"libSize"]-1, subset=cl==lv))
+for(i in 1:length(levels(cl))){
+ abline(tmp[[i]], col=i)
+}
+legend("topleft", c("Diet 1","Diet 2"), text.col=c(1,2),box.col=NA)
+@
+
+\subsection{Feature specific}
+Reads clustered with high similarity represent functional or taxonomic units.
+However, it is possible that reads from the same organism get clustered into
+multiple OTUs. Following differential abundance analysis.
+It is important to confirm differential abundance.
+One way to limit false positives is ensure that the feature is actually abundant (enough positive samples).
+Another way is to plot the abundances of features similarly annotated.
+
+\begin{enumerate}
+\item \texttt{plotOTU} - abundances of a particular feature by group (Fig. 6 left)
+\item \texttt{plotGenus} - abundances for several features similarly annotated by group (Fig. 6 right)
+\item \texttt{plotFeature} - abundances of a particular feature by group (similar to plotOTU, Fig. 7)
+\end{enumerate}
+
+
+Below we use \texttt{plotOTU} to plot the normalized log(cpt) of a specific OTU annotated as \textit{Neisseria meningitidis}, in particular the 779th row of lungTrim's count matrix. Using \texttt{plotGenus} we plot the normalized log(cpt) of all OTUs annotated as \textit{Neisseria meningitidis}.
+
+It would appear that \textit{Neisseria meningitidis} is differentially more abundant in nonsmokers.
+<<plotOTUData,fig.cap='Left) Abundance plot (plotOTU). Right) Multiple OTU abundances (plotGenus).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth',tidy=TRUE>>=
+head(MRtable(fit,coef=2,taxa=1:length(fData(lungTrim)$taxa)))
+patients=sapply(strsplit(rownames(pData(lungTrim)),split="_"),
+ function(i){
+ i[3]
+ })
+pData(lungTrim)$patients=patients
+classIndex=list(smoker=which(pData(lungTrim)$SmokingStatus=="Smoker"))
+classIndex$nonsmoker=which(pData(lungTrim)$SmokingStatus=="NonSmoker")
+otu = 779
+
+# plotOTU
+plotOTU(lungTrim,otu=otu,classIndex,main="Neisseria meningitidis")
+
+# Now multiple OTUs annotated similarly
+x = fData(lungTrim)$taxa[otu]
+otulist = grep(x,fData(lungTrim)$taxa)
+
+# plotGenus
+plotGenus(lungTrim,otulist,classIndex,labs=FALSE,
+ main="Neisseria meningitidis")
+
+lablist<- c("S","NS")
+axis(1, at=seq(1,6,by=1), labels = rep(lablist,times=3))
+@
+
+<<plotFeatureData,fig.cap='Plot of raw abundances',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth',tidy=TRUE>>=
+classIndex=list(Western=which(pData(mouseData)$diet=="Western"))
+classIndex$BK=which(pData(mouseData)$diet=="BK")
+otuIndex = 8770
+
+# par(mfrow=c(1,2))
+dates = pData(mouseData)$date
+plotFeature(mouseData,norm=FALSE,log=FALSE,otuIndex,classIndex,
+ col=dates,sortby=dates,ylab="Raw reads")
+@
+
+\newpage
+\section{Summary}
+
+\texttt{metagenomeSeq} is specifically designed for sparse high-throughput sequencing experiments that addresses the analysis of differential abundance for marker-gene survey data. The package, while designed for marker-gene survey datasets, may be appropriate for other sparse data sets for which the zero-inflated Gaussian mixture model may apply. If you make use of the statistical method please cite our paper. If you made use of the manual/software, please cite the manual/software!
+
+\subsection{Citing metagenomeSeq}
+<<cite>>=
+citation("metagenomeSeq")
+@
+
+\subsection{Session Info}
+<<sessionInfo>>=
+sessionInfo()
+@
+
+\newpage
+\section{Appendix}
+\subsection{Appendix A: MRexperiment internals}
+The S4 class system in R allows for object oriented definitions. \texttt{metagenomeSeq} makes use of the \texttt{Biobase} package in Bioconductor and their virtual-class, \texttt{eSet}. Building off of \texttt{eSet}, the main S4 class in \texttt{metagenomeSeq} is termed \texttt{MRexperiment}. \texttt{MRexperiment} is a simple extension of \texttt{eSet}, adding a single slot, \texttt{expSummary}.
+
+The experiment summary slot is a data frame that includes the depth of coverage and the normalization factors for each sample. Future datasets can be formated as MRexperiment objects and analyzed with relative ease. A \texttt{MRexperiment} object is created by calling \texttt{newMRexperiment}, passing the counts, phenotype and feature data as parameters.
+
+We do not include normalization factors or library size in the currently available slot specified for the sample specific phenotype data. All matrices are organized in the \texttt{assayData} slot. All phenotype data (disease status, age, etc.) is stored in \texttt{phenoData} and feature data (OTUs, taxanomic assignment to varying levels, etc.) in \texttt{featureData}. Additional slots are available for reproducibility and annotation.
+
+\subsection{Appendix B: Mathematical model}
+
+Defining the class comparison of interest as $k(j)=I\{j \in \mathrm{ group } A\}$. The zero-inflated model is defined for the continuity-corrected $\log_2$ of the count data $y_{ij} = \log_2(c_{ij}+1)$ as a mixture of a point mass at zero $I_{\{0\}}(y_{ij})$ and a count distribution $f_{count}(y_{ij};\mu_i, \sigma_i^2) \sim N(\mu_i, \sigma_i^2)$.
+Given mixture parameters $\pi_{j}$, we have that the density of the zero-inflated Gaussian distribution for feature $i$, in sample $j$ with $S_{j}$ total counts is:
+
+\begin{equation}
+f_{zig}(y_{ij}; \theta ) = \pi_{j}(S_{j}) \cdot I_{\{0\}}(y_{ij})
++ (1-\pi_{j}(S_{j})) \cdot f_{count}(y_{ij};\theta)
+\end{equation}
+
+Maximum-likelihood estimates are approximated using an EM algorithm,
+where we treat mixture membership $\Delta_{ij}=1$ if $y_{ij}$ is
+generated from the zero point mass as latent indicator variables\cite{EM}. We make use of an EM algorithm to account for the linear relationship between sparsity and depth of coverage. The user can specify within the \texttt{fitZig} function a non-default zero model that accounts for more than simply the depth of coverage (e.g. country, age, any metadata associated with sparsity, etc.).
+See Figure 8 for the graphical model.
+
+\begin{figure}
+\centerline{\includegraphics[width=.7\textwidth]{metagenomeSeq_figure2.png}}
+\caption{\footnotesize{Graphical model. Green nodes represent observed variables: $S_j$ is the
+total number of reads in sample $j$; $k_j$ the case-control status
+of sample $j$; and $y_{ij}$ the logged normalized counts for feature $i$ in sample $j$. Yellow nodes represent counts obtained from each mixture component: counts come from either a spike-mass at zero,
+$y_{ij}^0$, or the ``count'' distribution, $y_{ij}^1$. Grey nodes $b_{0i}$, $b_{1i}$ and $\sigma_{i}^2$ represent the
+estimated overall mean, fold-change and variance of the count distribution component for feature $i$. $\pi_j$, is the mixture proportion for sample $j$ which depends on sequencing depth via a linear model defined by parameters $\beta_0$ and $\beta_1$. The expected value of latent indicator variables $\Delta_{ij}$ give the posterior probability of a count being generated from a spike-mass at zero, i.e. $y_{ij}^0$. We assume $M$ features and $N$ samples.}}
+\end{figure}
+
+More information will be included later. For now, please see the online methods in:
+
+http://www.nature.com/nmeth/journal/vaop/ncurrent/full/nmeth.2658.html
+
+\subsection{Appendix C: Calculating the proper percentile} To be included: an overview of the two methods implemented for the data driven percentile calculation and more description below.
+
+
+The choice of the appropriate quantile given is crucial for ensuring that the normalization approach does not introduce normalization-related artifacts in the data. At a high level, the count distribution of samples should all be roughly equivalent and independent of each other up to this quantile under the assumption that, at this range, counts are derived from a common distribution.
+
+
+More information will be included later. For now, please see the online methods in:
+
+http://www.nature.com/nmeth/journal/vaop/ncurrent/full/nmeth.2658.html
+
+\newpage
+\bibliography{metagenomeSeq}
+\end{document}
diff --git a/inst/doc/metagenomeSeq.pdf b/inst/doc/metagenomeSeq.pdf
new file mode 100644
index 0000000..d3f3442
Binary files /dev/null and b/inst/doc/metagenomeSeq.pdf differ
diff --git a/inst/extdata/CHK_NAME.otus.count.csv b/inst/extdata/CHK_NAME.otus.count.csv
new file mode 100644
index 0000000..9d6b87f
--- /dev/null
+++ b/inst/extdata/CHK_NAME.otus.count.csv
@@ -0,0 +1,1001 @@
+OTU CHK_6467_E3B11_BRONCH2_PREWASH_V1V2 CHK_6467_E3B11_OW_V1V2 CHK_6467_E3B08_OW_V1V2 CHK_6467_E3B07_BAL_A_V1V2 CHK_6467_E3B11_BAL_A_V1V2 CHK_6467_E3B09_OP_V1V2 CHK_6467_E3B08_BRONCH1_PREWASH_V1V2 CHK_6467_E3B11_BRONCH1_POSTWASH_V1V2 CHK_6467_E3B11_OP_V1V2 CHK_6467_E3B10_BRONCH1_TIPSWAB_V1V2 CHK_6467_E3B07_BAL_B_V1V2 CHK_6467_E3B08_BAL_A_V1V2 CHK_6467_E3B11_PSB_V1V2 CHK_6467_SAL1_11_5_209_11_18_V1V2 CHK_6467_E3B10_OW_V1V2 CHK_6467_SAL1_11_4_201_11_18_V1V2 CHK_6467_E3B09_BRONCH1_POSTWASH_ [...]
+1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+19 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+22 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+34 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+53 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+58 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+61 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+69 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+72 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+77 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 3 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 10 2 0 4 0 0 0 3 0 0 0 0 0 0 1 0 0 0 1 0 1 1 4 0 0 13
+78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 1 5 0 7 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 1 0 0 0 0
+80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+81 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+83 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+84 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+86 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+87 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+88 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+91 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 4 2 0 5 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 4 0 0 0 2
+92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+93 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+97 0 0 0 0 4 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 2 2 0 4 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+102 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 3 2 0 6 1 0 0 1 0 0 0 0 0 0 1 0 0 0 2 0 1 2 3 0 0 4
+104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+105 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+106 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+110 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 3
+111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+116 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+117 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+118 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+119 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+120 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+121 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+123 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+127 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+128 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+129 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+133 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+134 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+136 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+137 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+138 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+139 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+140 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+141 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+142 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+143 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+145 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+146 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+147 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+149 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+157 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+158 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+161 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+162 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+163 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+165 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+167 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+169 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+171 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+172 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+173 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+174 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+175 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+176 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+177 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+178 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+179 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+181 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+182 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+183 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+184 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+185 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+186 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+188 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+189 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+190 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+191 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+193 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+194 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+195 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+196 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+197 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+198 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1
+199 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+202 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+203 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+204 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+205 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+206 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+208 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+209 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+210 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+211 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+212 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+213 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+214 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+215 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+216 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+217 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+218 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+219 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+221 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+222 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+223 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+224 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+225 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+226 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+227 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+228 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+229 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+231 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+232 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+233 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+234 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+235 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+236 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+237 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+239 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+240 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+241 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+242 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+243 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+244 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+245 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+247 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+248 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+249 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+251 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+252 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+254 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+257 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+258 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+259 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+260 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+261 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+262 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+263 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+264 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+265 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+266 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+267 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
+268 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+269 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+270 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+271 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+272 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+273 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+274 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+275 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+276 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+277 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+279 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+280 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+281 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+282 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+283 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+284 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+285 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+286 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+287 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+288 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+289 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+290 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+291 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+292 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+293 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+294 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+295 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+296 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+297 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+298 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+299 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+301 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+302 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+303 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+304 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+305 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+306 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+307 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+309 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+310 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+311 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+312 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+313 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+314 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+315 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+316 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+317 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+318 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+319 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+320 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+321 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+322 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+323 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+324 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+325 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+326 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+327 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+328 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+329 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+330 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+331 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+332 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+333 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+335 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+336 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+337 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+338 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+339 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+340 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+341 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+342 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+343 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+344 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0
+345 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+346 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+347 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+348 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+349 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+350 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+351 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+352 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+353 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+354 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+355 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+356 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+357 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+358 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+359 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+360 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+361 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+362 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+363 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+364 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+365 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+366 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+367 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+368 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+369 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+370 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+371 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+372 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+373 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+374 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+375 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+376 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+377 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+378 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+379 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+380 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+381 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+382 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+383 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+384 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+385 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+386 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+387 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+388 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+389 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+390 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+391 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+392 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+393 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+394 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+395 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+396 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+397 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+398 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+399 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+400 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+401 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+402 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+403 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+404 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+405 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+406 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+407 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+408 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+409 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+410 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+411 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+412 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+413 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+414 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+415 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+416 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+417 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+418 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+419 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+420 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+421 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+422 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+423 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+424 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+425 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+426 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+427 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+428 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+429 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+430 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+431 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+432 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+433 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+434 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+435 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+436 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+437 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+438 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+439 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+440 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+441 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+442 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+443 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+445 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+446 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+447 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+449 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+450 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+451 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+452 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+453 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+454 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+455 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+457 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1
+458 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+459 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+460 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+461 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+462 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+463 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+464 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+465 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+466 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+467 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+468 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+469 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+470 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+471 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+472 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+474 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+475 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+476 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+477 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+478 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+479 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+481 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+482 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+483 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+484 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+485 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+486 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+487 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+488 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+489 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+490 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+491 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+492 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+493 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+494 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+495 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+497 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+498 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+499 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+501 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+502 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+505 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+506 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+507 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+508 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+509 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+510 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+512 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+513 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+514 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+516 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+517 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+518 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+519 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+520 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+521 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+522 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+523 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+524 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+526 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+527 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+528 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+529 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+530 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+531 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+532 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+533 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+534 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+535 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+537 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+538 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+539 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+540 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+541 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+542 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+543 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0
+544 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+546 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+547 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+548 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+549 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+550 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+551 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+552 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+553 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+554 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+555 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+557 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+558 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+559 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+560 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+561 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+562 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+563 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+564 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+565 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+566 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+567 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+568 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+569 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+570 0 1 0 0 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 2 0 1 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 23 6 0 14 10 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 3 0 0 0 1
+571 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+572 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+573 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+574 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+576 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+577 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 1
+578 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+579 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0
+580 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+581 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+582 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+583 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+584 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+585 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+586 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+587 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+588 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+589 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+591 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 6 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 3
+592 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+593 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+594 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+595 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+596 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+597 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+598 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+599 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 15 1 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0
+600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+601 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+603 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+604 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+605 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+606 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+607 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+609 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+610 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+611 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+612 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+613 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+614 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+615 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+616 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+617 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+618 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+619 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+620 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+621 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+623 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+624 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+626 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+627 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+628 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+629 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+630 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+631 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+632 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+633 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+634 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+635 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+636 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+637 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+638 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+640 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+641 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+642 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+643 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+644 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+645 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+646 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+647 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+648 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+649 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+650 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+651 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+652 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+653 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+654 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+655 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+656 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+657 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+658 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+659 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+660 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+661 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+662 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+663 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+664 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+665 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+666 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1
+667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+668 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+669 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+670 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+671 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+672 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+673 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+674 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+675 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+677 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+678 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+679 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+680 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+681 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+682 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+683 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+684 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+685 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+686 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+687 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+688 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+689 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+690 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+691 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+692 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+693 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+694 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+695 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+696 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+697 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+698 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+699 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+700 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+701 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+702 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+703 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+704 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+705 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+706 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+707 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+708 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+709 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+710 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+711 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+712 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+713 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+714 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+715 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+716 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+717 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+718 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+719 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+720 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+721 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+723 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+724 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+725 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+726 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+727 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+728 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+729 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+730 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+731 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+732 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+733 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+734 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+735 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+736 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+737 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+738 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+739 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+740 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+741 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+742 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+743 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+744 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+745 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+746 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+747 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+748 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+749 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+750 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+751 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1
+752 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+753 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+754 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+755 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+756 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+757 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+758 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+759 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+760 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+761 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+762 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+763 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+764 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+765 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+766 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+767 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+768 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+769 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+770 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+771 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+772 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+773 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+774 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+775 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+776 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+777 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+779 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+780 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+781 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+782 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+783 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+784 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+785 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+786 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+787 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+788 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+789 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+790 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+791 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+792 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+793 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+794 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+795 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+796 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+797 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+798 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+799 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+801 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+802 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+803 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+804 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+805 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+806 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+807 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+808 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+809 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+810 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+811 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+812 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+813 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+814 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+815 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+816 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+817 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+818 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+819 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+820 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+821 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+822 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+823 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+824 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+825 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+826 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+827 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+828 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+829 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+830 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+831 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+832 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+834 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+835 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+836 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+837 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+838 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+839 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+840 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+841 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+842 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+843 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+844 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+845 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+846 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+847 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+848 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+849 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+850 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+851 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+852 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+853 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+854 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+855 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+856 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+857 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+858 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+859 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+860 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+861 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+862 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+863 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+865 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+866 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+867 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+868 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+869 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+870 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+871 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+872 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+873 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+874 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+875 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+876 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+877 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+878 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+879 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+880 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+881 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+882 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+883 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+884 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+885 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+886 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+887 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+888 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+889 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+890 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+891 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+892 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+894 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+895 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+896 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+897 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+898 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+899 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+900 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+901 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+902 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+903 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+904 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+905 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+906 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+907 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+908 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+909 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+910 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+911 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+912 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+913 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+914 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+915 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+916 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+917 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+918 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+919 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+920 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+921 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+922 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0
+923 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+924 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+925 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+926 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+927 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+928 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+929 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+930 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+931 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+932 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+933 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+934 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+935 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+936 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+937 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+938 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+939 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+940 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+941 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+942 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+943 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+944 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+945 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+946 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+947 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+948 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+949 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+950 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+951 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+952 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+953 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+954 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+955 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+956 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+957 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+958 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+959 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+960 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+961 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+962 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+963 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+964 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+965 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+966 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+967 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+968 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+969 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+970 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+971 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+972 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+973 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+974 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+975 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+976 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+977 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+978 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 0 0 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 8 0 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 4
+979 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+980 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+981 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+982 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+983 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+984 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+985 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+986 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+987 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+988 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+989 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+990 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+991 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+993 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+994 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+995 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+996 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+997 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+998 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+999 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
diff --git a/inst/extdata/CHK_clinical.csv b/inst/extdata/CHK_clinical.csv
new file mode 100644
index 0000000..29881db
--- /dev/null
+++ b/inst/extdata/CHK_clinical.csv
@@ -0,0 +1,79 @@
+Sample ID SampleType SiteSampled SmokingStatus
+CHK_6467_H201_12_6_281_12_6_V1V2 Extraction.Control Water NA
+CHK_6467_H2O1_11_2_223_11_29_V1V2 Extraction.Control Water NA
+CHK_6467_H2O1_11_2_280_11_30_V1V2 Extraction.Control Water NA
+CHK_6467_H2O1_11_4_222_11_18_V1V2 Extraction.Control Water NA
+CHK_6467_H2O1_11_5_208_11_18_V1V2 Extraction.Control Water NA
+CHK_6467_SAL1_11_2_224_11_29_V1V2 Extraction.Control Sterile.Saline NA
+CHK_6467_SAL1_11_4_201_11_18_V1V2 Extraction.Control Sterile.Saline NA
+CHK_6467_SAL1_11_5_209_11_18_V1V2 Extraction.Control Sterile.Saline NA
+CHK_6467_SS1_11_2_253_11_30_V1V2 Extraction.Control Sterile.Swab NA
+CHK_6467_SS1_11_4_272_11_30_V1V2 Extraction.Control Sterile.Swab NA
+CHK_6467_PSBMETAL_12_6_286_12_6_V1V2 Extraction.Control Sterile.PSB NA
+CHK_6467_PSBPLASTIC_12_6_285_12_6_V1V2 Extraction.Control Sterile.PSB NA
+CHK_6467_E3B06_BRONCH1_PREWASH_V1V2 Bronch1.PreWash Bronchoscope.Channel Smoker
+CHK_6467_E3B07_BRONCH1_PREWASH_V1V2 Bronch1.PreWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B08_BRONCH1_PREWASH_V1V2 Bronch1.PreWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B09_BRONCH1_PREWASH_V1V2 Bronch1.PreWash Bronchoscope.Channel Smoker
+CHK_6467_E3B10_BRONCH1_PREWASH_V1V2 Bronch1.PreWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B11_BRONCH1_PREWASH_V1V2 Bronch1.PreWash Bronchoscope.Channel Smoker
+CHK_6467_E3B06_BRONCH2_PREWASH_V1V2 Bronch2.PreWash Bronchoscope.Channel Smoker
+CHK_6467_E3B07_BRONCH2_PREWASH_V1V2 Bronch2.PreWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B08_BRONCH2_PREWASH_V1V2 Bronch2.PreWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B09_BRONCH2_PREWASH_V1V2 Bronch2.PreWash Bronchoscope.Channel Smoker
+CHK_6467_E3B10_BRONCH2_PREWASH_V1V2 Bronch2.PreWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B11_BRONCH2_PREWASH_V1V2 Bronch2.PreWash Bronchoscope.Channel Smoker
+CHK_6467_E3B06_NP_V1V2 NP.Swab Nasopharynx Smoker
+CHK_6467_E3B07_NP_V1V2 NP.Swab Nasopharynx NonSmoker
+CHK_6467_E3B08_NP_V1V2 NP.Swab Nasopharynx NonSmoker
+CHK_6467_E3B09_NP_V1V2 NP.Swab Nasopharynx Smoker
+CHK_6467_E3B10_NP_V1V2 NP.Swab Nasopharynx NonSmoker
+CHK_6467_E3B11_NP_V1V2 NP.Swab Nasopharynx Smoker
+CHK_6467_E3B06_OP_V1V2 OP.Swab Oropharynx Smoker
+CHK_6467_E3B07_OP_V1V2 OP.Swab Oropharynx NonSmoker
+CHK_6467_E3B08_OP_V1V2 OP.Swab Oropharynx NonSmoker
+CHK_6467_E3B09_OP_V1V2 OP.Swab Oropharynx Smoker
+CHK_6467_E3B10_OP_V1V2 OP.Swab Oropharynx NonSmoker
+CHK_6467_E3B11_OP_V1V2 OP.Swab Oropharynx Smoker
+CHK_6467_E3B06_OW_V1V2 OW OralCavity Smoker
+CHK_6467_E3B07_OW_V1V2 OW OralCavity NonSmoker
+CHK_6467_E3B08_OW_V1V2 OW OralCavity NonSmoker
+CHK_6467_E3B09_OW_V1V2 OW OralCavity Smoker
+CHK_6467_E3B10_OW_V1V2 OW OralCavity NonSmoker
+CHK_6467_E3B11_OW_V1V2 OW OralCavity Smoker
+CHK_6467_E3B06_BRONCH1_TIPSWAB_V1V2 Bronch1.TipSwab Bronchoscope.Tip Smoker
+CHK_6467_E3B07_BRONCH1_TIPSWAB_V1V2 Bronch1.TipSwab Bronchoscope.Tip NonSmoker
+CHK_6467_E3B08_BRONCH1_TIPSWAB_V1V2 Bronch1.TipSwab Bronchoscope.Tip NonSmoker
+CHK_6467_E3B09_BRONCH1_TIPSWAB_V1V2 Bronch1.TipSwab Bronchoscope.Tip Smoker
+CHK_6467_E3B10_BRONCH1_TIPSWAB_V1V2 Bronch1.TipSwab Bronchoscope.Tip NonSmoker
+CHK_6467_E3B11_BRONCH1_TIPSWAB_V1V2 Bronch1.TipSwab Bronchoscope.Tip Smoker
+CHK_6467_E3B06_BRONCH1_POSTWASH_V1V2 Bronch1.PostWash Bronchoscope.Channel Smoker
+CHK_6467_E3B07_BRONCH1_POSTWASH_V1V2 Bronch1.PostWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B08_BRONCH1_POSTWASH_V1V2 Bronch1.PostWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B09_BRONCH1_POSTWASH_V1V2 Bronch1.PostWash Bronchoscope.Channel Smoker
+CHK_6467_E3B10_BRONCH1_POSTWASH_V1V2 Bronch1.PostWash Bronchoscope.Channel NonSmoker
+CHK_6467_E3B11_BRONCH1_POSTWASH_V1V2 Bronch1.PostWash Bronchoscope.Channel Smoker
+CHK_6467_E3B06_BAL_1STRETURN_V1V2 BAL.1stReturn Lung Smoker
+CHK_6467_E3B07_BAL_1STRETURN_V1V2 BAL.1stReturn Lung NonSmoker
+CHK_6467_E3B08_BAL_1STRETURN_V1V2 BAL.1stReturn Lung NonSmoker
+CHK_6467_E3B09_BAL_1STRETURN_V1V2 BAL.1stReturn Lung Smoker
+CHK_6467_E3B10_BAL_1STRETURN_V1V2 BAL.1stReturn Lung NonSmoker
+CHK_6467_E3B11_BAL_1STRETURN_V1V2 BAL.1stReturn Lung Smoker
+CHK_6467_E3B06_BAL_A_V1V2 BAL.A Lung Smoker
+CHK_6467_E3B07_BAL_A_V1V2 BAL.A Lung NonSmoker
+CHK_6467_E3B08_BAL_A_V1V2 BAL.A Lung NonSmoker
+CHK_6467_E3B09_BAL_A_V1V2 BAL.A Lung Smoker
+CHK_6467_E3B10_BAL_A_V1V2 BAL.A Lung NonSmoker
+CHK_6467_E3B11_BAL_A_V1V2 BAL.A Lung Smoker
+CHK_6467_E3B06_BAL_B_V1V2 BAL.B Lung Smoker
+CHK_6467_E3B07_BAL_B_V1V2 BAL.B Lung NonSmoker
+CHK_6467_E3B08_BAL_B_V1V2 BAL.B Lung NonSmoker
+CHK_6467_E3B09_BAL_B_V1V2 BAL.B Lung Smoker
+CHK_6467_E3B10_BAL_B_V1V2 BAL.B Lung NonSmoker
+CHK_6467_E3B11_BAL_B_V1V2 BAL.B Lung Smoker
+CHK_6467_E3B06_PSB_V1V2 PSB Lung.Mucosa Smoker
+CHK_6467_E3B07_PSB_V1V2 PSB Lung.Mucosa NonSmoker
+CHK_6467_E3B08_PSB_V1V2 PSB Lung.Mucosa NonSmoker
+CHK_6467_E3B09_PSB_V1V2 PSB Lung.Mucosa Smoker
+CHK_6467_E3B10_PSB_V1V2 PSB Lung.Mucosa NonSmoker
+CHK_6467_E3B11_PSB_V1V2 PSB Lung.Mucosa Smoker
diff --git a/inst/extdata/CHK_otus.taxonomy.csv b/inst/extdata/CHK_otus.taxonomy.csv
new file mode 100644
index 0000000..678848a
--- /dev/null
+++ b/inst/extdata/CHK_otus.taxonomy.csv
@@ -0,0 +1,1001 @@
+OTU Taxonomy superkingdom phylum class order family genus species strain
+1 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+2 OTU_2 NA NA NA NA NA NA NA NA
+3 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Actinobacteridae;Actinomycetales;Actinomycineae;Actinomycetaceae;Actinomyces;Actinomyces radicidentis Bacteria Actinobacteria Actinobacteria (class) Actinomycetales Actinomycetaceae Actinomyces Actinomyces radicidentis NA
+4 OTU_4 NA NA NA NA NA NA NA NA
+5 OTU_5 NA NA NA NA NA NA NA NA
+6 OTU_6 NA NA NA NA NA NA NA NA
+7 OTU_7 NA NA NA NA NA NA NA NA
+8 OTU_8 NA NA NA NA NA NA NA NA
+9 OTU_9 NA NA NA NA NA NA NA NA
+10 OTU_10 NA NA NA NA NA NA NA NA
+11 OTU_11 NA NA NA NA NA NA NA NA
+12 OTU_12 NA NA NA NA NA NA NA NA
+13 OTU_13 NA NA NA NA NA NA NA NA
+14 OTU_14 NA NA NA NA NA NA NA NA
+15 OTU_15 NA NA NA NA NA NA NA NA
+16 OTU_16 NA NA NA NA NA NA NA NA
+17 OTU_17 NA NA NA NA NA NA NA NA
+18 OTU_18 NA NA NA NA NA NA NA NA
+19 OTU_19 NA NA NA NA NA NA NA NA
+20 OTU_20 NA NA NA NA NA NA NA NA
+21 OTU_21 NA NA NA NA NA NA NA NA
+22 OTU_22 NA NA NA NA NA NA NA NA
+23 OTU_23 NA NA NA NA NA NA NA NA
+24 OTU_24 NA NA NA NA NA NA NA NA
+25 OTU_25 NA NA NA NA NA NA NA NA
+26 OTU_26 NA NA NA NA NA NA NA NA
+27 OTU_27 NA NA NA NA NA NA NA NA
+28 OTU_28 NA NA NA NA NA NA NA NA
+29 OTU_29 NA NA NA NA NA NA NA NA
+30 OTU_30 NA NA NA NA NA NA NA NA
+31 OTU_31 NA NA NA NA NA NA NA NA
+32 OTU_32 NA NA NA NA NA NA NA NA
+33 OTU_33 NA NA NA NA NA NA NA NA
+34 OTU_34 NA NA NA NA NA NA NA NA
+35 OTU_35 NA NA NA NA NA NA NA NA
+36 OTU_36 NA NA NA NA NA NA NA NA
+37 OTU_37 NA NA NA NA NA NA NA NA
+38 OTU_38 NA NA NA NA NA NA NA NA
+39 OTU_39 NA NA NA NA NA NA NA NA
+40 OTU_40 NA NA NA NA NA NA NA NA
+41 OTU_41 NA NA NA NA NA NA NA NA
+42 OTU_42 NA NA NA NA NA NA NA NA
+43 OTU_43 NA NA NA NA NA NA NA NA
+44 OTU_44 NA NA NA NA NA NA NA NA
+45 OTU_45 NA NA NA NA NA NA NA NA
+46 OTU_46 NA NA NA NA NA NA NA NA
+47 OTU_47 NA NA NA NA NA NA NA NA
+48 OTU_48 NA NA NA NA NA NA NA NA
+49 OTU_49 NA NA NA NA NA NA NA NA
+50 OTU_50 NA NA NA NA NA NA NA NA
+51 OTU_51 NA NA NA NA NA NA NA NA
+52 OTU_52 NA NA NA NA NA NA NA NA
+53 OTU_53 NA NA NA NA NA NA NA NA
+54 OTU_54 NA NA NA NA NA NA NA NA
+55 OTU_55 NA NA NA NA NA NA NA NA
+56 OTU_56 NA NA NA NA NA NA NA NA
+57 OTU_57 NA NA NA NA NA NA NA NA
+58 OTU_58 NA NA NA NA NA NA NA NA
+59 OTU_59 NA NA NA NA NA NA NA NA
+60 OTU_60 NA NA NA NA NA NA NA NA
+61 OTU_61 NA NA NA NA NA NA NA NA
+62 OTU_62 NA NA NA NA NA NA NA NA
+63 OTU_63 NA NA NA NA NA NA NA NA
+64 OTU_64 NA NA NA NA NA NA NA NA
+65 OTU_65 NA NA NA NA NA NA NA NA
+66 OTU_66 NA NA NA NA NA NA NA NA
+67 OTU_67 NA NA NA NA NA NA NA NA
+68 OTU_68 NA NA NA NA NA NA NA NA
+69 OTU_69 NA NA NA NA NA NA NA NA
+70 OTU_70 NA NA NA NA NA NA NA NA
+71 OTU_71 NA NA NA NA NA NA NA NA
+72 OTU_72 NA NA NA NA NA NA NA NA
+73 OTU_73 NA NA NA NA NA NA NA NA
+74 OTU_74 NA NA NA NA NA NA NA NA
+75 OTU_75 NA NA NA NA NA NA NA NA
+76 OTU_76 NA NA NA NA NA NA NA NA
+77 OTU_77 NA NA NA NA NA NA NA NA
+78 OTU_78 NA NA NA NA NA NA NA NA
+79 OTU_79 NA NA NA NA NA NA NA NA
+80 OTU_80 NA NA NA NA NA NA NA NA
+81 OTU_81 NA NA NA NA NA NA NA NA
+82 OTU_82 NA NA NA NA NA NA NA NA
+83 OTU_83 NA NA NA NA NA NA NA NA
+84 OTU_84 NA NA NA NA NA NA NA NA
+85 OTU_85 NA NA NA NA NA NA NA NA
+86 OTU_86 NA NA NA NA NA NA NA NA
+87 OTU_87 NA NA NA NA NA NA NA NA
+88 OTU_88 NA NA NA NA NA NA NA NA
+89 OTU_89 NA NA NA NA NA NA NA NA
+90 OTU_90 NA NA NA NA NA NA NA NA
+91 OTU_91 NA NA NA NA NA NA NA NA
+92 OTU_92 NA NA NA NA NA NA NA NA
+93 OTU_93 NA NA NA NA NA NA NA NA
+94 OTU_94 NA NA NA NA NA NA NA NA
+95 OTU_95 NA NA NA NA NA NA NA NA
+96 OTU_96 NA NA NA NA NA NA NA NA
+97 OTU_97 NA NA NA NA NA NA NA NA
+98 OTU_98 NA NA NA NA NA NA NA NA
+99 OTU_99 NA NA NA NA NA NA NA NA
+100 OTU_100 NA NA NA NA NA NA NA NA
+101 OTU_101 NA NA NA NA NA NA NA NA
+102 OTU_102 NA NA NA NA NA NA NA NA
+103 OTU_103 NA NA NA NA NA NA NA NA
+104 OTU_104 NA NA NA NA NA NA NA NA
+105 OTU_105 NA NA NA NA NA NA NA NA
+106 OTU_106 NA NA NA NA NA NA NA NA
+107 OTU_107 NA NA NA NA NA NA NA NA
+108 OTU_108 NA NA NA NA NA NA NA NA
+109 OTU_109 NA NA NA NA NA NA NA NA
+110 OTU_110 NA NA NA NA NA NA NA NA
+111 OTU_111 NA NA NA NA NA NA NA NA
+112 OTU_112 NA NA NA NA NA NA NA NA
+113 OTU_113 NA NA NA NA NA NA NA NA
+114 OTU_114 NA NA NA NA NA NA NA NA
+115 OTU_115 NA NA NA NA NA NA NA NA
+116 OTU_116 NA NA NA NA NA NA NA NA
+117 OTU_117 NA NA NA NA NA NA NA NA
+118 OTU_118 NA NA NA NA NA NA NA NA
+119 OTU_119 NA NA NA NA NA NA NA NA
+120 OTU_120 NA NA NA NA NA NA NA NA
+121 OTU_121 NA NA NA NA NA NA NA NA
+122 OTU_122 NA NA NA NA NA NA NA NA
+123 OTU_123 NA NA NA NA NA NA NA NA
+124 OTU_124 NA NA NA NA NA NA NA NA
+125 OTU_125 NA NA NA NA NA NA NA NA
+126 OTU_126 NA NA NA NA NA NA NA NA
+127 OTU_127 NA NA NA NA NA NA NA NA
+128 OTU_128 NA NA NA NA NA NA NA NA
+129 OTU_129 NA NA NA NA NA NA NA NA
+130 OTU_130 NA NA NA NA NA NA NA NA
+131 OTU_131 NA NA NA NA NA NA NA NA
+132 OTU_132 NA NA NA NA NA NA NA NA
+133 OTU_133 NA NA NA NA NA NA NA NA
+134 OTU_134 NA NA NA NA NA NA NA NA
+135 OTU_135 NA NA NA NA NA NA NA NA
+136 OTU_136 NA NA NA NA NA NA NA NA
+137 OTU_137 NA NA NA NA NA NA NA NA
+138 OTU_138 NA NA NA NA NA NA NA NA
+139 OTU_139 NA NA NA NA NA NA NA NA
+140 OTU_140 NA NA NA NA NA NA NA NA
+141 OTU_141 NA NA NA NA NA NA NA NA
+142 OTU_142 NA NA NA NA NA NA NA NA
+143 OTU_143 NA NA NA NA NA NA NA NA
+144 OTU_144 NA NA NA NA NA NA NA NA
+145 OTU_145 NA NA NA NA NA NA NA NA
+146 OTU_146 NA NA NA NA NA NA NA NA
+147 OTU_147 NA NA NA NA NA NA NA NA
+148 OTU_148 NA NA NA NA NA NA NA NA
+149 OTU_149 NA NA NA NA NA NA NA NA
+150 OTU_150 NA NA NA NA NA NA NA NA
+151 OTU_151 NA NA NA NA NA NA NA NA
+152 OTU_152 NA NA NA NA NA NA NA NA
+153 OTU_153 NA NA NA NA NA NA NA NA
+154 OTU_154 NA NA NA NA NA NA NA NA
+155 OTU_155 NA NA NA NA NA NA NA NA
+156 OTU_156 NA NA NA NA NA NA NA NA
+157 OTU_157 NA NA NA NA NA NA NA NA
+158 OTU_158 NA NA NA NA NA NA NA NA
+159 OTU_159 NA NA NA NA NA NA NA NA
+160 OTU_160 NA NA NA NA NA NA NA NA
+161 OTU_161 NA NA NA NA NA NA NA NA
+162 OTU_162 NA NA NA NA NA NA NA NA
+163 OTU_163 NA NA NA NA NA NA NA NA
+164 OTU_164 NA NA NA NA NA NA NA NA
+165 OTU_165 NA NA NA NA NA NA NA NA
+166 OTU_166 NA NA NA NA NA NA NA NA
+167 OTU_167 NA NA NA NA NA NA NA NA
+168 ;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Clostridiales incertae sedis;Clostridiales Family XI. Incertae Sedis;Anaerococcus;Anaerococcus octavius Bacteria Firmicutes Clostridia Clostridiales Clostridiales Family XI. Incertae Sedis Anaerococcus Anaerococcus octavius NA
+169 OTU_169 NA NA NA NA NA NA NA NA
+170 OTU_170 NA NA NA NA NA NA NA NA
+171 OTU_171 NA NA NA NA NA NA NA NA
+172 OTU_172 NA NA NA NA NA NA NA NA
+173 OTU_173 NA NA NA NA NA NA NA NA
+174 OTU_174 NA NA NA NA NA NA NA NA
+175 OTU_175 NA NA NA NA NA NA NA NA
+176 OTU_176 NA NA NA NA NA NA NA NA
+177 OTU_177 NA NA NA NA NA NA NA NA
+178 OTU_178 NA NA NA NA NA NA NA NA
+179 OTU_179 NA NA NA NA NA NA NA NA
+180 OTU_180 NA NA NA NA NA NA NA NA
+181 OTU_181 NA NA NA NA NA NA NA NA
+182 OTU_182 NA NA NA NA NA NA NA NA
+183 OTU_183 NA NA NA NA NA NA NA NA
+184 OTU_184 NA NA NA NA NA NA NA NA
+185 OTU_185 NA NA NA NA NA NA NA NA
+186 OTU_186 NA NA NA NA NA NA NA NA
+187 OTU_187 NA NA NA NA NA NA NA NA
+188 OTU_188 NA NA NA NA NA NA NA NA
+189 OTU_189 NA NA NA NA NA NA NA NA
+190 OTU_190 NA NA NA NA NA NA NA NA
+191 OTU_191 NA NA NA NA NA NA NA NA
+192 OTU_192 NA NA NA NA NA NA NA NA
+193 OTU_193 NA NA NA NA NA NA NA NA
+194 OTU_194 NA NA NA NA NA NA NA NA
+195 OTU_195 NA NA NA NA NA NA NA NA
+196 OTU_196 NA NA NA NA NA NA NA NA
+197 OTU_197 NA NA NA NA NA NA NA NA
+198 OTU_198 NA NA NA NA NA NA NA NA
+199 OTU_199 NA NA NA NA NA NA NA NA
+200 OTU_200 NA NA NA NA NA NA NA NA
+201 OTU_201 NA NA NA NA NA NA NA NA
+202 OTU_202 NA NA NA NA NA NA NA NA
+203 OTU_203 NA NA NA NA NA NA NA NA
+204 ;cellular organisms;Bacteria;Firmicutes;Bacilli;Lactobacillales;Carnobacteriaceae;Granulicatella;Granulicatella elegans Bacteria Firmicutes Bacilli Lactobacillales Carnobacteriaceae Granulicatella Granulicatella elegans NA
+205 OTU_205 NA NA NA NA NA NA NA NA
+206 ;cellular organisms;Bacteria;Fusobacteria;Fusobacteria (class);Fusobacteriales;Fusobacteriaceae;Leptotrichia;Leptotrichia sp. oral isolate A39FD Bacteria Fusobacteria Fusobacteria (class) Fusobacteriales Fusobacteriaceae Leptotrichia Leptotrichia sp. oral isolate A39FD NA
+207 OTU_207 NA NA NA NA NA NA NA NA
+208 OTU_208 NA NA NA NA NA NA NA NA
+209 OTU_209 NA NA NA NA NA NA NA NA
+210 OTU_210 NA NA NA NA NA NA NA NA
+211 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella montpellierensis Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella montpellierensis NA
+212 OTU_212 NA NA NA NA NA NA NA NA
+213 OTU_213 NA NA NA NA NA NA NA NA
+214 OTU_214 NA NA NA NA NA NA NA NA
+215 OTU_215 NA NA NA NA NA NA NA NA
+216 OTU_216 NA NA NA NA NA NA NA NA
+217 OTU_217 NA NA NA NA NA NA NA NA
+218 OTU_218 NA NA NA NA NA NA NA NA
+219 OTU_219 NA NA NA NA NA NA NA NA
+220 OTU_220 NA NA NA NA NA NA NA NA
+221 OTU_221 NA NA NA NA NA NA NA NA
+222 OTU_222 NA NA NA NA NA NA NA NA
+223 OTU_223 NA NA NA NA NA NA NA NA
+224 OTU_224 NA NA NA NA NA NA NA NA
+225 OTU_225 NA NA NA NA NA NA NA NA
+226 OTU_226 NA NA NA NA NA NA NA NA
+227 OTU_227 NA NA NA NA NA NA NA NA
+228 OTU_228 NA NA NA NA NA NA NA NA
+229 OTU_229 NA NA NA NA NA NA NA NA
+230 OTU_230 NA NA NA NA NA NA NA NA
+231 OTU_231 NA NA NA NA NA NA NA NA
+232 OTU_232 NA NA NA NA NA NA NA NA
+233 OTU_233 NA NA NA NA NA NA NA NA
+234 OTU_234 NA NA NA NA NA NA NA NA
+235 OTU_235 NA NA NA NA NA NA NA NA
+236 OTU_236 NA NA NA NA NA NA NA NA
+237 OTU_237 NA NA NA NA NA NA NA NA
+238 OTU_238 NA NA NA NA NA NA NA NA
+239 OTU_239 NA NA NA NA NA NA NA NA
+240 OTU_240 NA NA NA NA NA NA NA NA
+241 OTU_241 NA NA NA NA NA NA NA NA
+242 OTU_242 NA NA NA NA NA NA NA NA
+243 OTU_243 NA NA NA NA NA NA NA NA
+244 OTU_244 NA NA NA NA NA NA NA NA
+245 OTU_245 NA NA NA NA NA NA NA NA
+246 OTU_246 NA NA NA NA NA NA NA NA
+247 OTU_247 NA NA NA NA NA NA NA NA
+248 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella magna Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella magna NA
+249 OTU_249 NA NA NA NA NA NA NA NA
+250 OTU_250 NA NA NA NA NA NA NA NA
+251 OTU_251 NA NA NA NA NA NA NA NA
+252 OTU_252 NA NA NA NA NA NA NA NA
+253 OTU_253 NA NA NA NA NA NA NA NA
+254 OTU_254 NA NA NA NA NA NA NA NA
+255 ;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Eubacteriaceae;Eubacterium;environmental samples;Eubacterium sp. oral clone JN088 Bacteria Firmicutes Clostridia Clostridiales Eubacteriaceae Eubacterium Eubacterium sp. oral clone JN088 NA
+256 OTU_256 NA NA NA NA NA NA NA NA
+257 OTU_257 NA NA NA NA NA NA NA NA
+258 OTU_258 NA NA NA NA NA NA NA NA
+259 OTU_259 NA NA NA NA NA NA NA NA
+260 OTU_260 NA NA NA NA NA NA NA NA
+261 OTU_261 NA NA NA NA NA NA NA NA
+262 OTU_262 NA NA NA NA NA NA NA NA
+263 OTU_263 NA NA NA NA NA NA NA NA
+264 OTU_264 NA NA NA NA NA NA NA NA
+265 OTU_265 NA NA NA NA NA NA NA NA
+266 OTU_266 NA NA NA NA NA NA NA NA
+267 OTU_267 NA NA NA NA NA NA NA NA
+268 ;cellular organisms;Bacteria;Firmicutes;Bacilli;Lactobacillales;Enterococcaceae;Enterococcus;Enterococcus sp. DLS 0702 Bacteria Firmicutes Bacilli Lactobacillales Enterococcaceae Enterococcus Enterococcus sp. DLS 0702 NA
+269 OTU_269 NA NA NA NA NA NA NA NA
+270 OTU_270 NA NA NA NA NA NA NA NA
+271 OTU_271 NA NA NA NA NA NA NA NA
+272 OTU_272 NA NA NA NA NA NA NA NA
+273 OTU_273 NA NA NA NA NA NA NA NA
+274 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella genomosp. P6 Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella genomosp. P6 NA
+275 OTU_275 NA NA NA NA NA NA NA NA
+276 OTU_276 NA NA NA NA NA NA NA NA
+277 OTU_277 NA NA NA NA NA NA NA NA
+278 OTU_278 NA NA NA NA NA NA NA NA
+279 OTU_279 NA NA NA NA NA NA NA NA
+280 OTU_280 NA NA NA NA NA NA NA NA
+281 OTU_281 NA NA NA NA NA NA NA NA
+282 OTU_282 NA NA NA NA NA NA NA NA
+283 OTU_283 NA NA NA NA NA NA NA NA
+284 OTU_284 NA NA NA NA NA NA NA NA
+285 OTU_285 NA NA NA NA NA NA NA NA
+286 OTU_286 NA NA NA NA NA NA NA NA
+287 OTU_287 NA NA NA NA NA NA NA NA
+288 OTU_288 NA NA NA NA NA NA NA NA
+289 OTU_289 NA NA NA NA NA NA NA NA
+290 OTU_290 NA NA NA NA NA NA NA NA
+291 OTU_291 NA NA NA NA NA NA NA NA
+292 OTU_292 NA NA NA NA NA NA NA NA
+293 OTU_293 NA NA NA NA NA NA NA NA
+294 OTU_294 NA NA NA NA NA NA NA NA
+295 OTU_295 NA NA NA NA NA NA NA NA
+296 OTU_296 NA NA NA NA NA NA NA NA
+297 OTU_297 NA NA NA NA NA NA NA NA
+298 OTU_298 NA NA NA NA NA NA NA NA
+299 OTU_299 NA NA NA NA NA NA NA NA
+300 OTU_300 NA NA NA NA NA NA NA NA
+301 OTU_301 NA NA NA NA NA NA NA NA
+302 OTU_302 NA NA NA NA NA NA NA NA
+303 ;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Clostridiales incertae sedis;Clostridiales Family XI. Incertae Sedis;Peptoniphilus;Peptoniphilus sp. gpac121 Bacteria Firmicutes Clostridia Clostridiales Clostridiales Family XI. Incertae Sedis Peptoniphilus Peptoniphilus sp. gpac121 NA
+304 OTU_304 NA NA NA NA NA NA NA NA
+305 OTU_305 NA NA NA NA NA NA NA NA
+306 OTU_306 NA NA NA NA NA NA NA NA
+307 OTU_307 NA NA NA NA NA NA NA NA
+308 OTU_308 NA NA NA NA NA NA NA NA
+309 OTU_309 NA NA NA NA NA NA NA NA
+310 OTU_310 NA NA NA NA NA NA NA NA
+311 OTU_311 NA NA NA NA NA NA NA NA
+312 OTU_312 NA NA NA NA NA NA NA NA
+313 OTU_313 NA NA NA NA NA NA NA NA
+314 OTU_314 NA NA NA NA NA NA NA NA
+315 OTU_315 NA NA NA NA NA NA NA NA
+316 OTU_316 NA NA NA NA NA NA NA NA
+317 OTU_317 NA NA NA NA NA NA NA NA
+318 OTU_318 NA NA NA NA NA NA NA NA
+319 OTU_319 NA NA NA NA NA NA NA NA
+320 OTU_320 NA NA NA NA NA NA NA NA
+321 OTU_321 NA NA NA NA NA NA NA NA
+322 OTU_322 NA NA NA NA NA NA NA NA
+323 OTU_323 NA NA NA NA NA NA NA NA
+324 OTU_324 NA NA NA NA NA NA NA NA
+325 OTU_325 NA NA NA NA NA NA NA NA
+326 OTU_326 NA NA NA NA NA NA NA NA
+327 OTU_327 NA NA NA NA NA NA NA NA
+328 OTU_328 NA NA NA NA NA NA NA NA
+329 OTU_329 NA NA NA NA NA NA NA NA
+330 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Coriobacteridae;Coriobacteriales;Coriobacterineae;Coriobacteriaceae;Atopobium;Atopobium parvulum Bacteria Actinobacteria Actinobacteria (class) Coriobacteriales Coriobacteriaceae Atopobium Atopobium parvulum NA
+331 OTU_331 NA NA NA NA NA NA NA NA
+332 OTU_332 NA NA NA NA NA NA NA NA
+333 OTU_333 NA NA NA NA NA NA NA NA
+334 OTU_334 NA NA NA NA NA NA NA NA
+335 OTU_335 NA NA NA NA NA NA NA NA
+336 OTU_336 NA NA NA NA NA NA NA NA
+337 OTU_337 NA NA NA NA NA NA NA NA
+338 OTU_338 NA NA NA NA NA NA NA NA
+339 OTU_339 NA NA NA NA NA NA NA NA
+340 OTU_340 NA NA NA NA NA NA NA NA
+341 OTU_341 NA NA NA NA NA NA NA NA
+342 OTU_342 NA NA NA NA NA NA NA NA
+343 OTU_343 NA NA NA NA NA NA NA NA
+344 OTU_344 NA NA NA NA NA NA NA NA
+345 OTU_345 NA NA NA NA NA NA NA NA
+346 OTU_346 NA NA NA NA NA NA NA NA
+347 OTU_347 NA NA NA NA NA NA NA NA
+348 OTU_348 NA NA NA NA NA NA NA NA
+349 OTU_349 NA NA NA NA NA NA NA NA
+350 OTU_350 NA NA NA NA NA NA NA NA
+351 OTU_351 NA NA NA NA NA NA NA NA
+352 OTU_352 NA NA NA NA NA NA NA NA
+353 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella pallens Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella pallens NA
+354 OTU_354 NA NA NA NA NA NA NA NA
+355 OTU_355 NA NA NA NA NA NA NA NA
+356 OTU_356 NA NA NA NA NA NA NA NA
+357 OTU_357 NA NA NA NA NA NA NA NA
+358 OTU_358 NA NA NA NA NA NA NA NA
+359 OTU_359 NA NA NA NA NA NA NA NA
+360 OTU_360 NA NA NA NA NA NA NA NA
+361 OTU_361 NA NA NA NA NA NA NA NA
+362 OTU_362 NA NA NA NA NA NA NA NA
+363 OTU_363 NA NA NA NA NA NA NA NA
+364 OTU_364 NA NA NA NA NA NA NA NA
+365 OTU_365 NA NA NA NA NA NA NA NA
+366 OTU_366 NA NA NA NA NA NA NA NA
+367 OTU_367 NA NA NA NA NA NA NA NA
+368 OTU_368 NA NA NA NA NA NA NA NA
+369 OTU_369 NA NA NA NA NA NA NA NA
+370 OTU_370 NA NA NA NA NA NA NA NA
+371 OTU_371 NA NA NA NA NA NA NA NA
+372 OTU_372 NA NA NA NA NA NA NA NA
+373 OTU_373 NA NA NA NA NA NA NA NA
+374 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Actinobacteridae;Actinomycetales;Micrococcineae;Microbacteriaceae;Frigoribacterium;Frigoribacterium sp. pfB31 Bacteria Actinobacteria Actinobacteria (class) Actinomycetales Microbacteriaceae Frigoribacterium Frigoribacterium sp. pfB31 NA
+375 OTU_375 NA NA NA NA NA NA NA NA
+376 OTU_376 NA NA NA NA NA NA NA NA
+377 OTU_377 NA NA NA NA NA NA NA NA
+378 OTU_378 NA NA NA NA NA NA NA NA
+379 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Selenomonas;environmental samples;Selenomonas sp. oral clone EW051a Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Selenomonas Selenomonas sp. oral clone EW051a NA
+380 OTU_380 NA NA NA NA NA NA NA NA
+381 OTU_381 NA NA NA NA NA NA NA NA
+382 OTU_382 NA NA NA NA NA NA NA NA
+383 OTU_383 NA NA NA NA NA NA NA NA
+384 OTU_384 NA NA NA NA NA NA NA NA
+385 OTU_385 NA NA NA NA NA NA NA NA
+386 OTU_386 NA NA NA NA NA NA NA NA
+387 OTU_387 NA NA NA NA NA NA NA NA
+388 OTU_388 NA NA NA NA NA NA NA NA
+389 OTU_389 NA NA NA NA NA NA NA NA
+390 OTU_390 NA NA NA NA NA NA NA NA
+391 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella pallens Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella pallens NA
+392 OTU_392 NA NA NA NA NA NA NA NA
+393 OTU_393 NA NA NA NA NA NA NA NA
+394 OTU_394 NA NA NA NA NA NA NA NA
+395 OTU_395 NA NA NA NA NA NA NA NA
+396 OTU_396 NA NA NA NA NA NA NA NA
+397 OTU_397 NA NA NA NA NA NA NA NA
+398 OTU_398 NA NA NA NA NA NA NA NA
+399 OTU_399 NA NA NA NA NA NA NA NA
+400 OTU_400 NA NA NA NA NA NA NA NA
+401 OTU_401 NA NA NA NA NA NA NA NA
+402 OTU_402 NA NA NA NA NA NA NA NA
+403 OTU_403 NA NA NA NA NA NA NA NA
+404 OTU_404 NA NA NA NA NA NA NA NA
+405 OTU_405 NA NA NA NA NA NA NA NA
+406 OTU_406 NA NA NA NA NA NA NA NA
+407 OTU_407 NA NA NA NA NA NA NA NA
+408 OTU_408 NA NA NA NA NA NA NA NA
+409 OTU_409 NA NA NA NA NA NA NA NA
+410 OTU_410 NA NA NA NA NA NA NA NA
+411 OTU_411 NA NA NA NA NA NA NA NA
+412 OTU_412 NA NA NA NA NA NA NA NA
+413 OTU_413 NA NA NA NA NA NA NA NA
+414 OTU_414 NA NA NA NA NA NA NA NA
+415 OTU_415 NA NA NA NA NA NA NA NA
+416 OTU_416 NA NA NA NA NA NA NA NA
+417 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella genomosp. P6 Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella genomosp. P6 NA
+418 OTU_418 NA NA NA NA NA NA NA NA
+419 OTU_419 NA NA NA NA NA NA NA NA
+420 OTU_420 NA NA NA NA NA NA NA NA
+421 OTU_421 NA NA NA NA NA NA NA NA
+422 OTU_422 NA NA NA NA NA NA NA NA
+423 OTU_423 NA NA NA NA NA NA NA NA
+424 OTU_424 NA NA NA NA NA NA NA NA
+425 OTU_425 NA NA NA NA NA NA NA NA
+426 OTU_426 NA NA NA NA NA NA NA NA
+427 OTU_427 NA NA NA NA NA NA NA NA
+428 OTU_428 NA NA NA NA NA NA NA NA
+429 OTU_429 NA NA NA NA NA NA NA NA
+430 OTU_430 NA NA NA NA NA NA NA NA
+431 OTU_431 NA NA NA NA NA NA NA NA
+432 OTU_432 NA NA NA NA NA NA NA NA
+433 OTU_433 NA NA NA NA NA NA NA NA
+434 OTU_434 NA NA NA NA NA NA NA NA
+435 OTU_435 NA NA NA NA NA NA NA NA
+436 OTU_436 NA NA NA NA NA NA NA NA
+437 OTU_437 NA NA NA NA NA NA NA NA
+438 OTU_438 NA NA NA NA NA NA NA NA
+439 OTU_439 NA NA NA NA NA NA NA NA
+440 OTU_440 NA NA NA NA NA NA NA NA
+441 OTU_441 NA NA NA NA NA NA NA NA
+442 OTU_442 NA NA NA NA NA NA NA NA
+443 OTU_443 NA NA NA NA NA NA NA NA
+444 OTU_444 NA NA NA NA NA NA NA NA
+445 OTU_445 NA NA NA NA NA NA NA NA
+446 OTU_446 NA NA NA NA NA NA NA NA
+447 OTU_447 NA NA NA NA NA NA NA NA
+448 OTU_448 NA NA NA NA NA NA NA NA
+449 OTU_449 NA NA NA NA NA NA NA NA
+450 OTU_450 NA NA NA NA NA NA NA NA
+451 OTU_451 NA NA NA NA NA NA NA NA
+452 OTU_452 NA NA NA NA NA NA NA NA
+453 OTU_453 NA NA NA NA NA NA NA NA
+454 OTU_454 NA NA NA NA NA NA NA NA
+455 OTU_455 NA NA NA NA NA NA NA NA
+456 OTU_456 NA NA NA NA NA NA NA NA
+457 OTU_457 NA NA NA NA NA NA NA NA
+458 OTU_458 NA NA NA NA NA NA NA NA
+459 OTU_459 NA NA NA NA NA NA NA NA
+460 OTU_460 NA NA NA NA NA NA NA NA
+461 ;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Clostridiales incertae sedis;Clostridiales Family XI. Incertae Sedis;Peptoniphilus;Peptoniphilus sp. gpac121 Bacteria Firmicutes Clostridia Clostridiales Clostridiales Family XI. Incertae Sedis Peptoniphilus Peptoniphilus sp. gpac121 NA
+462 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Porphyromonadaceae;Porphyromonas;Porphyromonas gingivalis Bacteria Bacteroidetes Bacteroidia Bacteroidales Porphyromonadaceae Porphyromonas Porphyromonas gingivalis NA
+463 ;cellular organisms;Bacteria;Proteobacteria;Gammaproteobacteria;Pasteurellales;Pasteurellaceae;Haemophilus;Haemophilus parainfluenzae Bacteria Proteobacteria Gammaproteobacteria Pasteurellales Pasteurellaceae Haemophilus Haemophilus parainfluenzae NA
+464 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Actinobacteridae;Actinomycetales;Actinomycineae;Actinomycetaceae;Actinomyces;Actinomyces radicidentis Bacteria Actinobacteria Actinobacteria (class) Actinomycetales Actinomycetaceae Actinomyces Actinomyces radicidentis NA
+465 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+466 OTU_466 NA NA NA NA NA NA NA NA
+467 OTU_467 NA NA NA NA NA NA NA NA
+468 OTU_468 NA NA NA NA NA NA NA NA
+469 OTU_469 NA NA NA NA NA NA NA NA
+470 OTU_470 NA NA NA NA NA NA NA NA
+471 OTU_471 NA NA NA NA NA NA NA NA
+472 OTU_472 NA NA NA NA NA NA NA NA
+473 OTU_473 NA NA NA NA NA NA NA NA
+474 OTU_474 NA NA NA NA NA NA NA NA
+475 OTU_475 NA NA NA NA NA NA NA NA
+476 OTU_476 NA NA NA NA NA NA NA NA
+477 OTU_477 NA NA NA NA NA NA NA NA
+478 OTU_478 NA NA NA NA NA NA NA NA
+479 OTU_479 NA NA NA NA NA NA NA NA
+480 OTU_480 NA NA NA NA NA NA NA NA
+481 OTU_481 NA NA NA NA NA NA NA NA
+482 OTU_482 NA NA NA NA NA NA NA NA
+483 OTU_483 NA NA NA NA NA NA NA NA
+484 OTU_484 NA NA NA NA NA NA NA NA
+485 OTU_485 NA NA NA NA NA NA NA NA
+486 OTU_486 NA NA NA NA NA NA NA NA
+487 OTU_487 NA NA NA NA NA NA NA NA
+488 OTU_488 NA NA NA NA NA NA NA NA
+489 OTU_489 NA NA NA NA NA NA NA NA
+490 OTU_490 NA NA NA NA NA NA NA NA
+491 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Bacteroidaceae;Bacteroides;Bacteroides sp. CO55 Bacteria Bacteroidetes Bacteroidia Bacteroidales Bacteroidaceae Bacteroides Bacteroides sp. CO55 NA
+492 OTU_492 NA NA NA NA NA NA NA NA
+493 OTU_493 NA NA NA NA NA NA NA NA
+494 OTU_494 NA NA NA NA NA NA NA NA
+495 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter showae Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter showae NA
+496 OTU_496 NA NA NA NA NA NA NA NA
+497 OTU_497 NA NA NA NA NA NA NA NA
+498 OTU_498 NA NA NA NA NA NA NA NA
+499 OTU_499 NA NA NA NA NA NA NA NA
+500 OTU_500 NA NA NA NA NA NA NA NA
+501 OTU_501 NA NA NA NA NA NA NA NA
+502 OTU_502 NA NA NA NA NA NA NA NA
+503 OTU_503 NA NA NA NA NA NA NA NA
+504 OTU_504 NA NA NA NA NA NA NA NA
+505 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella parvula Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella parvula NA
+506 OTU_506 NA NA NA NA NA NA NA NA
+507 OTU_507 NA NA NA NA NA NA NA NA
+508 OTU_508 NA NA NA NA NA NA NA NA
+509 OTU_509 NA NA NA NA NA NA NA NA
+510 OTU_510 NA NA NA NA NA NA NA NA
+511 OTU_511 NA NA NA NA NA NA NA NA
+512 OTU_512 NA NA NA NA NA NA NA NA
+513 OTU_513 NA NA NA NA NA NA NA NA
+514 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella tannerae Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella tannerae NA
+515 OTU_515 NA NA NA NA NA NA NA NA
+516 OTU_516 NA NA NA NA NA NA NA NA
+517 OTU_517 NA NA NA NA NA NA NA NA
+518 OTU_518 NA NA NA NA NA NA NA NA
+519 OTU_519 NA NA NA NA NA NA NA NA
+520 OTU_520 NA NA NA NA NA NA NA NA
+521 OTU_521 NA NA NA NA NA NA NA NA
+522 OTU_522 NA NA NA NA NA NA NA NA
+523 OTU_523 NA NA NA NA NA NA NA NA
+524 OTU_524 NA NA NA NA NA NA NA NA
+525 OTU_525 NA NA NA NA NA NA NA NA
+526 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella ratti Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella ratti NA
+527 OTU_527 NA NA NA NA NA NA NA NA
+528 OTU_528 NA NA NA NA NA NA NA NA
+529 OTU_529 NA NA NA NA NA NA NA NA
+530 OTU_530 NA NA NA NA NA NA NA NA
+531 OTU_531 NA NA NA NA NA NA NA NA
+532 OTU_532 NA NA NA NA NA NA NA NA
+533 OTU_533 NA NA NA NA NA NA NA NA
+534 ;cellular organisms;Bacteria;Firmicutes;Bacilli;Lactobacillales;Streptococcaceae;Streptococcus;Streptococcus oligofermentans Bacteria Firmicutes Bacilli Lactobacillales Streptococcaceae Streptococcus Streptococcus oligofermentans NA
+535 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter showae Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter showae NA
+536 OTU_536 NA NA NA NA NA NA NA NA
+537 OTU_537 NA NA NA NA NA NA NA NA
+538 OTU_538 NA NA NA NA NA NA NA NA
+539 OTU_539 NA NA NA NA NA NA NA NA
+540 OTU_540 NA NA NA NA NA NA NA NA
+541 OTU_541 NA NA NA NA NA NA NA NA
+542 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;environmental samples;Veillonella genomosp. P1 oral clone MB5_P17 Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella genomosp. P1 oral clone MB5_P17 NA
+543 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+544 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+545 OTU_545 NA NA NA NA NA NA NA NA
+546 OTU_546 NA NA NA NA NA NA NA NA
+547 OTU_547 NA NA NA NA NA NA NA NA
+548 OTU_548 NA NA NA NA NA NA NA NA
+549 OTU_549 NA NA NA NA NA NA NA NA
+550 OTU_550 NA NA NA NA NA NA NA NA
+551 OTU_551 NA NA NA NA NA NA NA NA
+552 OTU_552 NA NA NA NA NA NA NA NA
+553 OTU_553 NA NA NA NA NA NA NA NA
+554 OTU_554 NA NA NA NA NA NA NA NA
+555 OTU_555 NA NA NA NA NA NA NA NA
+556 OTU_556 NA NA NA NA NA NA NA NA
+557 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+558 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter showae Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter showae NA
+559 OTU_559 NA NA NA NA NA NA NA NA
+560 OTU_560 NA NA NA NA NA NA NA NA
+561 OTU_561 NA NA NA NA NA NA NA NA
+562 OTU_562 NA NA NA NA NA NA NA NA
+563 OTU_563 NA NA NA NA NA NA NA NA
+564 OTU_564 NA NA NA NA NA NA NA NA
+565 OTU_565 NA NA NA NA NA NA NA NA
+566 OTU_566 NA NA NA NA NA NA NA NA
+567 OTU_567 NA NA NA NA NA NA NA NA
+568 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter curvus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter curvus NA
+569 OTU_569 NA NA NA NA NA NA NA NA
+570 OTU_570 NA NA NA NA NA NA NA NA
+571 OTU_571 NA NA NA NA NA NA NA NA
+572 OTU_572 NA NA NA NA NA NA NA NA
+573 OTU_573 NA NA NA NA NA NA NA NA
+574 OTU_574 NA NA NA NA NA NA NA NA
+575 OTU_575 NA NA NA NA NA NA NA NA
+576 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter mucosalis-like bacterium Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter mucosalis-like bacterium NA
+577 OTU_577 NA NA NA NA NA NA NA NA
+578 OTU_578 NA NA NA NA NA NA NA NA
+579 OTU_579 NA NA NA NA NA NA NA NA
+580 OTU_580 NA NA NA NA NA NA NA NA
+581 OTU_581 NA NA NA NA NA NA NA NA
+582 OTU_582 NA NA NA NA NA NA NA NA
+583 OTU_583 NA NA NA NA NA NA NA NA
+584 OTU_584 NA NA NA NA NA NA NA NA
+585 OTU_585 NA NA NA NA NA NA NA NA
+586 OTU_586 NA NA NA NA NA NA NA NA
+587 OTU_587 NA NA NA NA NA NA NA NA
+588 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Porphyromonadaceae;Porphyromonas;environmental samples;Porphyromonas sp. oral clone P4GB_100 P2 Bacteria Bacteroidetes Bacteroidia Bacteroidales Porphyromonadaceae Porphyromonas Porphyromonas sp. oral clone P4GB_100 P2 NA
+589 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+590 OTU_590 NA NA NA NA NA NA NA NA
+591 OTU_591 NA NA NA NA NA NA NA NA
+592 OTU_592 NA NA NA NA NA NA NA NA
+593 OTU_593 NA NA NA NA NA NA NA NA
+594 OTU_594 NA NA NA NA NA NA NA NA
+595 OTU_595 NA NA NA NA NA NA NA NA
+596 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+597 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+598 OTU_598 NA NA NA NA NA NA NA NA
+599 OTU_599 NA NA NA NA NA NA NA NA
+600 OTU_600 NA NA NA NA NA NA NA NA
+601 OTU_601 NA NA NA NA NA NA NA NA
+602 OTU_602 NA NA NA NA NA NA NA NA
+603 OTU_603 NA NA NA NA NA NA NA NA
+604 OTU_604 NA NA NA NA NA NA NA NA
+605 OTU_605 NA NA NA NA NA NA NA NA
+606 OTU_606 NA NA NA NA NA NA NA NA
+607 OTU_607 NA NA NA NA NA NA NA NA
+608 OTU_608 NA NA NA NA NA NA NA NA
+609 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+610 OTU_610 NA NA NA NA NA NA NA NA
+611 OTU_611 NA NA NA NA NA NA NA NA
+612 OTU_612 NA NA NA NA NA NA NA NA
+613 OTU_613 NA NA NA NA NA NA NA NA
+614 OTU_614 NA NA NA NA NA NA NA NA
+615 OTU_615 NA NA NA NA NA NA NA NA
+616 OTU_616 NA NA NA NA NA NA NA NA
+617 OTU_617 NA NA NA NA NA NA NA NA
+618 OTU_618 NA NA NA NA NA NA NA NA
+619 OTU_619 NA NA NA NA NA NA NA NA
+620 ;cellular organisms;Bacteria;Firmicutes;Erysipelotrichi;Erysipelotrichales;Erysipelotrichaceae;Bulleidia;Bulleidia extructa Bacteria Firmicutes Erysipelotrichi Erysipelotrichales Erysipelotrichaceae Bulleidia Bulleidia extructa NA
+621 OTU_621 NA NA NA NA NA NA NA NA
+622 OTU_622 NA NA NA NA NA NA NA NA
+623 OTU_623 NA NA NA NA NA NA NA NA
+624 OTU_624 NA NA NA NA NA NA NA NA
+625 OTU_625 NA NA NA NA NA NA NA NA
+626 OTU_626 NA NA NA NA NA NA NA NA
+627 OTU_627 NA NA NA NA NA NA NA NA
+628 OTU_628 NA NA NA NA NA NA NA NA
+629 OTU_629 NA NA NA NA NA NA NA NA
+630 OTU_630 NA NA NA NA NA NA NA NA
+631 OTU_631 NA NA NA NA NA NA NA NA
+632 OTU_632 NA NA NA NA NA NA NA NA
+633 OTU_633 NA NA NA NA NA NA NA NA
+634 OTU_634 NA NA NA NA NA NA NA NA
+635 OTU_635 NA NA NA NA NA NA NA NA
+636 OTU_636 NA NA NA NA NA NA NA NA
+637 OTU_637 NA NA NA NA NA NA NA NA
+638 OTU_638 NA NA NA NA NA NA NA NA
+639 OTU_639 NA NA NA NA NA NA NA NA
+640 OTU_640 NA NA NA NA NA NA NA NA
+641 OTU_641 NA NA NA NA NA NA NA NA
+642 OTU_642 NA NA NA NA NA NA NA NA
+643 OTU_643 NA NA NA NA NA NA NA NA
+644 OTU_644 NA NA NA NA NA NA NA NA
+645 OTU_645 NA NA NA NA NA NA NA NA
+646 OTU_646 NA NA NA NA NA NA NA NA
+647 OTU_647 NA NA NA NA NA NA NA NA
+648 OTU_648 NA NA NA NA NA NA NA NA
+649 OTU_649 NA NA NA NA NA NA NA NA
+650 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella melaninogenica Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella melaninogenica NA
+651 OTU_651 NA NA NA NA NA NA NA NA
+652 OTU_652 NA NA NA NA NA NA NA NA
+653 OTU_653 NA NA NA NA NA NA NA NA
+654 OTU_654 NA NA NA NA NA NA NA NA
+655 OTU_655 NA NA NA NA NA NA NA NA
+656 OTU_656 NA NA NA NA NA NA NA NA
+657 OTU_657 NA NA NA NA NA NA NA NA
+658 OTU_658 NA NA NA NA NA NA NA NA
+659 OTU_659 NA NA NA NA NA NA NA NA
+660 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter mucosalis-like bacterium Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter mucosalis-like bacterium NA
+661 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+662 OTU_662 NA NA NA NA NA NA NA NA
+663 OTU_663 NA NA NA NA NA NA NA NA
+664 OTU_664 NA NA NA NA NA NA NA NA
+665 OTU_665 NA NA NA NA NA NA NA NA
+666 OTU_666 NA NA NA NA NA NA NA NA
+667 OTU_667 NA NA NA NA NA NA NA NA
+668 OTU_668 NA NA NA NA NA NA NA NA
+669 OTU_669 NA NA NA NA NA NA NA NA
+670 OTU_670 NA NA NA NA NA NA NA NA
+671 OTU_671 NA NA NA NA NA NA NA NA
+672 OTU_672 NA NA NA NA NA NA NA NA
+673 OTU_673 NA NA NA NA NA NA NA NA
+674 OTU_674 NA NA NA NA NA NA NA NA
+675 OTU_675 NA NA NA NA NA NA NA NA
+676 OTU_676 NA NA NA NA NA NA NA NA
+677 ;cellular organisms;Bacteria;Firmicutes;Bacilli;Bacillales;Staphylococcaceae;Nosocomiicoccus;Nosocomiicoccus ampullae Bacteria Firmicutes Bacilli Bacillales Staphylococcaceae Nosocomiicoccus Nosocomiicoccus ampullae NA
+678 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+679 OTU_679 NA NA NA NA NA NA NA NA
+680 OTU_680 NA NA NA NA NA NA NA NA
+681 OTU_681 NA NA NA NA NA NA NA NA
+682 OTU_682 NA NA NA NA NA NA NA NA
+683 OTU_683 NA NA NA NA NA NA NA NA
+684 OTU_684 NA NA NA NA NA NA NA NA
+685 OTU_685 NA NA NA NA NA NA NA NA
+686 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Actinobacteridae;Actinomycetales;Propionibacterineae;Propionibacteriaceae;Propionibacterium;Propionibacterium acnes Bacteria Actinobacteria Actinobacteria (class) Actinomycetales Propionibacteriaceae Propionibacterium Propionibacterium acnes NA
+687 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter mucosalis-like bacterium Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter mucosalis-like bacterium NA
+688 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter mucosalis-like bacterium Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter mucosalis-like bacterium NA
+689 OTU_689 NA NA NA NA NA NA NA NA
+690 OTU_690 NA NA NA NA NA NA NA NA
+691 OTU_691 NA NA NA NA NA NA NA NA
+692 OTU_692 NA NA NA NA NA NA NA NA
+693 OTU_693 NA NA NA NA NA NA NA NA
+694 OTU_694 NA NA NA NA NA NA NA NA
+695 OTU_695 NA NA NA NA NA NA NA NA
+696 OTU_696 NA NA NA NA NA NA NA NA
+697 OTU_697 NA NA NA NA NA NA NA NA
+698 OTU_698 NA NA NA NA NA NA NA NA
+699 OTU_699 NA NA NA NA NA NA NA NA
+700 OTU_700 NA NA NA NA NA NA NA NA
+701 OTU_701 NA NA NA NA NA NA NA NA
+702 OTU_702 NA NA NA NA NA NA NA NA
+703 OTU_703 NA NA NA NA NA NA NA NA
+704 OTU_704 NA NA NA NA NA NA NA NA
+705 OTU_705 NA NA NA NA NA NA NA NA
+706 OTU_706 NA NA NA NA NA NA NA NA
+707 OTU_707 NA NA NA NA NA NA NA NA
+708 OTU_708 NA NA NA NA NA NA NA NA
+709 OTU_709 NA NA NA NA NA NA NA NA
+710 OTU_710 NA NA NA NA NA NA NA NA
+711 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella rodentium Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella rodentium NA
+712 OTU_712 NA NA NA NA NA NA NA NA
+713 OTU_713 NA NA NA NA NA NA NA NA
+714 OTU_714 NA NA NA NA NA NA NA NA
+715 OTU_715 NA NA NA NA NA NA NA NA
+716 OTU_716 NA NA NA NA NA NA NA NA
+717 OTU_717 NA NA NA NA NA NA NA NA
+718 OTU_718 NA NA NA NA NA NA NA NA
+719 OTU_719 NA NA NA NA NA NA NA NA
+720 OTU_720 NA NA NA NA NA NA NA NA
+721 OTU_721 NA NA NA NA NA NA NA NA
+722 OTU_722 NA NA NA NA NA NA NA NA
+723 OTU_723 NA NA NA NA NA NA NA NA
+724 OTU_724 NA NA NA NA NA NA NA NA
+725 OTU_725 NA NA NA NA NA NA NA NA
+726 OTU_726 NA NA NA NA NA NA NA NA
+727 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter mucosalis-like bacterium Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter mucosalis-like bacterium NA
+728 OTU_728 NA NA NA NA NA NA NA NA
+729 OTU_729 NA NA NA NA NA NA NA NA
+730 OTU_730 NA NA NA NA NA NA NA NA
+731 OTU_731 NA NA NA NA NA NA NA NA
+732 OTU_732 NA NA NA NA NA NA NA NA
+733 OTU_733 NA NA NA NA NA NA NA NA
+734 OTU_734 NA NA NA NA NA NA NA NA
+735 OTU_735 NA NA NA NA NA NA NA NA
+736 OTU_736 NA NA NA NA NA NA NA NA
+737 OTU_737 NA NA NA NA NA NA NA NA
+738 OTU_738 NA NA NA NA NA NA NA NA
+739 OTU_739 NA NA NA NA NA NA NA NA
+740 OTU_740 NA NA NA NA NA NA NA NA
+741 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Actinobacteridae;Actinomycetales;Actinomycineae;Actinomycetaceae;Actinomyces;Actinomyces sp. HA3 Bacteria Actinobacteria Actinobacteria (class) Actinomycetales Actinomycetaceae Actinomyces Actinomyces sp. HA3 NA
+742 OTU_742 NA NA NA NA NA NA NA NA
+743 OTU_743 NA NA NA NA NA NA NA NA
+744 OTU_744 NA NA NA NA NA NA NA NA
+745 OTU_745 NA NA NA NA NA NA NA NA
+746 OTU_746 NA NA NA NA NA NA NA NA
+747 OTU_747 NA NA NA NA NA NA NA NA
+748 OTU_748 NA NA NA NA NA NA NA NA
+749 OTU_749 NA NA NA NA NA NA NA NA
+750 OTU_750 NA NA NA NA NA NA NA NA
+751 OTU_751 NA NA NA NA NA NA NA NA
+752 OTU_752 NA NA NA NA NA NA NA NA
+753 OTU_753 NA NA NA NA NA NA NA NA
+754 OTU_754 NA NA NA NA NA NA NA NA
+755 OTU_755 NA NA NA NA NA NA NA NA
+756 OTU_756 NA NA NA NA NA NA NA NA
+757 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Selenomonas;environmental samples;Selenomonas sp. oral clone EW051a Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Selenomonas Selenomonas sp. oral clone EW051a NA
+758 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter mucosalis-like bacterium Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter mucosalis-like bacterium NA
+759 OTU_759 NA NA NA NA NA NA NA NA
+760 OTU_760 NA NA NA NA NA NA NA NA
+761 OTU_761 NA NA NA NA NA NA NA NA
+762 OTU_762 NA NA NA NA NA NA NA NA
+763 OTU_763 NA NA NA NA NA NA NA NA
+764 OTU_764 NA NA NA NA NA NA NA NA
+765 OTU_765 NA NA NA NA NA NA NA NA
+766 OTU_766 NA NA NA NA NA NA NA NA
+767 OTU_767 NA NA NA NA NA NA NA NA
+768 OTU_768 NA NA NA NA NA NA NA NA
+769 OTU_769 NA NA NA NA NA NA NA NA
+770 OTU_770 NA NA NA NA NA NA NA NA
+771 OTU_771 NA NA NA NA NA NA NA NA
+772 OTU_772 NA NA NA NA NA NA NA NA
+773 OTU_773 NA NA NA NA NA NA NA NA
+774 OTU_774 NA NA NA NA NA NA NA NA
+775 OTU_775 NA NA NA NA NA NA NA NA
+776 OTU_776 NA NA NA NA NA NA NA NA
+777 OTU_777 NA NA NA NA NA NA NA NA
+778 OTU_778 NA NA NA NA NA NA NA NA
+779 OTU_779 NA NA NA NA NA NA NA NA
+780 OTU_780 NA NA NA NA NA NA NA NA
+781 OTU_781 NA NA NA NA NA NA NA NA
+782 OTU_782 NA NA NA NA NA NA NA NA
+783 OTU_783 NA NA NA NA NA NA NA NA
+784 ;cellular organisms;Bacteria;Proteobacteria;Gammaproteobacteria;Pasteurellales;Pasteurellaceae;Haemophilus;Haemophilus parainfluenzae Bacteria Proteobacteria Gammaproteobacteria Pasteurellales Pasteurellaceae Haemophilus Haemophilus parainfluenzae NA
+785 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella montpellierensis Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella montpellierensis NA
+786 OTU_786 NA NA NA NA NA NA NA NA
+787 OTU_787 NA NA NA NA NA NA NA NA
+788 OTU_788 NA NA NA NA NA NA NA NA
+789 OTU_789 NA NA NA NA NA NA NA NA
+790 OTU_790 NA NA NA NA NA NA NA NA
+791 OTU_791 NA NA NA NA NA NA NA NA
+792 OTU_792 NA NA NA NA NA NA NA NA
+793 OTU_793 NA NA NA NA NA NA NA NA
+794 OTU_794 NA NA NA NA NA NA NA NA
+795 OTU_795 NA NA NA NA NA NA NA NA
+796 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella montpellierensis Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella montpellierensis NA
+797 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Coriobacteridae;Coriobacteriales;Coriobacterineae;Coriobacteriaceae;Atopobium;Atopobium parvulum Bacteria Actinobacteria Actinobacteria (class) Coriobacteriales Coriobacteriaceae Atopobium Atopobium parvulum NA
+798 OTU_798 NA NA NA NA NA NA NA NA
+799 OTU_799 NA NA NA NA NA NA NA NA
+800 OTU_800 NA NA NA NA NA NA NA NA
+801 OTU_801 NA NA NA NA NA NA NA NA
+802 OTU_802 NA NA NA NA NA NA NA NA
+803 OTU_803 NA NA NA NA NA NA NA NA
+804 OTU_804 NA NA NA NA NA NA NA NA
+805 OTU_805 NA NA NA NA NA NA NA NA
+806 OTU_806 NA NA NA NA NA NA NA NA
+807 OTU_807 NA NA NA NA NA NA NA NA
+808 OTU_808 NA NA NA NA NA NA NA NA
+809 OTU_809 NA NA NA NA NA NA NA NA
+810 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;environmental samples;Prevotella sp. oral clone AA020 Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella sp. oral clone AA020 NA
+811 OTU_811 NA NA NA NA NA NA NA NA
+812 OTU_812 NA NA NA NA NA NA NA NA
+813 OTU_813 NA NA NA NA NA NA NA NA
+814 OTU_814 NA NA NA NA NA NA NA NA
+815 OTU_815 NA NA NA NA NA NA NA NA
+816 OTU_816 NA NA NA NA NA NA NA NA
+817 OTU_817 NA NA NA NA NA NA NA NA
+818 OTU_818 NA NA NA NA NA NA NA NA
+819 OTU_819 NA NA NA NA NA NA NA NA
+820 OTU_820 NA NA NA NA NA NA NA NA
+821 OTU_821 NA NA NA NA NA NA NA NA
+822 OTU_822 NA NA NA NA NA NA NA NA
+823 OTU_823 NA NA NA NA NA NA NA NA
+824 OTU_824 NA NA NA NA NA NA NA NA
+825 OTU_825 NA NA NA NA NA NA NA NA
+826 OTU_826 NA NA NA NA NA NA NA NA
+827 OTU_827 NA NA NA NA NA NA NA NA
+828 OTU_828 NA NA NA NA NA NA NA NA
+829 OTU_829 NA NA NA NA NA NA NA NA
+830 ;cellular organisms;Bacteria;Actinobacteria;Actinobacteria (class);Actinobacteridae;Actinomycetales;Micrococcineae;Microbacteriaceae;Frigoribacterium;Frigoribacterium sp. pfB31 Bacteria Actinobacteria Actinobacteria (class) Actinomycetales Microbacteriaceae Frigoribacterium Frigoribacterium sp. pfB31 NA
+831 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella montpellierensis Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella montpellierensis NA
+832 OTU_832 NA NA NA NA NA NA NA NA
+833 OTU_833 NA NA NA NA NA NA NA NA
+834 OTU_834 NA NA NA NA NA NA NA NA
+835 OTU_835 NA NA NA NA NA NA NA NA
+836 OTU_836 NA NA NA NA NA NA NA NA
+837 OTU_837 NA NA NA NA NA NA NA NA
+838 OTU_838 NA NA NA NA NA NA NA NA
+839 OTU_839 NA NA NA NA NA NA NA NA
+840 OTU_840 NA NA NA NA NA NA NA NA
+841 OTU_841 NA NA NA NA NA NA NA NA
+842 OTU_842 NA NA NA NA NA NA NA NA
+843 OTU_843 NA NA NA NA NA NA NA NA
+844 OTU_844 NA NA NA NA NA NA NA NA
+845 OTU_845 NA NA NA NA NA NA NA NA
+846 OTU_846 NA NA NA NA NA NA NA NA
+847 OTU_847 NA NA NA NA NA NA NA NA
+848 OTU_848 NA NA NA NA NA NA NA NA
+849 OTU_849 NA NA NA NA NA NA NA NA
+850 OTU_850 NA NA NA NA NA NA NA NA
+851 OTU_851 NA NA NA NA NA NA NA NA
+852 OTU_852 NA NA NA NA NA NA NA NA
+853 OTU_853 NA NA NA NA NA NA NA NA
+854 OTU_854 NA NA NA NA NA NA NA NA
+855 OTU_855 NA NA NA NA NA NA NA NA
+856 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella intermedia Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella intermedia NA
+857 ;cellular organisms;Bacteria;Proteobacteria;Betaproteobacteria;Burkholderiales;Comamonadaceae;Acidovorax;Acidovorax sp. LR17 Bacteria Proteobacteria Betaproteobacteria Burkholderiales Comamonadaceae Acidovorax Acidovorax sp. LR17 NA
+858 OTU_858 NA NA NA NA NA NA NA NA
+859 OTU_859 NA NA NA NA NA NA NA NA
+860 OTU_860 NA NA NA NA NA NA NA NA
+861 OTU_861 NA NA NA NA NA NA NA NA
+862 OTU_862 NA NA NA NA NA NA NA NA
+863 OTU_863 NA NA NA NA NA NA NA NA
+864 OTU_864 NA NA NA NA NA NA NA NA
+865 OTU_865 NA NA NA NA NA NA NA NA
+866 OTU_866 NA NA NA NA NA NA NA NA
+867 OTU_867 NA NA NA NA NA NA NA NA
+868 OTU_868 NA NA NA NA NA NA NA NA
+869 OTU_869 NA NA NA NA NA NA NA NA
+870 OTU_870 NA NA NA NA NA NA NA NA
+871 OTU_871 NA NA NA NA NA NA NA NA
+872 OTU_872 NA NA NA NA NA NA NA NA
+873 OTU_873 NA NA NA NA NA NA NA NA
+874 OTU_874 NA NA NA NA NA NA NA NA
+875 OTU_875 NA NA NA NA NA NA NA NA
+876 OTU_876 NA NA NA NA NA NA NA NA
+877 OTU_877 NA NA NA NA NA NA NA NA
+878 OTU_878 NA NA NA NA NA NA NA NA
+879 OTU_879 NA NA NA NA NA NA NA NA
+880 OTU_880 NA NA NA NA NA NA NA NA
+881 OTU_881 NA NA NA NA NA NA NA NA
+882 OTU_882 NA NA NA NA NA NA NA NA
+883 OTU_883 NA NA NA NA NA NA NA NA
+884 OTU_884 NA NA NA NA NA NA NA NA
+885 OTU_885 NA NA NA NA NA NA NA NA
+886 OTU_886 NA NA NA NA NA NA NA NA
+887 OTU_887 NA NA NA NA NA NA NA NA
+888 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;environmental samples;Campylobacter sp. oral clone BB120 Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter sp. oral clone BB120 NA
+889 OTU_889 NA NA NA NA NA NA NA NA
+890 OTU_890 NA NA NA NA NA NA NA NA
+891 OTU_891 NA NA NA NA NA NA NA NA
+892 OTU_892 NA NA NA NA NA NA NA NA
+893 OTU_893 NA NA NA NA NA NA NA NA
+894 OTU_894 NA NA NA NA NA NA NA NA
+895 OTU_895 NA NA NA NA NA NA NA NA
+896 OTU_896 NA NA NA NA NA NA NA NA
+897 OTU_897 NA NA NA NA NA NA NA NA
+898 OTU_898 NA NA NA NA NA NA NA NA
+899 OTU_899 NA NA NA NA NA NA NA NA
+900 OTU_900 NA NA NA NA NA NA NA NA
+901 OTU_901 NA NA NA NA NA NA NA NA
+902 OTU_902 NA NA NA NA NA NA NA NA
+903 OTU_903 NA NA NA NA NA NA NA NA
+904 OTU_904 NA NA NA NA NA NA NA NA
+905 OTU_905 NA NA NA NA NA NA NA NA
+906 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;Campylobacter rectus Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter rectus NA
+907 OTU_907 NA NA NA NA NA NA NA NA
+908 OTU_908 NA NA NA NA NA NA NA NA
+909 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Veillonella;Veillonella montpellierensis Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Veillonella Veillonella montpellierensis NA
+910 OTU_910 NA NA NA NA NA NA NA NA
+911 OTU_911 NA NA NA NA NA NA NA NA
+912 OTU_912 NA NA NA NA NA NA NA NA
+913 OTU_913 NA NA NA NA NA NA NA NA
+914 OTU_914 NA NA NA NA NA NA NA NA
+915 OTU_915 NA NA NA NA NA NA NA NA
+916 OTU_916 NA NA NA NA NA NA NA NA
+917 OTU_917 NA NA NA NA NA NA NA NA
+918 OTU_918 NA NA NA NA NA NA NA NA
+919 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella intermedia Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella intermedia NA
+920 ;cellular organisms;Bacteria;Firmicutes;Bacilli;Lactobacillales;Streptococcaceae;Streptococcus;Streptococcus dysgalactiae group;Streptococcus dysgalactiae Bacteria Firmicutes Bacilli Lactobacillales Streptococcaceae Streptococcus Streptococcus dysgalactiae NA
+921 OTU_921 NA NA NA NA NA NA NA NA
+922 OTU_922 NA NA NA NA NA NA NA NA
+923 OTU_923 NA NA NA NA NA NA NA NA
+924 OTU_924 NA NA NA NA NA NA NA NA
+925 OTU_925 NA NA NA NA NA NA NA NA
+926 OTU_926 NA NA NA NA NA NA NA NA
+927 OTU_927 NA NA NA NA NA NA NA NA
+928 OTU_928 NA NA NA NA NA NA NA NA
+929 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella salivae Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella salivae NA
+930 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Selenomonas;environmental samples;Selenomonas sp. oral clone EW051a Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Selenomonas Selenomonas sp. oral clone EW051a NA
+931 OTU_931 NA NA NA NA NA NA NA NA
+932 OTU_932 NA NA NA NA NA NA NA NA
+933 OTU_933 NA NA NA NA NA NA NA NA
+934 OTU_934 NA NA NA NA NA NA NA NA
+935 OTU_935 NA NA NA NA NA NA NA NA
+936 OTU_936 NA NA NA NA NA NA NA NA
+937 ;cellular organisms;Bacteria;Proteobacteria;Gammaproteobacteria;Pasteurellales;Pasteurellaceae;Haemophilus;Haemophilus parainfluenzae Bacteria Proteobacteria Gammaproteobacteria Pasteurellales Pasteurellaceae Haemophilus Haemophilus parainfluenzae NA
+938 OTU_938 NA NA NA NA NA NA NA NA
+939 OTU_939 NA NA NA NA NA NA NA NA
+940 OTU_940 NA NA NA NA NA NA NA NA
+941 OTU_941 NA NA NA NA NA NA NA NA
+942 OTU_942 NA NA NA NA NA NA NA NA
+943 OTU_943 NA NA NA NA NA NA NA NA
+944 OTU_944 NA NA NA NA NA NA NA NA
+945 OTU_945 NA NA NA NA NA NA NA NA
+946 ;cellular organisms;Bacteria;Proteobacteria;delta/epsilon subdivisions;Epsilonproteobacteria;Campylobacterales;Campylobacteraceae;Campylobacter;environmental samples;Campylobacter sp. oral clone BB120 Bacteria Proteobacteria Epsilonproteobacteria Campylobacterales Campylobacteraceae Campylobacter Campylobacter sp. oral clone BB120 NA
+947 OTU_947 NA NA NA NA NA NA NA NA
+948 OTU_948 NA NA NA NA NA NA NA NA
+949 OTU_949 NA NA NA NA NA NA NA NA
+950 OTU_950 NA NA NA NA NA NA NA NA
+951 OTU_951 NA NA NA NA NA NA NA NA
+952 OTU_952 NA NA NA NA NA NA NA NA
+953 OTU_953 NA NA NA NA NA NA NA NA
+954 OTU_954 NA NA NA NA NA NA NA NA
+955 OTU_955 NA NA NA NA NA NA NA NA
+956 OTU_956 NA NA NA NA NA NA NA NA
+957 OTU_957 NA NA NA NA NA NA NA NA
+958 OTU_958 NA NA NA NA NA NA NA NA
+959 OTU_959 NA NA NA NA NA NA NA NA
+960 OTU_960 NA NA NA NA NA NA NA NA
+961 OTU_961 NA NA NA NA NA NA NA NA
+962 OTU_962 NA NA NA NA NA NA NA NA
+963 OTU_963 NA NA NA NA NA NA NA NA
+964 OTU_964 NA NA NA NA NA NA NA NA
+965 OTU_965 NA NA NA NA NA NA NA NA
+966 OTU_966 NA NA NA NA NA NA NA NA
+967 OTU_967 NA NA NA NA NA NA NA NA
+968 OTU_968 NA NA NA NA NA NA NA NA
+969 OTU_969 NA NA NA NA NA NA NA NA
+970 OTU_970 NA NA NA NA NA NA NA NA
+971 OTU_971 NA NA NA NA NA NA NA NA
+972 OTU_972 NA NA NA NA NA NA NA NA
+973 OTU_973 NA NA NA NA NA NA NA NA
+974 OTU_974 NA NA NA NA NA NA NA NA
+975 OTU_975 NA NA NA NA NA NA NA NA
+976 OTU_976 NA NA NA NA NA NA NA NA
+977 OTU_977 NA NA NA NA NA NA NA NA
+978 OTU_978 NA NA NA NA NA NA NA NA
+979 OTU_979 NA NA NA NA NA NA NA NA
+980 OTU_980 NA NA NA NA NA NA NA NA
+981 ;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Clostridiales incertae sedis;Clostridiales Family XI. Incertae Sedis;Peptoniphilus;Peptoniphilus sp. gpac121 Bacteria Firmicutes Clostridia Clostridiales Clostridiales Family XI. Incertae Sedis Peptoniphilus Peptoniphilus sp. gpac121 NA
+982 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella intermedia Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella intermedia NA
+983 ;cellular organisms;Bacteria;Bacteroidetes/Chlorobi group;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;Prevotella intermedia Bacteria Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella Prevotella intermedia NA
+984 OTU_984 NA NA NA NA NA NA NA NA
+985 OTU_985 NA NA NA NA NA NA NA NA
+986 OTU_986 NA NA NA NA NA NA NA NA
+987 OTU_987 NA NA NA NA NA NA NA NA
+988 OTU_988 NA NA NA NA NA NA NA NA
+989 OTU_989 NA NA NA NA NA NA NA NA
+990 ;cellular organisms;Bacteria;Firmicutes;Negativicutes;Selenomonadales;Veillonellaceae;Selenomonas;environmental samples;Selenomonas sp. oral clone BP2-20 Bacteria Firmicutes Negativicutes Selenomonadales Veillonellaceae Selenomonas Selenomonas sp. oral clone BP2-20 NA
+991 OTU_991 NA NA NA NA NA NA NA NA
+992 OTU_992 NA NA NA NA NA NA NA NA
+993 OTU_993 NA NA NA NA NA NA NA NA
+994 OTU_994 NA NA NA NA NA NA NA NA
+995 OTU_995 NA NA NA NA NA NA NA NA
+996 OTU_996 NA NA NA NA NA NA NA NA
+997 OTU_997 NA NA NA NA NA NA NA NA
+998 ;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Clostridiales incertae sedis;Clostridiales Family XI. Incertae Sedis;Finegoldia;Finegoldia magna Bacteria Firmicutes Clostridia Clostridiales Clostridiales Family XI. Incertae Sedis Finegoldia Finegoldia magna NA
+999 OTU_999 NA NA NA NA NA NA NA NA
+1000 OTU_1000 NA NA NA NA NA NA NA NA
diff --git a/inst/extdata/lungfit.rds b/inst/extdata/lungfit.rds
new file mode 100644
index 0000000..e333d3e
Binary files /dev/null and b/inst/extdata/lungfit.rds differ
diff --git a/man/MRcoefs.Rd b/man/MRcoefs.Rd
new file mode 100644
index 0000000..5cd0a16
--- /dev/null
+++ b/man/MRcoefs.Rd
@@ -0,0 +1,72 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/MRcoefs.R
+\name{MRcoefs}
+\alias{MRcoefs}
+\title{Table of top-ranked features from fitZig or fitFeatureModel}
+\usage{
+MRcoefs(obj, by = 2, coef = NULL, number = 10, taxa = obj$taxa,
+ uniqueNames = FALSE, adjustMethod = "fdr", group = 0, eff = 0,
+ numberEff = FALSE, counts = 0, file = NULL)
+}
+\arguments{
+\item{obj}{Output of fitFeatureModel or fitZig.}
+
+\item{by}{Column number or column name specifying which coefficient or
+contrast of the linear model is of interest.}
+
+\item{coef}{Column number(s) or column name(s) specifying which coefficient
+or contrast of the linear model to display.}
+
+\item{number}{The number of bacterial features to pick out.}
+
+\item{taxa}{Taxa list.}
+
+\item{uniqueNames}{Number the various taxa.}
+
+\item{adjustMethod}{Method to adjust p-values by. Default is "FDR". Options
+include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+"none". See \code{\link{p.adjust}} for more details.}
+
+\item{group}{One of five choices, 0,1,2,3,4. 0: the sort is ordered by a
+decreasing absolute value coefficient fit. 1: the sort is ordered by the raw
+coefficient fit in decreasing order. 2: the sort is ordered by the raw
+coefficient fit in increasing order. 3: the sort is ordered by the p-value
+of the coefficient fit in increasing order. 4: no sorting.}
+
+\item{eff}{Filter features to have at least a "eff" quantile or number of effective samples.}
+
+\item{numberEff}{Boolean, whether eff should represent quantile (default/FALSE) or number.}
+
+\item{counts}{Filter features to have at least 'counts' counts.}
+
+\item{file}{Name of output file, including location, to save the table.}
+}
+\value{
+Table of the top-ranked features determined by the linear fit's
+coefficient.
+}
+\description{
+Extract a table of the top-ranked features from a linear model fit. This
+function will be updated soon to provide better flexibility similar to
+limma's topTable.
+}
+\examples{
+
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+lungTrim=filterData(lungTrim,present=30)
+lungTrim=cumNorm(lungTrim,p=0.5)
+smokingStatus = pData(lungTrim)$SmokingStatus
+mod = model.matrix(~smokingStatus)
+fit = fitZig(obj = lungTrim,mod=mod)
+head(MRcoefs(fit))
+####
+fit = fitFeatureModel(obj = lungTrim,mod=mod)
+head(MRcoefs(fit))
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{fitFeatureModel}} \code{\link{MRtable}} \code{\link{MRfulltable}}
+}
+
diff --git a/man/MRcounts.Rd b/man/MRcounts.Rd
new file mode 100644
index 0000000..028cfcd
--- /dev/null
+++ b/man/MRcounts.Rd
@@ -0,0 +1,37 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\docType{methods}
+\name{MRcounts}
+\alias{MRcounts}
+\alias{MRcounts,MRexperiment-method}
+\title{Accessor for the counts slot of a MRexperiment object}
+\usage{
+MRcounts(obj, norm = FALSE, log = FALSE, sl = 1000)
+}
+\arguments{
+\item{obj}{a \code{MRexperiment} object.}
+
+\item{norm}{logical indicating whether or not to return normalized counts.}
+
+\item{log}{TRUE/FALSE whether or not to log2 transform scale.}
+
+\item{sl}{The value to scale by (default=1000).}
+}
+\value{
+Normalized or raw counts
+}
+\description{
+The counts slot holds the raw count data representing (along the rows) the
+number of reads annotated for a particular feature and (along the columns)
+the sample.
+}
+\examples{
+
+data(lungData)
+head(MRcounts(lungData))
+
+}
+\author{
+Joseph N. Paulson, jpaulson at umiacs.umd.edu
+}
+
diff --git a/man/MRexperiment-class.Rd b/man/MRexperiment-class.Rd
new file mode 100644
index 0000000..2f90009
--- /dev/null
+++ b/man/MRexperiment-class.Rd
@@ -0,0 +1,61 @@
+\name{MRexperiment}
+\Rdversion{1.0}
+\docType{class}
+\alias{MRexperiment-class}
+\alias{[,MRexperiment,ANY,ANY,ANY-method}
+\alias{[,MRexperiment-method}
+\alias{colSums,MRexperiment-method}
+\alias{rowSums,MRexperiment-method}
+\alias{colMeans,MRexperiment-method}
+\alias{rowMeans,MRexperiment-method}
+\alias{libSize,MRexperiment-method}
+\alias{normFactors,MRexperiment-method}
+
+\title{Class "MRexperiment" -- a modified eSet object for the data from high-throughput sequencing experiments}
+\description{This is the main class for metagenomeSeq.}
+\section{Objects from the Class}{
+Objects should be created with calls to \code{\link{newMRexperiment}}.
+}
+\section{Extends}{
+Class \code{eSet} (package 'Biobase'), directly.
+Class \code{VersionedBiobase} (package 'Biobase'), by class "eSet", distance 2.
+Class \code{Versioned} (package 'Biobase'), by class "eSet", distance 3.
+}
+\note{
+Note: This is a summary for reference. For an explanation of the actual usage, see the vignette.
+
+MRexperiments are the main class in use by metagenomeSeq. The class extends eSet and provides additional slots which are populated during the analysis pipeline.
+
+MRexperiment dataset are created with calls to \code{\link{newMRexperiment}}.
+MRexperiment datasets contain raw count matrices (integers) accessible through \code{\link{MRcounts}}.
+Similarly, normalized count matrices can be accessed (following normalization) through \code{\link{MRcounts}} by calling norm=TRUE.
+Following an analysis, a matrix of posterior probabilities for counts is accessible through \code{\link{posteriorProbs}}.
+
+The normalization factors used in analysis can be recovered by \code{\link{normFactors}}, as can the library sizes of samples (depths of coverage), \code{\link{libSize}}.
+
+Similarly to other RNASeq bioconductor packages available, the rows of the matrix correspond to a feature (be it OTU, species, gene, etc.) and each column an experimental sample. Pertinent clinical information and potential confounding factors are stored in the phenoData slot (accessed via \code{pData}).
+
+To populate the various slots in an MRexperiment several functions are run.
+1) \code{\link{cumNormStat}} calculates the proper percentile to calculate normalization factors. The cumNormStat slot is populated.
+2) \code{\link{cumNorm}} calculates the actual normalization factors using p = cumNormStat.
+
+Other functions will place subsequent matrices (normalized counts (\code{\link{cumNormMat}}), posterior probabilities (\code{\link{posteriorProbs}}))
+
+As mentioned above, \code{MRexperiment} is derived from the virtual class,\code{eSet} and thereby has a \code{phenoData} slot which allows for sample annotation. In the phenoData data frame factors are stored. The normalization factors and library size information is stored in a slot called expSummary that is an annotated data frame and is repopulated for subsetted data.
+
+}
+
+\section{Methods}{
+ Class-specific methods.
+ \describe{
+ \item{\code{[}}{Subset operation, taking two arguments and
+ indexing the sample and variable. Returns an \code{MRexperiment object}, including relevant
+ metadata. Setting \code{drop=TRUE} generates an error. Subsetting the data, the experiment
+ summary slot is repopulated and pData is repopulated after calling factor (removing levels not present).}
+ }
+}
+
+\examples{
+# See vignette
+}
+
diff --git a/man/MRexperiment2biom.Rd b/man/MRexperiment2biom.Rd
new file mode 100644
index 0000000..f538de6
--- /dev/null
+++ b/man/MRexperiment2biom.Rd
@@ -0,0 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/MRexperiment2biom.R
+\name{MRexperiment2biom}
+\alias{MRexperiment2biom}
+\title{MRexperiment to biom objects}
+\usage{
+MRexperiment2biom(obj, id = NULL, norm = FALSE, log = FALSE, sl = 1000,
+ qiimeVersion = TRUE)
+}
+\arguments{
+\item{obj}{The MRexperiment object.}
+
+\item{id}{Optional id for the biom matrix.}
+
+\item{norm}{normalize count table}
+
+\item{log}{log2 transform count table}
+
+\item{sl}{scaling factor for normalized counts.}
+
+\item{qiimeVersion}{Format fData according to QIIME specifications (assumes only taxonomy in fData).}
+}
+\value{
+A biom object.
+}
+\description{
+Wrapper to convert MRexperiment objects to biom objects.
+}
+\seealso{
+\code{\link{loadMeta}} \code{\link{loadPhenoData}} \code{\link{newMRexperiment}} \code{\link{loadBiom}} \code{\link{biom2MRexperiment}}
+}
+
diff --git a/man/MRfulltable.Rd b/man/MRfulltable.Rd
new file mode 100644
index 0000000..4cfa883
--- /dev/null
+++ b/man/MRfulltable.Rd
@@ -0,0 +1,77 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/MRfulltable.R
+\name{MRfulltable}
+\alias{MRfulltable}
+\title{Table of top microbial marker gene from linear model fit including sequence
+information}
+\usage{
+MRfulltable(obj, by = 2, coef = NULL, number = 10, taxa = obj$taxa,
+ uniqueNames = FALSE, adjustMethod = "fdr", group = 0, eff = 0,
+ numberEff = FALSE, ncounts = 0, file = NULL)
+}
+\arguments{
+\item{obj}{A list containing the linear model fit produced by lmFit through
+fitZig.}
+
+\item{by}{Column number or column name specifying which coefficient or
+contrast of the linear model is of interest.}
+
+\item{coef}{Column number(s) or column name(s) specifying which coefficient
+or contrast of the linear model to display.}
+
+\item{number}{The number of bacterial features to pick out.}
+
+\item{taxa}{Taxa list.}
+
+\item{uniqueNames}{Number the various taxa.}
+
+\item{adjustMethod}{Method to adjust p-values by. Default is "FDR". Options
+include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+"none". See \code{\link{p.adjust}} for more details.}
+
+\item{group}{One of five choices: 0,1,2,3,4. 0: the sort is ordered by a
+decreasing absolute value coefficient fit. 1: the sort is ordered by the raw
+coefficient fit in decreasing order. 2: the sort is ordered by the raw
+coefficient fit in increasing order. 3: the sort is ordered by the p-value
+of the coefficient fit in increasing order. 4: no sorting.}
+
+\item{eff}{Filter features to have at least a "eff" quantile or number of effective samples.}
+
+\item{numberEff}{Boolean, whether eff should represent quantile (default/FALSE) or number.}
+
+\item{ncounts}{Filter features to those with at least 'counts' counts.}
+
+\item{file}{Name of output file, including location, to save the table.}
+}
+\value{
+Table of the top-ranked features determined by the linear fit's
+coefficient.
+}
+\description{
+Extract a table of the top-ranked features from a linear model fit. This
+function will be updated soon to provide better flexibility similar to
+limma's topTable. This function differs from \code{link{MRcoefs}} in that it
+provides other information about the presence or absence of features to help
+ensure significant features called are moderately present.
+}
+\examples{
+
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+lungTrim=filterData(lungTrim,present=30)
+lungTrim=cumNorm(lungTrim,p=0.5)
+smokingStatus = pData(lungTrim)$SmokingStatus
+mod = model.matrix(~smokingStatus)
+fit = fitZig(obj = lungTrim,mod=mod)
+# head(MRfulltable(fit))
+####
+fit = fitFeatureModel(obj = lungTrim,mod=mod)
+# head(MRfulltable(fit))
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{fitFeatureModel}} \code{\link{MRcoefs}} \code{\link{MRtable}}
+\code{\link{fitPA}}
+}
+
diff --git a/man/MRtable.Rd b/man/MRtable.Rd
new file mode 100644
index 0000000..9d50411
--- /dev/null
+++ b/man/MRtable.Rd
@@ -0,0 +1,75 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/MRtable.R
+\name{MRtable}
+\alias{MRtable}
+\title{Table of top microbial marker gene from linear model fit including sequence
+information}
+\usage{
+MRtable(obj, by = 2, coef = NULL, number = 10, taxa = obj$taxa,
+ uniqueNames = FALSE, adjustMethod = "fdr", group = 0, eff = 0,
+ numberEff = FALSE, ncounts = 0, file = NULL)
+}
+\arguments{
+\item{obj}{Output of fitFeatureModel or fitZig.}
+
+\item{by}{Column number or column name specifying which coefficient or
+contrast of the linear model is of interest.}
+
+\item{coef}{Column number(s) or column name(s) specifying which coefficient
+or contrast of the linear model to display.}
+
+\item{number}{The number of bacterial features to pick out.}
+
+\item{taxa}{Taxa list.}
+
+\item{uniqueNames}{Number the various taxa.}
+
+\item{adjustMethod}{Method to adjust p-values by. Default is "FDR". Options
+include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+"none". See \code{\link{p.adjust}} for more details.}
+
+\item{group}{One of five choices, 0,1,2,3,4. 0: the sort is ordered by a
+decreasing absolute value coefficient fit. 1: the sort is ordered by the raw
+coefficient fit in decreasing order. 2: the sort is ordered by the raw
+coefficient fit in increasing order. 3: the sort is ordered by the p-value
+of the coefficient fit in increasing order. 4: no sorting.}
+
+\item{eff}{Filter features to have at least a "eff" quantile or number of effective samples.}
+
+\item{numberEff}{Boolean, whether eff should represent quantile (default/FALSE) or number.}
+
+\item{ncounts}{Filter features to have at least 'counts' of counts.}
+
+\item{file}{Name of file, including location, to save the table.}
+}
+\value{
+Table of the top-ranked features determined by the linear fit's
+coefficient.
+}
+\description{
+Extract a table of the top-ranked features from a linear model fit. This
+function will be updated soon to provide better flexibility similar to
+limma's topTable. This function differs from \code{link{MRcoefs}} in that it
+provides other information about the presence or absence of features to help
+ensure significant features called are moderately present.
+}
+\examples{
+
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+lungTrim=filterData(lungTrim,present=30)
+lungTrim=cumNorm(lungTrim,p=0.5)
+smokingStatus = pData(lungTrim)$SmokingStatus
+mod = model.matrix(~smokingStatus)
+fit = fitZig(obj = lungTrim,mod=mod)
+head(MRtable(fit))
+####
+fit = fitFeatureModel(obj = lungTrim,mod=mod)
+head(MRtable(fit))
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{fitFeatureModel}} \code{\link{MRcoefs}} \code{\link{MRfulltable}}
+}
+
diff --git a/man/aggregateBySample.Rd b/man/aggregateBySample.Rd
new file mode 100644
index 0000000..20d219d
--- /dev/null
+++ b/man/aggregateBySample.Rd
@@ -0,0 +1,39 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/aggregateBySample.R
+\name{aggregateBySample}
+\alias{aggSamp}
+\alias{aggregateBySample}
+\title{Aggregates a MRexperiment object or counts matrix to by a factor.}
+\usage{
+aggregateBySample(obj, fct, aggfun = rowMeans, out = "MRexperiment")
+
+aggSamp(obj, fct, aggfun = rowMeans, out = "MRexperiment")
+}
+\arguments{
+\item{obj}{A MRexperiment object or count matrix.}
+
+\item{fct}{phenoData column name from the MRexperiment object or if count matrix object a vector of labels.}
+
+\item{aggfun}{Aggregation function.}
+
+\item{out}{Either 'MRexperiment' or 'matrix'}
+}
+\value{
+An aggregated count matrix or MRexperiment object where the new pData is a vector of `fct` levels.
+}
+\description{
+Using the phenoData information in the MRexperiment, calling aggregateBySample on a
+MRexperiment and a particular phenoData column (i.e. 'diet') will aggregate counts
+using the aggfun function (default rowMeans). Possible aggfun alternatives
+include rowMeans and rowMedians.
+}
+\examples{
+
+data(mouseData)
+aggregateBySample(mouseData[1:100,],fct="diet",aggfun=rowSums)
+# not run
+# aggregateBySample(mouseData,fct="diet",aggfun=matrixStats::rowMedians)
+# aggSamp(mouseData,fct='diet',aggfun=rowMaxs)
+
+}
+
diff --git a/man/aggregateByTaxonomy.Rd b/man/aggregateByTaxonomy.Rd
new file mode 100644
index 0000000..f958237
--- /dev/null
+++ b/man/aggregateByTaxonomy.Rd
@@ -0,0 +1,49 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/aggregateByTaxonomy.R
+\name{aggregateByTaxonomy}
+\alias{aggTax}
+\alias{aggregateByTaxonomy}
+\title{Aggregates a MRexperiment object or counts matrix to a particular level.}
+\usage{
+aggregateByTaxonomy(obj, lvl, alternate = FALSE, norm = FALSE,
+ log = FALSE, aggfun = colSums, sl = 1000, out = "MRexperiment")
+
+aggTax(obj, lvl, alternate = FALSE, norm = FALSE, log = FALSE,
+ aggfun = colSums, sl = 1000, out = "MRexperiment")
+}
+\arguments{
+\item{obj}{A MRexperiment object or count matrix.}
+
+\item{lvl}{featureData column name from the MRexperiment object or if count matrix object a vector of labels.}
+
+\item{alternate}{Use the rowname for undefined OTUs instead of aggregating to "no_match".}
+
+\item{norm}{Whether to aggregate normalized counts or not.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{aggfun}{Aggregation function.}
+
+\item{sl}{scaling value, default is 1000.}
+
+\item{out}{Either 'MRexperiment' or 'matrix'}
+}
+\value{
+An aggregated count matrix.
+}
+\description{
+Using the featureData information in the MRexperiment, calling aggregateByTaxonomy on a
+MRexperiment and a particular featureData column (i.e. 'genus') will aggregate counts
+to the desired level using the aggfun function (default colSums). Possible aggfun alternatives
+include colMeans and colMedians.
+}
+\examples{
+
+data(mouseData)
+aggregateByTaxonomy(mouseData[1:100,],lvl="class",norm=TRUE,aggfun=colSums)
+# not run
+# aggregateByTaxonomy(mouseData,lvl="class",norm=TRUE,aggfun=colMedians)
+# aggTax(mouseData,lvl='phylum',norm=FALSE,aggfun=colSums)
+
+}
+
diff --git a/man/biom2MRexperiment.Rd b/man/biom2MRexperiment.Rd
new file mode 100644
index 0000000..ff9600d
--- /dev/null
+++ b/man/biom2MRexperiment.Rd
@@ -0,0 +1,29 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/biom2MRexperiment.R
+\name{biom2MRexperiment}
+\alias{biom2MRexperiment}
+\title{Biom to MRexperiment objects}
+\usage{
+biom2MRexperiment(obj)
+}
+\arguments{
+\item{obj}{The biom object file.}
+}
+\value{
+A MRexperiment object.
+}
+\description{
+Wrapper to convert biom files to MRexperiment objects.
+}
+\examples{
+
+library(biomformat)
+rich_dense_file = system.file("extdata", "rich_dense_otu_table.biom", package = "biomformat")
+x = biomformat::read_biom(rich_dense_file)
+biom2MRexperiment(x)
+
+}
+\seealso{
+\code{\link{loadMeta}} \code{\link{loadPhenoData}} \code{\link{newMRexperiment}} \code{\link{loadBiom}}
+}
+
diff --git a/man/calcNormFactors.Rd b/man/calcNormFactors.Rd
new file mode 100644
index 0000000..4dbe632
--- /dev/null
+++ b/man/calcNormFactors.Rd
@@ -0,0 +1,29 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/cumNorm.R
+\name{calcNormFactors}
+\alias{calcNormFactors}
+\title{Cumulative sum scaling (css) normalization factors}
+\usage{
+calcNormFactors(obj, p = cumNormStatFast(obj))
+}
+\arguments{
+\item{obj}{An MRexperiment object or matrix.}
+
+\item{p}{The pth quantile.}
+}
+\value{
+Vector of the sum up to and including a sample's pth quantile.
+}
+\description{
+Return a vector of the the sum up to and including a quantile.
+}
+\examples{
+
+data(mouseData)
+head(calcNormFactors(mouseData))
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{cumNormStatFast}} \code{\link{cumNorm}}
+}
+
diff --git a/man/calcPosComponent.Rd b/man/calcPosComponent.Rd
new file mode 100644
index 0000000..8750dba
--- /dev/null
+++ b/man/calcPosComponent.Rd
@@ -0,0 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitZeroLogNormal.R
+\name{calcPosComponent}
+\alias{calcPosComponent}
+\title{Positive component}
+\usage{
+calcPosComponent(mat, mod, weights)
+}
+\arguments{
+\item{mat}{A matrix of normalized counts}
+
+\item{mod}{A model matrix}
+
+\item{weights}{Weight matrix for samples and counts}
+}
+\description{
+Fit the positive (log-normal) component
+}
+\seealso{
+\code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+}
+
diff --git a/man/calcShrinkParameters.Rd b/man/calcShrinkParameters.Rd
new file mode 100644
index 0000000..fe5aed2
--- /dev/null
+++ b/man/calcShrinkParameters.Rd
@@ -0,0 +1,24 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitZeroLogNormal.R
+\name{calcShrinkParameters}
+\alias{calcShrinkParameters}
+\title{Calculate shrinkage parameters}
+\usage{
+calcShrinkParameters(fit, coef, mins2, exclude = NULL)
+}
+\arguments{
+\item{fit}{A matrix of fits as outputted by calcZeroComponent or calcPosComponent}
+
+\item{coef}{Coefficient of interest}
+
+\item{mins2}{minimum variance estimate}
+
+\item{exclude}{Vector of features to exclude when shrinking}
+}
+\description{
+Calculate the shrunken variances and variance of parameters of interest across features.
+}
+\seealso{
+\code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+}
+
diff --git a/man/calcStandardError.Rd b/man/calcStandardError.Rd
new file mode 100644
index 0000000..e4da0c9
--- /dev/null
+++ b/man/calcStandardError.Rd
@@ -0,0 +1,28 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitZeroLogNormal.R
+\name{calcStandardError}
+\alias{calcStandardError}
+\title{Calculate the zero-inflated log-normal statistic's standard error}
+\usage{
+calcStandardError(mod, fitln, fitzero, coef = 2, exclude = NULL)
+}
+\arguments{
+\item{mod}{The zero component model matrix}
+
+\item{fitln}{A matrix with parameters from the log-normal fit}
+
+\item{fitzero}{A matrix with parameters from the logistic fit}
+
+\item{coef}{Coefficient of interest}
+
+\item{exclude}{List of features to exclude}
+}
+\description{
+Calculat the se for the model. Code modified from
+"Adjusting for covariates in zero-inflated gamma and
+zero-inflated log-normal models for semicontinuous data", ED Mills
+}
+\seealso{
+\code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+}
+
diff --git a/man/calcZeroAdjustment.Rd b/man/calcZeroAdjustment.Rd
new file mode 100644
index 0000000..fb8dd1e
--- /dev/null
+++ b/man/calcZeroAdjustment.Rd
@@ -0,0 +1,28 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitZeroLogNormal.R
+\name{calcZeroAdjustment}
+\alias{calcZeroAdjustment}
+\title{Calculate the zero-inflated component's adjustment factor}
+\usage{
+calcZeroAdjustment(fitln, fitzero, mod, coef, exclude = NULL)
+}
+\arguments{
+\item{fitln}{A matrix with parameters from the log-normal fit}
+
+\item{fitzero}{A matrix with parameters from the logistic fit}
+
+\item{mod}{The zero component model matrix}
+
+\item{coef}{Coefficient of interest}
+
+\item{exclude}{List of features to exclude}
+}
+\description{
+Calculate the log ratio of average marginal probabilities for each sample
+having a positive count. This becomes the adjustment factor for the log
+fold change.
+}
+\seealso{
+\code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+}
+
diff --git a/man/calcZeroComponent.Rd b/man/calcZeroComponent.Rd
new file mode 100644
index 0000000..7e2e658
--- /dev/null
+++ b/man/calcZeroComponent.Rd
@@ -0,0 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitZeroLogNormal.R
+\name{calcZeroComponent}
+\alias{calcZeroComponent}
+\title{Zero component}
+\usage{
+calcZeroComponent(mat, mod, weights)
+}
+\arguments{
+\item{mat}{A matrix of normalized counts}
+
+\item{mod}{A model matrix}
+
+\item{weights}{Weight matrix for samples and counts}
+}
+\description{
+Fit the zero (logisitic) component
+}
+\seealso{
+\code{\link{fitZeroLogNormal}} \code{\link{fitFeatureModel}}
+}
+
diff --git a/man/calculateEffectiveSamples.Rd b/man/calculateEffectiveSamples.Rd
new file mode 100644
index 0000000..9398662
--- /dev/null
+++ b/man/calculateEffectiveSamples.Rd
@@ -0,0 +1,24 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/calculateEffectiveSamples.R
+\name{calculateEffectiveSamples}
+\alias{calculateEffectiveSamples}
+\title{Estimated effective samples per feature}
+\usage{
+calculateEffectiveSamples(obj)
+}
+\arguments{
+\item{obj}{The output of fitZig run on a MRexperiment object.}
+}
+\value{
+A list of the estimated effective samples per feature.
+}
+\description{
+Calculates the number of estimated effective samples per feature from the output
+of a fitZig run. The estimated effective samples per feature is calculated as the
+sum_1^n (n = number of samples) 1-z_i where z_i is the posterior probability a feature
+belongs to the technical distribution.
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{MRcoefs}} \code{\link{MRfulltable}}
+}
+
diff --git a/man/correctIndices.Rd b/man/correctIndices.Rd
new file mode 100644
index 0000000..14e1643
--- /dev/null
+++ b/man/correctIndices.Rd
@@ -0,0 +1,36 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/correlationTest.R
+\name{correctIndices}
+\alias{correctIndices}
+\title{Calculate the correct indices for the output of correlationTest}
+\usage{
+correctIndices(n)
+}
+\arguments{
+\item{n}{The number of features compared by correlationTest (nrow(mat)).}
+}
+\value{
+A vector of the indices for an upper triangular matrix.
+}
+\description{
+Consider the upper triangular portion of a matrix of size nxn. Results from the \code{correlationTest} are output
+as the combination of two vectors, correlation statistic and p-values. The order of the output is 1vs2, 1vs3, 1vs4, etc.
+The correctIndices returns the correct indices to fill a correlation matrix or correlation-pvalue matrix.
+}
+\examples{
+
+data(mouseData)
+mat = MRcounts(mouseData)[55:60,]
+cors = correlationTest(mat)
+ind = correctIndices(nrow(mat))
+
+cormat = as.matrix(dist(mat))
+cormat[cormat>0] = 0
+cormat[upper.tri(cormat)][ind] = cors[,1]
+table(cormat[1,-1] - cors[1:5,1])
+
+}
+\seealso{
+\code{\link{correlationTest}}
+}
+
diff --git a/man/correlationTest.Rd b/man/correlationTest.Rd
new file mode 100644
index 0000000..e5a604b
--- /dev/null
+++ b/man/correlationTest.Rd
@@ -0,0 +1,61 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/correlationTest.R
+\name{correlationTest}
+\alias{corTest}
+\alias{correlationTest}
+\title{Correlation of each row of a matrix or MRexperiment object}
+\usage{
+correlationTest(obj, y = NULL, method = "pearson",
+ alternative = "two.sided", norm = TRUE, log = TRUE, cores = 1,
+ override = FALSE, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object or count matrix.}
+
+\item{y}{Vector of length ncol(obj) to compare to.}
+
+\item{method}{One of 'pearson','spearman', or 'kendall'.}
+
+\item{alternative}{Indicates the alternative hypothesis and must be one of 'two.sided', 'greater' (positive) or 'less'(negative). You can specify just the initial letter.}
+
+\item{norm}{Whether to aggregate normalized counts or not - if MRexperiment object.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{cores}{Number of cores to use.}
+
+\item{override}{If the number of rows to test is over a thousand the test will not commence (unless override==TRUE).}
+
+\item{...}{Extra parameters for mclapply.}
+}
+\value{
+A matrix of size choose(number of rows, 2) by 2. The first column corresponds to the correlation value. The second column the p-value.
+}
+\description{
+Calculates the (pairwise) correlation statistics and associated p-values of a matrix
+or the correlation of each row with a vector.
+}
+\examples{
+
+# Pairwise correlation of raw counts
+data(mouseData)
+cors = correlationTest(mouseData[1:10,],norm=FALSE,log=FALSE)
+head(cors)
+
+mat = MRcounts(mouseData)[1:10,]
+cormat = as.matrix(dist(mat)) # Creating a matrix
+cormat[cormat>0] = 0 # Creating an empty matrix
+ind = correctIndices(nrow(mat))
+cormat[upper.tri(cormat)][ind] = cors[,1]
+table(cormat[1,-1] - cors[1:9,1])
+
+# Correlation of raw counts with a vector (library size in this case)
+data(mouseData)
+cors = correlationTest(mouseData[1:10,],libSize(mouseData),norm=FALSE,log=FALSE)
+head(cors)
+
+}
+\seealso{
+\code{\link{correctIndices}}
+}
+
diff --git a/man/cumNorm.Rd b/man/cumNorm.Rd
new file mode 100644
index 0000000..4ba687c
--- /dev/null
+++ b/man/cumNorm.Rd
@@ -0,0 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/cumNorm.R
+\name{cumNorm}
+\alias{cumNorm}
+\title{Cumulative sum scaling normalization}
+\usage{
+cumNorm(obj, p = cumNormStatFast(obj))
+}
+\arguments{
+\item{obj}{An MRexperiment object.}
+
+\item{p}{The pth quantile.}
+}
+\value{
+Object with the normalization factors stored as
+a vector of the sum up to and including a sample's pth quantile.
+}
+\description{
+Calculates each column's quantile and calculates the sum up to and including
+that quantile.
+}
+\examples{
+
+data(mouseData)
+cumNorm(mouseData)
+head(normFactors(mouseData))
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{cumNormStat}}
+}
+
diff --git a/man/cumNormMat.Rd b/man/cumNormMat.Rd
new file mode 100644
index 0000000..8e48230
--- /dev/null
+++ b/man/cumNormMat.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/cumNormMat.R
+\name{cumNormMat}
+\alias{cumNormMat}
+\title{Cumulative sum scaling factors.}
+\usage{
+cumNormMat(obj, p = cumNormStatFast(obj), sl = 1000)
+}
+\arguments{
+\item{obj}{A matrix or MRexperiment object.}
+
+\item{p}{The pth quantile.}
+
+\item{sl}{The value to scale by (default=1000).}
+}
+\value{
+Returns a matrix normalized by scaling counts up to and including
+the pth quantile.
+}
+\description{
+Calculates each column's quantile and calculates the sum up to and including
+that quantile.
+}
+\examples{
+
+data(mouseData)
+head(cumNormMat(mouseData))
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{cumNorm}}
+}
+
diff --git a/man/cumNormStat.Rd b/man/cumNormStat.Rd
new file mode 100644
index 0000000..1a2c967
--- /dev/null
+++ b/man/cumNormStat.Rd
@@ -0,0 +1,39 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/cumNormStat.R
+\name{cumNormStat}
+\alias{cumNormStat}
+\title{Cumulative sum scaling percentile selection}
+\usage{
+cumNormStat(obj, qFlag = TRUE, pFlag = FALSE, rel = 0.1, ...)
+}
+\arguments{
+\item{obj}{A matrix or MRexperiment object.}
+
+\item{qFlag}{Flag to either calculate the proper percentile using
+R's step-wise quantile function or approximate function.}
+
+\item{pFlag}{Plot the relative difference of the median deviance from the reference.}
+
+\item{rel}{Cutoff for the relative difference from one median difference
+from the reference to the next}
+
+\item{...}{Applicable if pFlag == TRUE. Additional plotting parameters.}
+}
+\value{
+Percentile for which to scale data
+}
+\description{
+Calculates the percentile for which to sum counts up to and scale by.
+cumNormStat might be deprecated one day. Deviates from methods in Nature Methods paper
+by making use row means for generating reference.
+}
+\examples{
+
+data(mouseData)
+p = round(cumNormStat(mouseData,pFlag=FALSE),digits=2)
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{cumNorm}} \code{\link{cumNormStatFast}}
+}
+
diff --git a/man/cumNormStatFast.Rd b/man/cumNormStatFast.Rd
new file mode 100644
index 0000000..9f9287e
--- /dev/null
+++ b/man/cumNormStatFast.Rd
@@ -0,0 +1,36 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/cumNormStatFast.R
+\name{cumNormStatFast}
+\alias{cumNormStatFast}
+\title{Cumulative sum scaling percentile selection}
+\usage{
+cumNormStatFast(obj, pFlag = FALSE, rel = 0.1, ...)
+}
+\arguments{
+\item{obj}{A matrix or MRexperiment object.}
+
+\item{pFlag}{Plot the median difference quantiles.}
+
+\item{rel}{Cutoff for the relative difference from one median difference
+from the reference to the next.}
+
+\item{...}{Applicable if pFlag == TRUE. Additional plotting parameters.}
+}
+\value{
+Percentile for which to scale data
+}
+\description{
+Calculates the percentile for which to sum counts up to and scale by. Faster
+version than available in cumNormStat. Deviates from methods described in Nature Methods by
+making use of ro means for reference.
+}
+\examples{
+
+data(mouseData)
+p = round(cumNormStatFast(mouseData,pFlag=FALSE),digits=2)
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{cumNorm}} \code{\link{cumNormStat}}
+}
+
diff --git a/man/doCountMStep.Rd b/man/doCountMStep.Rd
new file mode 100644
index 0000000..941d28f
--- /dev/null
+++ b/man/doCountMStep.Rd
@@ -0,0 +1,45 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/doCountMStep.R
+\name{doCountMStep}
+\alias{doCountMStep}
+\title{Compute the Maximization step calculation for features still active.}
+\usage{
+doCountMStep(z, y, mmCount, stillActive, fit2 = NULL, dfMethod = "modified")
+}
+\arguments{
+\item{z}{Matrix (m x n) of estimate responsibilities (probabilities that a
+count comes from a spike distribution at 0).}
+
+\item{y}{Matrix (m x n) of count observations.}
+
+\item{mmCount}{Model matrix for the count distribution.}
+
+\item{stillActive}{Boolean vector of size M, indicating whether a feature
+converged or not.}
+
+\item{fit2}{Previous fit of the count model.}
+
+\item{dfMethod}{Either 'default' or 'modified' (by responsibilities)}
+}
+\value{
+Update matrix (m x n) of estimate responsibilities (probabilities
+that a count comes from a spike distribution at 0).
+}
+\description{
+Maximization step is solved by weighted least squares. The function also
+computes counts residuals.
+}
+\details{
+Maximum-likelihood estimates are approximated using the EM algorithm where
+we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+zero point mass as latent indicator variables. The density is defined as
+$f_zig(y_ij = pi_j(S_j)*f_0(y_ij) +(1-pi_j (S_j)) *
+f_count(y_ij;mu_i,sigma_i^2)$. The log-likelihood in this extended model is
+$(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+pi_j(s_j)+(1-delta_ij)log (1-pi_j (s_j))$. The responsibilities are defined
+as $z_ij = pr(delta_ij=1 | data)$.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/doEStep.Rd b/man/doEStep.Rd
new file mode 100644
index 0000000..93bccc2
--- /dev/null
+++ b/man/doEStep.Rd
@@ -0,0 +1,37 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/doEStep.R
+\name{doEStep}
+\alias{doEStep}
+\title{Compute the Expectation step.}
+\usage{
+doEStep(countResiduals, zeroResiduals, zeroIndices)
+}
+\arguments{
+\item{countResiduals}{Residuals from the count model.}
+
+\item{zeroResiduals}{Residuals from the zero model.}
+
+\item{zeroIndices}{Index (matrix m x n) of counts that are zero/non-zero.}
+}
+\value{
+Updated matrix (m x n) of estimate responsibilities (probabilities
+that a count comes from a spike distribution at 0).
+}
+\description{
+Estimates the responsibilities $z_ij = fracpi_j cdot I_0(y_ijpi_j cdot
+I_0(y_ij + (1-pi_j) cdot f_count(y_ij
+}
+\details{
+Maximum-likelihood estimates are approximated using the EM algorithm where
+we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+zero point mass as latent indicator variables. The density is defined as
+$f_zig(y_ij = pi_j(S_j) cdot f_0(y_ij) +(1-pi_j (S_j))cdot
+f_count(y_ij;mu_i,sigma_i^2)$. The log-likelihood in this extended model is
+$(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+pi_j(s_j)+(1-delta_ij)log (1-pi_j (sj))$. The responsibilities are defined
+as $z_ij = pr(delta_ij=1 | data)$.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/doZeroMStep.Rd b/man/doZeroMStep.Rd
new file mode 100644
index 0000000..c187527
--- /dev/null
+++ b/man/doZeroMStep.Rd
@@ -0,0 +1,38 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/doZeroMStep.R
+\name{doZeroMStep}
+\alias{doZeroMStep}
+\title{Compute the zero Maximization step.}
+\usage{
+doZeroMStep(z, zeroIndices, mmZero)
+}
+\arguments{
+\item{z}{Matrix (m x n) of estimate responsibilities (probabilities that a
+count comes from a spike distribution at 0).}
+
+\item{zeroIndices}{Index (matrix m x n) of counts that are zero/non-zero.}
+
+\item{mmZero}{The zero model, the model matrix to account for the change in
+the number of OTUs observed as a linear effect of the depth of coverage.}
+}
+\value{
+List of the zero fit (zero mean model) coefficients, variance -
+scale parameter (scalar), and normalized residuals of length
+sum(zeroIndices).
+}
+\description{
+Performs Maximization step calculation for the mixture components. Uses
+least squares to fit the parameters of the mean of the logistic
+distribution. $$ pi_j = sum_i^M frac1Mz_ij $$ Maximum-likelihood estimates
+are approximated using the EM algorithm where we treat mixture membership
+$delta_ij$ = 1 if $y_ij$ is generated from the zero point mass as latent
+indicator variables. The density is defined as $f_zig(y_ij = pi_j(S_j) cdot
+f_0(y_ij) +(1-pi_j (S_j))cdot f_count(y_ij;mu_i,sigma_i^2)$. The
+log-likelihood in this extended model is $(1-delta_ij) log
+f_count(y;mu_i,sigma_i^2 )+delta_ij log pi_j(s_j)+(1-delta_ij)log (1-pi_j
+(sj))$. The responsibilities are defined as $z_ij = pr(delta_ij=1 | data)$.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/expSummary.Rd b/man/expSummary.Rd
new file mode 100644
index 0000000..61b1469
--- /dev/null
+++ b/man/expSummary.Rd
@@ -0,0 +1,31 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\docType{methods}
+\name{expSummary}
+\alias{expSummary}
+\alias{expSummary,MRexperiment-method}
+\title{Access MRexperiment object experiment data}
+\usage{
+expSummary(obj)
+}
+\arguments{
+\item{obj}{a \code{MRexperiment} object.}
+}
+\value{
+Experiment summary table
+}
+\description{
+The expSummary vectors represent the column (sample specific) sums of
+features, i.e. the total number of reads for a sample, libSize and also the
+normalization factors, normFactor.
+}
+\examples{
+
+data(mouseData)
+expSummary(mouseData)
+
+}
+\author{
+Joseph N. Paulson, jpaulson at umiacs.umd.edu
+}
+
diff --git a/man/exportMat.Rd b/man/exportMat.Rd
new file mode 100644
index 0000000..be8eed0
--- /dev/null
+++ b/man/exportMat.Rd
@@ -0,0 +1,40 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/exportMat.R
+\name{exportMat}
+\alias{exportMat}
+\alias{exportMatrix}
+\title{Export the normalized MRexperiment dataset as a matrix.}
+\usage{
+exportMat(obj, log = TRUE, norm = TRUE, sep = "\\t",
+ file = "~/Desktop/matrix.tsv")
+}
+\arguments{
+\item{obj}{A MRexperiment object or count matrix.}
+
+\item{log}{Whether or not to log transform the counts - if MRexperiment object.}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{sep}{Separator for writing out the count matrix.}
+
+\item{file}{Output file name.}
+}
+\value{
+NA
+}
+\description{
+This function allows the user to take a dataset of counts and output the
+dataset to the user's workspace as a tab-delimited file, etc.
+}
+\examples{
+
+data(lungData)
+dataDirectory <- system.file("extdata", package="metagenomeSeq")
+exportMat(lungData[,1:5],file=file.path(dataDirectory,"tmp.tsv"))
+head(read.csv(file=file.path(dataDirectory,"tmp.tsv"),sep="\\t"))
+
+}
+\seealso{
+\code{\link{cumNorm}}
+}
+
diff --git a/man/exportStats.Rd b/man/exportStats.Rd
new file mode 100644
index 0000000..2a130a1
--- /dev/null
+++ b/man/exportStats.Rd
@@ -0,0 +1,35 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/exportStats.R
+\name{exportStats}
+\alias{exportStats}
+\title{Various statistics of the count data.}
+\usage{
+exportStats(obj, p = cumNormStat(obj), file = "~/Desktop/res.stats.tsv")
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{p}{Quantile value to calculate the scaling factor and quantiles for
+the various samples.}
+
+\item{file}{Output file name.}
+}
+\value{
+None.
+}
+\description{
+A matrix of values for each sample. The matrix consists of sample ids, the
+sample scaling factor, quantile value, the number identified features, and library size (depth of coverage).
+}
+\examples{
+
+data(lungData)
+dataDirectory <- system.file("extdata", package="metagenomeSeq")
+exportStats(lungData[,1:5],file=file.path(dataDirectory,"tmp.tsv"))
+head(read.csv(file=file.path(dataDirectory,"tmp.tsv"),sep="\\t"))
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{quantile}}
+}
+
diff --git a/man/extractMR.Rd b/man/extractMR.Rd
new file mode 100644
index 0000000..734e9be
--- /dev/null
+++ b/man/extractMR.Rd
@@ -0,0 +1,30 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/mergeMRexperiments.R
+\name{extractMR}
+\alias{extractMR}
+\title{Extract the essentials of an MRexperiment.}
+\usage{
+extractMR(obj)
+}
+\arguments{
+\item{obj}{MRexperiment-class object.}
+}
+\value{
+\itemize{A list containing:
+\item counts : Count data
+\item librarySize : The column sums / library size / sequencing depth
+\item normFactors : The normalization scaling factors
+\item pheno : phenotype table
+\item feat : feature table
+}
+}
+\description{
+Extract the essentials of an MRexperiment.
+}
+\examples{
+
+data(mouseData)
+head(metagenomeSeq:::extractMR(mouseData))
+
+}
+
diff --git a/man/filterData.Rd b/man/filterData.Rd
new file mode 100644
index 0000000..dd5eddb
--- /dev/null
+++ b/man/filterData.Rd
@@ -0,0 +1,29 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/filterData.R
+\name{filterData}
+\alias{filterData}
+\title{Filter datasets according to no. features present in features with at least a certain depth.}
+\usage{
+filterData(obj, present = 1, depth = 1000)
+}
+\arguments{
+\item{obj}{A MRexperiment object or count matrix.}
+
+\item{present}{Features with at least 'present' postive samples.}
+
+\item{depth}{Sampls with at least this much depth of coverage}
+}
+\value{
+A MRexperiment object.
+}
+\description{
+Filter the data based on the number of present features after filtering samples by depth of coverage.
+There are many ways to filter the object, this is just one way.
+}
+\examples{
+
+data(mouseData)
+filterData(mouseData)
+
+}
+
diff --git a/man/fitDO.Rd b/man/fitDO.Rd
new file mode 100644
index 0000000..43f0004
--- /dev/null
+++ b/man/fitDO.Rd
@@ -0,0 +1,51 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitDO.R
+\name{fitDO}
+\alias{fitDO}
+\title{Wrapper to calculate Discovery Odds Ratios on feature values.}
+\usage{
+fitDO(obj, cl, norm = TRUE, log = TRUE, adjust.method = "fdr",
+ cores = 1, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with a count matrix, or a simple count
+matrix.}
+
+\item{cl}{Group comparison}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{adjust.method}{Method to adjust p-values by. Default is "FDR". Options
+include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+"none". See \code{\link{p.adjust}} for more details.}
+
+\item{cores}{Number of cores to use.}
+
+\item{...}{Extra options for makeCluster}
+}
+\value{
+Matrix of odds ratios, p-values, lower and upper confidence intervals
+}
+\description{
+This function returns a data frame of p-values, odds ratios, lower and upper
+confidence limits for every row of a matrix. The discovery odds ratio is calculated
+as using Fisher's exact test on actual counts. The test's hypothesis is whether
+or not the discovery of counts for a feature (of all counts) is found in greater proportion
+in a particular group.
+}
+\examples{
+
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+lungTrim = lungTrim[-which(rowSums(MRcounts(lungTrim)>0)<20),]
+res = fitDO(lungTrim,pData(lungTrim)$SmokingStatus);
+head(res)
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitZig}} \code{\link{fitPA}} \code{\link{fitMeta}}
+}
+
diff --git a/man/fitFeatureModel.Rd b/man/fitFeatureModel.Rd
new file mode 100644
index 0000000..362c50b
--- /dev/null
+++ b/man/fitFeatureModel.Rd
@@ -0,0 +1,53 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitFeatureModel.R
+\name{fitFeatureModel}
+\alias{fitFeatureModel}
+\title{Computes differential abundance analysis using a zero-inflated log-normal model}
+\usage{
+fitFeatureModel(obj, mod, coef = 2, B = 1, szero = FALSE, spos = TRUE)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{mod}{The model for the count distribution.}
+
+\item{coef}{Coefficient of interest to grab log fold-changes.}
+
+\item{B}{Number of bootstraps to perform if >1. If >1 performs permutation test.}
+
+\item{szero}{TRUE/FALSE, shrink zero component parameters.}
+
+\item{spos}{TRUE/FALSE, shrink positive component parameters.}
+}
+\value{
+A list of objects including:
+\itemize{
+ \item{call - the call made to fitFeatureModel}
+ \item{fitZeroLogNormal - list of parameter estimates for the zero-inflated log normal model}
+ \item{design - model matrix}
+ \item{taxa - taxa names}
+ \item{counts - count matrix}
+ \item{pvalues - calculated p-values}
+ \item{permuttedfits - permutted z-score estimates under the null}
+}
+}
+\description{
+Wrapper to actually run zero-inflated log-normal model given a MRexperiment object
+and model matrix. User can decide to shrink parameter estimates.
+}
+\examples{
+
+data(lungData)
+lungData = lungData[,-which(is.na(pData(lungData)$SmokingStatus))]
+lungData=filterData(lungData,present=30,depth=1)
+lungData <- cumNorm(lungData, p=.5)
+s <- normFactors(lungData)
+pd <- pData(lungData)
+mod <- model.matrix(~1+SmokingStatus, data=pd)
+lungres1 = fitFeatureModel(lungData,mod)
+
+}
+\seealso{
+\code{\link{cumNorm}}
+}
+
diff --git a/man/fitLogNormal.Rd b/man/fitLogNormal.Rd
new file mode 100644
index 0000000..4c422bf
--- /dev/null
+++ b/man/fitLogNormal.Rd
@@ -0,0 +1,46 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitLogNormal.R
+\name{fitLogNormal}
+\alias{fitLogNormal}
+\title{Computes a log-normal linear model and permutation based p-values.}
+\usage{
+fitLogNormal(obj, mod, useCSSoffset = TRUE, B = 1000, coef = 2,
+ sl = 1000)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{mod}{The model for the count distribution.}
+
+\item{useCSSoffset}{Boolean, whether to include the default scaling
+parameters in the model or not.}
+
+\item{B}{Number of permutations.}
+
+\item{coef}{The coefficient of interest.}
+
+\item{sl}{The value to scale by (default=1000).}
+}
+\value{
+Call made, fit object from lmFit, t-statistics and p-values for each feature.
+}
+\description{
+Wrapper to perform the permutation test on the t-statistic. This is the original
+method employed by metastats (for non-sparse large samples). We include CSS normalization
+though (optional) and log2 transform the data. In this method the null distribution is not assumed to be a t-dist.
+}
+\examples{
+
+# This is a simple demonstration
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+k = which(rowSums(MRcounts(lungTrim)>0)<30)
+lungTrim = cumNorm(lungTrim)
+lungTrim = lungTrim[-k,]
+smokingStatus = pData(lungTrim)$SmokingStatus
+mod = model.matrix(~smokingStatus)
+fit = fitLogNormal(obj = lungTrim,mod=mod,B=1)
+
+}
+
diff --git a/man/fitMultipleTimeSeries.Rd b/man/fitMultipleTimeSeries.Rd
new file mode 100644
index 0000000..79a19a2
--- /dev/null
+++ b/man/fitMultipleTimeSeries.Rd
@@ -0,0 +1,45 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{fitMultipleTimeSeries}
+\alias{fitMultipleTimeSeries}
+\title{Discover differentially abundant time intervals for all bacteria}
+\usage{
+fitMultipleTimeSeries(obj, lvl = NULL, B = 1, ...)
+}
+\arguments{
+\item{obj}{metagenomeSeq MRexperiment-class object.}
+
+\item{lvl}{Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).}
+
+\item{B}{Number of permutations to perform.}
+
+\item{...}{Options for \code{\link{fitTimeSeries}}, except feature.}
+}
+\value{
+List of lists of matrices of time point intervals of interest, Difference in abundance area and p-value, fit, area permutations.
+
+A list of lists for which each includes:
+\itemize{
+ \item{timeIntervals - Matrix of time point intervals of interest, area of differential abundance, and pvalue.}
+ \item{data - Data frame of abundance, class indicator, time, and id input.}
+ \item{fit - Data frame of fitted values of the difference in abundance, standard error estimates and timepoints interpolated over.}
+ \item{perm - Differential abundance area estimates for each permutation.}
+ \item{call - Function call.}
+}
+}
+\description{
+Calculate time intervals of significant differential abundance over all
+bacteria of a particularly specified level (lvl). If not lvl is specified,
+all OTUs are analyzed. Warning, function can take a while
+}
+\examples{
+
+data(mouseData)
+res = fitMultipleTimeSeries(obj=mouseData,lvl='phylum',class="status",
+ id="mouseID",time="relativeTime",B=1)
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitSSTimeSeries}} \code{\link{fitTimeSeries}}
+}
+
diff --git a/man/fitPA.Rd b/man/fitPA.Rd
new file mode 100644
index 0000000..28dde21
--- /dev/null
+++ b/man/fitPA.Rd
@@ -0,0 +1,45 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitPA.R
+\name{fitPA}
+\alias{fitPA}
+\title{Wrapper to run fisher's test on presence/absence of a feature.}
+\usage{
+fitPA(obj, cl, thres = 0, adjust.method = "fdr", cores = 1, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with a count matrix, or a simple count
+matrix.}
+
+\item{cl}{Group comparison}
+
+\item{thres}{Threshold for defining presence/absence.}
+
+\item{adjust.method}{Method to adjust p-values by. Default is "FDR". Options
+include "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", "fdr",
+"none". See \code{\link{p.adjust}} for more details.}
+
+\item{cores}{Number of cores to use.}
+
+\item{...}{Extra parameters for makeCluster}
+}
+\value{
+Matrix of odds ratios, p-values, lower and upper confidence intervals
+}
+\description{
+This function returns a data frame of p-values, odds ratios, lower and upper
+confidence limits for every row of a matrix.
+}
+\examples{
+
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+lungTrim = lungTrim[-which(rowSums(MRcounts(lungTrim)>0)<20),]
+res = fitPA(lungTrim,pData(lungTrim)$SmokingStatus);
+head(res)
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitZig}} \code{\link{fitDO}} \code{\link{fitMeta}}
+}
+
diff --git a/man/fitSSTimeSeries.Rd b/man/fitSSTimeSeries.Rd
new file mode 100644
index 0000000..8292fd0
--- /dev/null
+++ b/man/fitSSTimeSeries.Rd
@@ -0,0 +1,73 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{fitSSTimeSeries}
+\alias{fitSSTimeSeries}
+\title{Discover differentially abundant time intervals using SS-Anova}
+\usage{
+fitSSTimeSeries(obj, formula, feature, class, time, id, lvl = NULL,
+ include = c("class", "time:class"), C = 0, B = 1000, norm = TRUE,
+ log = TRUE, sl = 1000, ...)
+}
+\arguments{
+\item{obj}{metagenomeSeq MRexperiment-class object.}
+
+\item{formula}{Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.}
+
+\item{feature}{Name or row of feature of interest.}
+
+\item{class}{Name of column in phenoData of MRexperiment-class object for class memberhip.}
+
+\item{time}{Name of column in phenoData of MRexperiment-class object for relative time.}
+
+\item{id}{Name of column in phenoData of MRexperiment-class object for sample id.}
+
+\item{lvl}{Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).}
+
+\item{include}{Parameters to include in prediction.}
+
+\item{C}{Value for which difference function has to be larger or smaller than (default 0).}
+
+\item{B}{Number of permutations to perform}
+
+\item{norm}{When aggregating counts to normalize or not.}
+
+\item{log}{Log2 transform.}
+
+\item{sl}{Scaling value.}
+
+\item{...}{Options for ssanova}
+}
+\value{
+List of matrix of time point intervals of interest, Difference in abundance area and p-value, fit, area permutations, and call.
+
+A list of objects including:
+\itemize{
+ \item{timeIntervals - Matrix of time point intervals of interest, area of differential abundance, and pvalue.}
+ \item{data - Data frame of abundance, class indicator, time, and id input.}
+ \item{fit - Data frame of fitted values of the difference in abundance, standard error estimates and timepoints interpolated over.}
+ \item{perm - Differential abundance area estimates for each permutation.}
+ \item{call - Function call.}
+}
+}
+\description{
+Calculate time intervals of interest using SS-Anova fitted models.
+Fitting is performed uses Smoothing Spline ANOVA (SS-Anova) to find interesting intervals of time.
+Given observations at different time points for two groups, fitSSTimeSeries
+calculates a function that models the difference in abundance between two
+groups across all time. Using permutations we estimate a null distribution
+of areas for the time intervals of interest and report significant intervals of time.
+Use of the function for analyses should cite:
+"Finding regions of interest in high throughput genomics data using smoothing splines"
+Talukder H, Paulson JN, Bravo HC. (In preparation)
+}
+\examples{
+
+data(mouseData)
+res = fitSSTimeSeries(obj=mouseData,feature="Actinobacteria",
+ class="status",id="mouseID",time="relativeTime",lvl='class',B=2)
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{ssFit}} \code{\link{ssIntervalCandidate}} \code{\link{ssPerm}} \code{\link{ssPermAnalysis}} \code{\link{plotTimeSeries}}
+}
+
diff --git a/man/fitTimeSeries.Rd b/man/fitTimeSeries.Rd
new file mode 100644
index 0000000..c2d8f35
--- /dev/null
+++ b/man/fitTimeSeries.Rd
@@ -0,0 +1,68 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{fitTimeSeries}
+\alias{fitTimeSeries}
+\title{Discover differentially abundant time intervals}
+\usage{
+fitTimeSeries(obj, formula, feature, class, time, id, method = c("ssanova"),
+ lvl = NULL, include = c("class", "time:class"), C = 0, B = 1000,
+ norm = TRUE, log = TRUE, sl = 1000, ...)
+}
+\arguments{
+\item{obj}{metagenomeSeq MRexperiment-class object.}
+
+\item{formula}{Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.}
+
+\item{feature}{Name or row of feature of interest.}
+
+\item{class}{Name of column in phenoData of MRexperiment-class object for class memberhip.}
+
+\item{time}{Name of column in phenoData of MRexperiment-class object for relative time.}
+
+\item{id}{Name of column in phenoData of MRexperiment-class object for sample id.}
+
+\item{method}{Method to estimate time intervals of differentially abundant bacteria (only ssanova method implemented currently).}
+
+\item{lvl}{Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).}
+
+\item{include}{Parameters to include in prediction.}
+
+\item{C}{Value for which difference function has to be larger or smaller than (default 0).}
+
+\item{B}{Number of permutations to perform.}
+
+\item{norm}{When aggregating counts to normalize or not.}
+
+\item{log}{Log2 transform.}
+
+\item{sl}{Scaling value.}
+
+\item{...}{Options for ssanova}
+}
+\value{
+List of matrix of time point intervals of interest, Difference in abundance area and p-value, fit, area permutations, and call.
+
+A list of objects including:
+\itemize{
+ \item{timeIntervals - Matrix of time point intervals of interest, area of differential abundance, and pvalue.}
+ \item{data - Data frame of abundance, class indicator, time, and id input.}
+ \item{fit - Data frame of fitted values of the difference in abundance, standard error estimates and timepoints interpolated over.}
+ \item{perm - Differential abundance area estimates for each permutation.}
+ \item{call - Function call.}
+}
+}
+\description{
+Calculate time intervals of significant differential abundance.
+Currently only one method is implemented (ssanova). fitSSTimeSeries is called with method="ssanova".
+}
+\examples{
+
+data(mouseData)
+res = fitTimeSeries(obj=mouseData,feature="Actinobacteria",
+ class="status",id="mouseID",time="relativeTime",lvl='class',B=2)
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitSSTimeSeries}} \code{\link{plotTimeSeries}}
+}
+
diff --git a/man/fitZeroLogNormal.Rd b/man/fitZeroLogNormal.Rd
new file mode 100644
index 0000000..cdb03e4
--- /dev/null
+++ b/man/fitZeroLogNormal.Rd
@@ -0,0 +1,43 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitZeroLogNormal.R
+\name{fitZeroLogNormal}
+\alias{fitZeroLogNormal}
+\title{Compute the log fold-change estimates for the zero-inflated log-normal model}
+\usage{
+fitZeroLogNormal(obj, mod, coef = 2, szero = TRUE, spos = TRUE)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{mod}{The model for the count distribution.}
+
+\item{coef}{Coefficient of interest to grab log fold-changes.}
+
+\item{szero}{TRUE/FALSE, shrink zero component parameters.}
+
+\item{spos}{TRUE/FALSE, shrink positive component parameters.}
+}
+\value{
+A list of objects including:
+\itemize{
+ \item{logFC - the log fold-change estimates}
+ \item{adjFactor - the adjustment factor based on the zero component}
+ \item{se - standard error estimates}
+ \item{fitln - parameters from the log-normal fit}
+ \item{fitzero - parameters from the logistic fit}
+ \item{zeroRidge - output from the ridge regression}
+ \item{posRidge - output from the ridge regression}
+ \item{tauPos - estimated tau^2 for positive component}
+ \item{tauZero - estimated tau^2 for zero component}
+ \item{exclude - features to exclude for various reasons, e.g. all zeros}
+ \item{zeroExclude - features to exclude for various reasons, e.g. all zeros}
+}
+}
+\description{
+Run the zero-inflated log-normal model given a MRexperiment object
+and model matrix. Not for the average user, assumes structure of the model matrix.
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitFeatureModel}}
+}
+
diff --git a/man/fitZig.Rd b/man/fitZig.Rd
new file mode 100644
index 0000000..3e965b4
--- /dev/null
+++ b/man/fitZig.Rd
@@ -0,0 +1,75 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitZig.R
+\name{fitZig}
+\alias{fitZig}
+\title{Computes the weighted fold-change estimates and t-statistics.}
+\usage{
+fitZig(obj, mod, zeroMod = NULL, useCSSoffset = TRUE,
+ control = zigControl(), useMixedModel = FALSE, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{mod}{The model for the count distribution.}
+
+\item{zeroMod}{The zero model, the model to account for the change in the
+number of OTUs observed as a linear effect of the depth of coverage.}
+
+\item{useCSSoffset}{Boolean, whether to include the default scaling
+parameters in the model or not.}
+
+\item{control}{The settings for fitZig.}
+
+\item{useMixedModel}{Estimate the correlation between duplicate
+features or replicates using duplicateCorrelation.}
+
+\item{...}{Additional parameters for duplicateCorrelation.}
+}
+\value{
+A list of objects including:
+\itemize{
+ \item{call - the call made to fitZig}
+ \item{fit - 'MLArrayLM' Limma object of the weighted fit}
+ \item{countResiduals - standardized residuals of the fit}
+ \item{z - matrix of the posterior probabilities}
+ \item{eb - output of eBayes, moderated t-statistics, moderated F-statistics, etc}
+ \item{taxa - vector of the taxa names}
+ \item{counts - the original count matrix input}
+ \item{zeroMod - the zero model matrix}
+ \item{zeroCoef - the zero model fitted results}
+ \item{stillActive - convergence}
+ \item{stillActiveNLL - nll at convergence}
+ \item{dupcor - correlation of duplicates}
+}
+}
+\description{
+Wrapper to actually run the Expectation-maximization algorithm and estimate
+$f_count$ fits. Maximum-likelihood estimates are approximated using the EM
+algorithm where we treat mixture membership $delta_ij = 1$ if $y_ij$ is
+generated from the zero point mass as latent indicator variables. The
+density is defined as $f_zig(y_ij = pi_j(S_j)*f_0(y_ij) +(1-pi_j (S_j)) *
+f_count(y_ij; mu_i, sigma_i^2)$. The log-likelihood in this extended model
+is: $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+pi_j(s_j)+(1-delta_ij) log (1-pi_j (s_j))$. The responsibilities are defined
+as $z_ij = pr(delta_ij=1 | data)$.
+}
+\examples{
+
+# This is a simple demonstration
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+k = which(rowSums(MRcounts(lungTrim)>0)<30)
+lungTrim = cumNorm(lungTrim)
+lungTrim = lungTrim[-k,]
+smokingStatus = pData(lungTrim)$SmokingStatus
+mod = model.matrix(~smokingStatus)
+# The maxit is not meant to be 1 - this is for demonstration/speed
+settings = zigControl(maxit=1,verbose=FALSE)
+fit = fitZig(obj = lungTrim,mod=mod,control=settings)
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{zigControl}}
+}
+
diff --git a/man/getCountDensity.Rd b/man/getCountDensity.Rd
new file mode 100644
index 0000000..6d26a07
--- /dev/null
+++ b/man/getCountDensity.Rd
@@ -0,0 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/getCountDensity.R
+\name{getCountDensity}
+\alias{getCountDensity}
+\title{Compute the value of the count density function from the count model
+residuals.}
+\usage{
+getCountDensity(residuals, log = FALSE)
+}
+\arguments{
+\item{residuals}{Residuals from the count model.}
+
+\item{log}{Whether or not we are calculating from a log-normal distribution.}
+}
+\value{
+Density values from the count model residuals.
+}
+\description{
+Calculate density values from a normal: $f(x) = 1/(sqrt (2 pi ) sigma )
+e^-((x - mu )^2/(2 sigma^2))$. Maximum-likelihood estimates are
+approximated using the EM algorithm where we treat mixture membership
+$deta_ij$ = 1 if $y_ij$ is generated from the zero point mass as latent
+indicator variables. The density is defined as $f_zig(y_ij = pi_j(S_j) cdot
+f_0(y_ij) +(1-pi_j (S_j))cdot f_count(y_ij;mu_i,sigma_i^2)$. The
+log-likelihood in this extended model is $(1-delta_ij) log
+f_count(y;mu_i,sigma_i^2 )+delta_ij log pi_j(s_j)+(1-delta_ij)log (1-pi_j
+(sj))$. The responsibilities are defined as $z_ij = pr(delta_ij=1 | data)$.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/getEpsilon.Rd b/man/getEpsilon.Rd
new file mode 100644
index 0000000..86b93ff
--- /dev/null
+++ b/man/getEpsilon.Rd
@@ -0,0 +1,31 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/getEpsilon.R
+\name{getEpsilon}
+\alias{getEpsilon}
+\title{Calculate the relative difference between iterations of the negative
+log-likelihoods.}
+\usage{
+getEpsilon(nll, nllOld)
+}
+\arguments{
+\item{nll}{Vector of size M with the current negative log-likelihoods.}
+
+\item{nllOld}{Vector of size M with the previous iterations negative
+log-likelihoods.}
+}
+\value{
+Vector of size M of the relative differences between the previous
+and current iteration nll.
+}
+\description{
+Maximum-likelihood estimates are approximated using the EM algorithm where
+we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+zero point mass as latent indicator variables. The log-likelihood in this
+extended model is $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+pi_j(s_j)+(1-delta_ij)log (1-pi_j (sj))$. The responsibilities are defined
+as $z_ij = pr(delta_ij=1 | data)$.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/getNegativeLogLikelihoods.Rd b/man/getNegativeLogLikelihoods.Rd
new file mode 100644
index 0000000..01159fb
--- /dev/null
+++ b/man/getNegativeLogLikelihoods.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/getNegativeLogLikelihoods.R
+\name{getNegativeLogLikelihoods}
+\alias{getNegativeLogLikelihoods}
+\title{Calculate the negative log-likelihoods for the various features given the
+residuals.}
+\usage{
+getNegativeLogLikelihoods(z, countResiduals, zeroResiduals)
+}
+\arguments{
+\item{z}{Matrix (m x n) of estimate responsibilities (probabilities that a
+count comes from a spike distribution at 0).}
+
+\item{countResiduals}{Residuals from the count model.}
+
+\item{zeroResiduals}{Residuals from the zero model.}
+}
+\value{
+Vector of size M of the negative log-likelihoods for the various
+features.
+}
+\description{
+Maximum-likelihood estimates are approximated using the EM algorithm where
+we treat mixture membership $delta_ij$ = 1 if $y_ij$ is generated from the
+zero point mass as latent indicator variables. The log-likelihood in this
+extended model is $(1-delta_ij) log f_count(y;mu_i,sigma_i^2 )+delta_ij log
+pi_j(s_j)+(1-delta_ij)log (1-pi_j (sj))$. The responsibilities are defined
+as $z_ij = pr(delta_ij=1 | data and current values)$.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/getPi.Rd b/man/getPi.Rd
new file mode 100644
index 0000000..0402a73
--- /dev/null
+++ b/man/getPi.Rd
@@ -0,0 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/getPi.R
+\name{getPi}
+\alias{getPi}
+\title{Calculate the mixture proportions from the zero model / spike mass model
+residuals.}
+\usage{
+getPi(residuals)
+}
+\arguments{
+\item{residuals}{Residuals from the zero model.}
+}
+\value{
+Mixture proportions for each sample.
+}
+\description{
+F(x) = 1 / (1 + exp(-(x-m)/s)) (the CDF of the logistic distribution).
+Provides the probability that a real-valued random variable X with a given
+probability distribution will be found at a value less than or equal to x.
+The output are the mixture proportions for the samples given the residuals
+from the zero model.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/getZ.Rd b/man/getZ.Rd
new file mode 100644
index 0000000..4b1aca2
--- /dev/null
+++ b/man/getZ.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/getZ.R
+\name{getZ}
+\alias{getZ}
+\title{Calculate the current Z estimate responsibilities (posterior probabilities)}
+\usage{
+getZ(z, zUsed, stillActive, nll, nllUSED)
+}
+\arguments{
+\item{z}{Matrix (m x n) of estimate responsibilities (probabilities that a
+count comes from a spike distribution at 0).}
+
+\item{zUsed}{Matrix (m x n) of estimate responsibilities (probabilities that
+a count comes from a spike distribution at 0) that are actually used
+(following convergence).}
+
+\item{stillActive}{A vector of size M booleans saying if a feature is still
+active or not.}
+
+\item{nll}{Vector of size M with the current negative log-likelihoods.}
+
+\item{nllUSED}{Vector of size M with the converged negative log-likelihoods.}
+}
+\value{
+A list of updated zUsed and nllUSED.
+}
+\description{
+Calculate the current Z estimate responsibilities (posterior probabilities)
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/isItStillActive.Rd b/man/isItStillActive.Rd
new file mode 100644
index 0000000..787bc95
--- /dev/null
+++ b/man/isItStillActive.Rd
@@ -0,0 +1,30 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/isItStillActive.R
+\name{isItStillActive}
+\alias{isItStillActive}
+\title{Function to determine if a feature is still active.}
+\usage{
+isItStillActive(eps, tol, stillActive, stillActiveNLL, nll)
+}
+\arguments{
+\item{eps}{Vector of size M (features) representing the relative difference between the new nll and old nll.}
+
+\item{tol}{The threshold tolerance for the difference}
+
+\item{stillActive}{A vector of size M booleans saying if a feature is still active or not.}
+
+\item{stillActiveNLL}{A vector of size M recording the negative log-likelihoods of the various features, updated for those still active.}
+
+\item{nll}{Vector of size M with the current negative log-likelihoods.}
+}
+\value{
+None.
+}
+\description{
+In the Expectation Maximization routine features posterior probabilities routinely converge based on a tolerance threshold. This function checks
+whether or not the feature's negative log-likelihood (measure of the fit) has changed or not.
+}
+\seealso{
+\code{\link{fitZig}}
+}
+
diff --git a/man/libSize-set.Rd b/man/libSize-set.Rd
new file mode 100644
index 0000000..23e2e87
--- /dev/null
+++ b/man/libSize-set.Rd
@@ -0,0 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\docType{methods}
+\name{libSize<-}
+\alias{libSize<-}
+\alias{libSize<-,MRexperiment,numeric-method}
+\title{Replace the library sizes in a MRexperiment object}
+\usage{
+\S4method{libSize}{MRexperiment,numeric}(object) <- value
+}
+\arguments{
+\item{object}{a \code{MRexperiment} object}
+
+\item{value}{vector of library sizes}
+}
+\value{
+vector library sizes
+}
+\description{
+Function to replace the scaling factors, aka the library sizes, of
+samples in a MRexperiment object.
+}
+\examples{
+
+data(lungData)
+head(libSize(lungData)<- rnorm(1))
+
+}
+\author{
+Joseph N. Paulson
+}
+
diff --git a/man/libSize.Rd b/man/libSize.Rd
new file mode 100644
index 0000000..f88ae8d
--- /dev/null
+++ b/man/libSize.Rd
@@ -0,0 +1,30 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\docType{methods}
+\name{libSize}
+\alias{libSize}
+\title{Access sample depth of coverage from MRexperiment object}
+\usage{
+libSize(object)
+}
+\arguments{
+\item{object}{a \code{MRexperiment} object}
+}
+\value{
+Library sizes
+}
+\description{
+Access the libSize vector represents the column (sample specific) sums of features,
+i.e. the total number of reads for a sample or depth of coverage. It is used by
+\code{\link{fitZig}}.
+}
+\examples{
+
+data(lungData)
+head(libSize(lungData))
+
+}
+\author{
+Joseph N. Paulson
+}
+
diff --git a/man/loadBiom.Rd b/man/loadBiom.Rd
new file mode 100644
index 0000000..dc0ca46
--- /dev/null
+++ b/man/loadBiom.Rd
@@ -0,0 +1,28 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/loadBiom.R
+\name{loadBiom}
+\alias{loadBiom}
+\title{Load objects organized in the Biom format.}
+\usage{
+loadBiom(file)
+}
+\arguments{
+\item{file}{The biom object filepath.}
+}
+\value{
+A MRexperiment object.
+}
+\description{
+Wrapper to load Biom formatted object.
+}
+\examples{
+
+#library(biomformat)
+rich_dense_file = system.file("extdata", "rich_dense_otu_table.biom", package = "biomformat")
+x = loadBiom(rich_dense_file)
+x
+}
+\seealso{
+\code{\link{loadMeta}} \code{\link{loadPhenoData}} \code{\link{newMRexperiment}} \code{\link{biom2MRexperiment}}
+}
+
diff --git a/man/loadMeta.Rd b/man/loadMeta.Rd
new file mode 100644
index 0000000..6a61b23
--- /dev/null
+++ b/man/loadMeta.Rd
@@ -0,0 +1,30 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/loadMeta.R
+\name{loadMeta}
+\alias{loadMeta}
+\alias{metagenomicLoader}
+\title{Load a count dataset associated with a study.}
+\usage{
+loadMeta(file, sep = "\\t")
+}
+\arguments{
+\item{file}{Path and filename of the actual data file.}
+
+\item{sep}{File delimiter.}
+}
+\value{
+A list with objects 'counts' and 'taxa'.
+}
+\description{
+Load a matrix of OTUs in a tab delimited format
+}
+\examples{
+
+dataDirectory <- system.file("extdata", package="metagenomeSeq")
+lung = loadMeta(file.path(dataDirectory,"CHK_NAME.otus.count.csv"))
+
+}
+\seealso{
+\code{\link{loadPhenoData}}
+}
+
diff --git a/man/loadMetaQ.Rd b/man/loadMetaQ.Rd
new file mode 100644
index 0000000..8869e95
--- /dev/null
+++ b/man/loadMetaQ.Rd
@@ -0,0 +1,27 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/loadMetaQ.R
+\name{loadMetaQ}
+\alias{loadMetaQ}
+\alias{qiimeLoader}
+\title{Load a count dataset associated with a study set up in a Qiime format.}
+\usage{
+loadMetaQ(file)
+}
+\arguments{
+\item{file}{Path and filename of the actual data file.}
+}
+\value{
+An list with 'counts' containing the count data, 'taxa' containing the otu annotation, and 'otus'.
+}
+\description{
+Load a matrix of OTUs in Qiime's format
+}
+\examples{
+
+# see vignette
+
+}
+\seealso{
+\code{\link{loadMeta}} \code{\link{loadPhenoData}}
+}
+
diff --git a/man/loadPhenoData.Rd b/man/loadPhenoData.Rd
new file mode 100644
index 0000000..ddfa8cc
--- /dev/null
+++ b/man/loadPhenoData.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/loadPhenoData.R
+\name{loadPhenoData}
+\alias{loadPhenoData}
+\alias{phenoData}
+\title{Load a clinical/phenotypic dataset associated with a study.}
+\usage{
+loadPhenoData(file, tran = TRUE, sep = "\\t")
+}
+\arguments{
+\item{file}{Path and filename of the actual clinical file.}
+
+\item{tran}{Boolean. If the covariates are along the columns and samples
+along the rows, then tran should equal TRUE.}
+
+\item{sep}{The separator for the file.}
+}
+\value{
+The metadata as a dataframe.
+}
+\description{
+Load a matrix of metadata associated with a study.
+}
+\examples{
+
+dataDirectory <- system.file("extdata", package="metagenomeSeq")
+clin = loadPhenoData(file.path(dataDirectory,"CHK_clinical.csv"),tran=TRUE)
+
+}
+\seealso{
+\code{\link{loadMeta}}
+}
+
diff --git a/man/lungData.Rd b/man/lungData.Rd
new file mode 100644
index 0000000..d9cbd94
--- /dev/null
+++ b/man/lungData.Rd
@@ -0,0 +1,12 @@
+\name{lungData}
+\docType{data}
+\alias{lungData}
+
+\title{OTU abundance matrix of samples from a smoker/non-smoker study}
+\description{This is a list with a matrix of OTU counts,otu names, taxa annotations for each OTU, and phenotypic data. Samples along the columns and OTUs along the rows.}
+\value{
+MRexperiment-class object of 16S lung samples.
+}
+\usage{lungData}
+\format{A list of OTU matrix, taxa, otus, and phenotypes}
+\references{http://www.ncbi.nlm.nih.gov/pubmed/21680950}
\ No newline at end of file
diff --git a/man/makeLabels.Rd b/man/makeLabels.Rd
new file mode 100644
index 0000000..322bbc6
--- /dev/null
+++ b/man/makeLabels.Rd
@@ -0,0 +1,27 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/misc.R
+\name{makeLabels}
+\alias{makeLabels}
+\title{Function to make labels simpler}
+\usage{
+makeLabels(x = "samples", y = "abundance", norm, log)
+}
+\arguments{
+\item{x}{string for the x-axis}
+
+\item{y}{string for the y-axis}
+
+\item{norm}{is the data normalized?}
+
+\item{log}{is the data logged?}
+}
+\value{
+vector of x,y labels
+}
+\description{
+Beginning to transition to better axes for plots
+}
+\examples{
+metagenomeSeq::makeLabels(norm=TRUE,log=TRUE)
+}
+
diff --git a/man/mergeMRexperiments.Rd b/man/mergeMRexperiments.Rd
new file mode 100644
index 0000000..8dd56bf
--- /dev/null
+++ b/man/mergeMRexperiments.Rd
@@ -0,0 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/mergeMRexperiments.R
+\name{mergeMRexperiments}
+\alias{mergeMRexperiments}
+\title{Merge two MRexperiment objects together}
+\usage{
+mergeMRexperiments(x, y)
+}
+\arguments{
+\item{x}{MRexperiment-class object 1.}
+
+\item{y}{MRexperiment-class object 2.}
+}
+\value{
+Merged MRexperiment-class object.
+}
+\description{
+This function will take two MRexperiment objects and merge them together finding common
+OTUs. If there are OTUs not found in one of the two MRexperiments then a message will
+announce this and values will be coerced to zero for the second table.
+}
+\examples{
+data(mouseData)
+newobj = mergeMRexperiments(mouseData,mouseData)
+newobj
+
+# let me know if people are interested in an option to merge by keys instead of row names.
+data(lungData)
+newobj = mergeMRexperiments(mouseData,lungData)
+newobj
+}
+
diff --git a/man/mergeTable.Rd b/man/mergeTable.Rd
new file mode 100644
index 0000000..d852ad6
--- /dev/null
+++ b/man/mergeTable.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/mergeMRexperiments.R
+\name{mergeTable}
+\alias{mergeTable}
+\title{Merge two tables}
+\usage{
+mergeTable(x, y)
+}
+\arguments{
+\item{x}{Table 1.}
+
+\item{y}{Table 2.}
+}
+\value{
+Merged table
+}
+\description{
+Merge two tables
+}
+
diff --git a/man/metagenomeSeq-deprecated.Rd b/man/metagenomeSeq-deprecated.Rd
new file mode 100644
index 0000000..273b45c
--- /dev/null
+++ b/man/metagenomeSeq-deprecated.Rd
@@ -0,0 +1,30 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/deprecated_metagenomeSeq_function.R
+\docType{package}
+\name{metagenomeSeq-deprecated}
+\alias{deprecated_metagenomeSeq_function}
+\alias{fitMeta}
+\alias{load_biom}
+\alias{load_meta}
+\alias{load_metaQ}
+\alias{load_phenoData}
+\alias{metagenomeSeq-deprecated}
+\alias{metagenomeSeq-deprecated-package}
+\title{Depcrecated functions in the metagenomeSeq package.}
+\usage{
+deprecated_metagenomeSeq_function(x, value, ...)
+}
+\arguments{
+\item{x}{For assignment operators, the object that will undergo a replacement
+(object inside parenthesis).}
+
+\item{value}{For assignment operators, the value to replace with
+(the right side of the assignment).}
+
+\item{...}{For functions other than assignment operators,
+parameters to be passed to the modern version of the function (see table).}
+}
+\description{
+These functions may be removed completely in the next release.
+}
+
diff --git a/man/metagenomeSeq-package.Rd b/man/metagenomeSeq-package.Rd
new file mode 100644
index 0000000..de4416d
--- /dev/null
+++ b/man/metagenomeSeq-package.Rd
@@ -0,0 +1,21 @@
+\name{metagenomeSeq-package}
+\docType{package}
+\alias{metagenomeSeq}
+\alias{metagenomeSeq-package}
+\title{Statistical analysis for sparse high-throughput sequencing}
+\description{
+metagenomeSeq is designed to determine features (be it Operational Taxanomic Unit (OTU), species, etc.) that are differentially abundant between two or more groups of multiple samples. metagenomeSeq is designed to address the effects of both normalization and under-sampling of microbial communities on disease association detection and the testing of feature correlations.
+
+A user's guide is available, and can be opened by typing \code{vignette("metagenomeSeq")}
+
+The metagenomeSeq package implements novel normalization and statistical methodology in the following papers.
+}
+
+\author{
+Paulson, JN <jpaulson at umiacs.umd.edu>; Pop, M; Corrada Bravo, H
+}
+
+\references{
+Paulson, Joseph N., O. Colin Stine, Hector Corrada Bravo, and Mihai Pop. "Differential abundance analysis for microbial marker-gene surveys." Nature methods (2013).
+}
+\keyword{package}
diff --git a/man/mouseData.Rd b/man/mouseData.Rd
new file mode 100644
index 0000000..87a77dc
--- /dev/null
+++ b/man/mouseData.Rd
@@ -0,0 +1,12 @@
+\name{mouseData}
+\docType{data}
+\alias{mouseData}
+
+\title{OTU abundance matrix of mice samples from a diet longitudinal study}
+\description{This is a list with a matrix of OTU counts, taxa annotations for each OTU, otu names, and vector of phenotypic data. Samples along the columns and OTUs along the rows.}
+\value{
+MRexperiment-class object of 16S mouse samples.
+}
+\usage{mouseData}
+\format{A list of OTU matrix, taxa, otus, and phenotypes}
+\references{http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2894525/}
\ No newline at end of file
diff --git a/man/newMRexperiment.Rd b/man/newMRexperiment.Rd
new file mode 100644
index 0000000..f9982e4
--- /dev/null
+++ b/man/newMRexperiment.Rd
@@ -0,0 +1,46 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\name{newMRexperiment}
+\alias{newMRexperiment}
+\title{Create a MRexperiment object}
+\usage{
+newMRexperiment(counts, phenoData = NULL, featureData = NULL,
+ libSize = NULL, normFactors = NULL)
+}
+\arguments{
+\item{counts}{A matrix or data frame of count data. The count data is
+representative of the number of reads annotated for a feature (be it gene,
+OTU, species, etc). Rows should correspond to features and columns to
+samples.}
+
+\item{phenoData}{An AnnotatedDataFrame with pertinent sample information.}
+
+\item{featureData}{An AnnotatedDataFrame with pertinent feature information.}
+
+\item{libSize}{libSize, library size, is the total number of reads for a
+particular sample.}
+
+\item{normFactors}{normFactors, the normalization factors used in either the
+model or as scaling factors of sample counts for each particular sample.}
+}
+\value{
+an object of class MRexperiment
+}
+\description{
+This function creates a MRexperiment object from a matrix or data frame of
+count data.
+}
+\details{
+See \code{\link{MRexperiment-class}} and \code{eSet} (from the Biobase
+package) for the meaning of the various slots.
+}
+\examples{
+
+cnts = matrix(abs(rnorm(1000)),nc=10)
+obj <- newMRexperiment(cnts)
+
+}
+\author{
+Joseph N Paulson
+}
+
diff --git a/man/normFactors-set.Rd b/man/normFactors-set.Rd
new file mode 100644
index 0000000..5018601
--- /dev/null
+++ b/man/normFactors-set.Rd
@@ -0,0 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\docType{methods}
+\name{normFactors<-}
+\alias{normFactors<-}
+\alias{normFactors<-,MRexperiment,numeric-method}
+\title{Replace the normalization factors in a MRexperiment object}
+\usage{
+\S4method{normFactors}{MRexperiment,numeric}(object) <- value
+}
+\arguments{
+\item{object}{a \code{MRexperiment} object}
+
+\item{value}{vector of normalization scaling factors}
+}
+\value{
+Normalization scaling factors
+}
+\description{
+Function to replace the scaling factors, aka the normalization factors, of
+samples in a MRexperiment object.
+}
+\examples{
+
+data(lungData)
+head(normFactors(lungData)<- rnorm(1))
+
+}
+\author{
+Joseph N. Paulson
+}
+
diff --git a/man/normFactors.Rd b/man/normFactors.Rd
new file mode 100644
index 0000000..1214d3c
--- /dev/null
+++ b/man/normFactors.Rd
@@ -0,0 +1,29 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\docType{methods}
+\name{normFactors}
+\alias{normFactors}
+\title{Access the normalization factors in a MRexperiment object}
+\usage{
+normFactors(object)
+}
+\arguments{
+\item{object}{a \code{MRexperiment} object}
+}
+\value{
+Normalization scaling factors
+}
+\description{
+Function to access the scaling factors, aka the normalization factors, of
+samples in a MRexperiment object.
+}
+\examples{
+
+data(lungData)
+head(normFactors(lungData))
+
+}
+\author{
+Joseph N. Paulson
+}
+
diff --git a/man/plotBubble.Rd b/man/plotBubble.Rd
new file mode 100644
index 0000000..4a02ddd
--- /dev/null
+++ b/man/plotBubble.Rd
@@ -0,0 +1,55 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotBubble.R
+\name{plotBubble}
+\alias{plotBubble}
+\title{Basic plot of binned vectors.}
+\usage{
+plotBubble(yvector, xvector, sigvector = NULL, nbreaks = 10,
+ ybreak = quantile(yvector, p = seq(0, 1, length.out = nbreaks)),
+ xbreak = quantile(xvector, p = seq(0, 1, length.out = nbreaks)),
+ scale = 1, local = FALSE, ...)
+}
+\arguments{
+\item{yvector}{A vector of values represented along y-axis.}
+
+\item{xvector}{A vector of values represented along x-axis.}
+
+\item{sigvector}{A vector of the names of significant features (names should match x/yvector).}
+
+\item{nbreaks}{Number of bins to break yvector and xvector into.}
+
+\item{ybreak}{The values to break the yvector at.}
+
+\item{xbreak}{The values to break the xvector at.}
+
+\item{scale}{Scaling of circle bin sizes.}
+
+\item{local}{Boolean to shade by signficant bin numbers (TRUE) or overall proportion (FALSE).}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+A matrix of features along rows, and the group membership along columns.
+}
+\description{
+This function plots takes two vectors, calculates the contingency table and
+plots circles sized by the contingency table value. Optional significance vectors
+of the values significant will shade the circles by proportion of significance.
+}
+\examples{
+
+data(mouseData)
+mouseData = mouseData[which(rowSums(mouseData)>139),]
+sparsity = rowMeans(MRcounts(mouseData)==0)
+lor = log(fitPA(mouseData,cl=pData(mouseData)[,3])$oddsRatio)
+plotBubble(lor,sparsity,main="lor ~ sparsity")
+# Example 2
+x = runif(100000)
+y = runif(100000)
+plotBubble(y,x)
+
+}
+\seealso{
+\code{\link{plotMRheatmap}}
+}
+
diff --git a/man/plotClassTimeSeries.Rd b/man/plotClassTimeSeries.Rd
new file mode 100644
index 0000000..cc59e4a
--- /dev/null
+++ b/man/plotClassTimeSeries.Rd
@@ -0,0 +1,46 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{plotClassTimeSeries}
+\alias{plotClassTimeSeries}
+\title{Plot abundances by class}
+\usage{
+plotClassTimeSeries(res, formula, xlab = "Time", ylab = "Abundance",
+ color0 = "black", color1 = "red", include = c("1", "class",
+ "time:class"), ...)
+}
+\arguments{
+\item{res}{Output of fitTimeSeries function}
+
+\item{formula}{Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.}
+
+\item{xlab}{X-label.}
+
+\item{ylab}{Y-label.}
+
+\item{color0}{Color of samples from first group.}
+
+\item{color1}{Color of samples from second group.}
+
+\item{include}{Parameters to include in prediction.}
+
+\item{...}{Extra plotting arguments.}
+}
+\value{
+Plot for abundances of each class using a spline approach on estimated null model.
+}
+\description{
+Plot the abundance of values for each class using
+a spline approach on the estimated full model.
+}
+\examples{
+
+data(mouseData)
+res = fitTimeSeries(obj=mouseData,feature="Actinobacteria",
+ class="status",id="mouseID",time="relativeTime",lvl='class',B=10)
+plotClassTimeSeries(res,pch=21,bg=res$data$class,ylim=c(0,8))
+
+}
+\seealso{
+\code{\link{fitTimeSeries}}
+}
+
diff --git a/man/plotCorr.Rd b/man/plotCorr.Rd
new file mode 100644
index 0000000..7c210e6
--- /dev/null
+++ b/man/plotCorr.Rd
@@ -0,0 +1,40 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotCorr.R
+\name{plotCorr}
+\alias{plotCorr}
+\title{Basic correlation plot function for normalized or unnormalized counts.}
+\usage{
+plotCorr(obj, n, norm = TRUE, log = TRUE, fun = cor, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{n}{The number of features to plot. This chooses the "n" features with greatest variance.}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{fun}{Function to calculate pair-wise relationships. Default is pearson
+correlation}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+plotted correlation matrix
+}
+\description{
+This function plots a heatmap of the "n" features with greatest variance
+across rows.
+}
+\examples{
+
+data(mouseData)
+plotCorr(obj=mouseData,n=200,cexRow = 0.4,cexCol = 0.4,trace="none",dendrogram="none",
+ col = colorRampPalette(brewer.pal(9, "RdBu"))(50))
+
+}
+\seealso{
+\code{\link{cumNormMat}}
+}
+
diff --git a/man/plotFeature.Rd b/man/plotFeature.Rd
new file mode 100644
index 0000000..0643e3c
--- /dev/null
+++ b/man/plotFeature.Rd
@@ -0,0 +1,54 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotFeature.R
+\name{plotFeature}
+\alias{plotFeature}
+\title{Basic plot function of the raw or normalized data.}
+\usage{
+plotFeature(obj, otuIndex, classIndex, col = "black", sort = TRUE,
+ sortby = NULL, norm = TRUE, log = TRUE, sl = 1000, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{otuIndex}{The row to plot}
+
+\item{classIndex}{A list of the samples in their respective groups.}
+
+\item{col}{A vector to color samples by.}
+
+\item{sort}{Boolean, sort or not.}
+
+\item{sortby}{Default is sort by library size, alternative vector for sorting}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{sl}{Scaling factor - if MRexperiment and norm=TRUE.}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+counts and classindex
+}
+\description{
+This function plots the abundance of a particular OTU by class. The function
+is the typical manhattan plot of the abundances.
+}
+\examples{
+
+data(mouseData)
+classIndex=list(Western=which(pData(mouseData)$diet=="Western"))
+classIndex$BK=which(pData(mouseData)$diet=="BK")
+otuIndex = 8770
+
+par(mfrow=c(2,1))
+dates = pData(mouseData)$date
+plotFeature(mouseData,norm=FALSE,log=FALSE,otuIndex,classIndex,
+col=dates,sortby=dates,ylab="Raw reads")
+
+}
+\seealso{
+\code{\link{cumNorm}}
+}
+
diff --git a/man/plotGenus.Rd b/man/plotGenus.Rd
new file mode 100644
index 0000000..88b155a
--- /dev/null
+++ b/man/plotGenus.Rd
@@ -0,0 +1,60 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotGenus.R
+\name{plotGenus}
+\alias{genusPlot}
+\alias{plotGenus}
+\title{Basic plot function of the raw or normalized data.}
+\usage{
+plotGenus(obj, otuIndex, classIndex, norm = TRUE, log = TRUE,
+ no = 1:length(otuIndex), labs = TRUE, xlab = NULL, ylab = NULL,
+ jitter = TRUE, jitter.factor = 1, pch = 21, ...)
+}
+\arguments{
+\item{obj}{An MRexperiment object with count data.}
+
+\item{otuIndex}{A list of the otus with the same annotation.}
+
+\item{classIndex}{A list of the samples in their respective groups.}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{no}{Which of the otuIndex to plot.}
+
+\item{labs}{Whether to include group labels or not. (TRUE/FALSE)}
+
+\item{xlab}{xlabel for the plot.}
+
+\item{ylab}{ylabel for the plot.}
+
+\item{jitter}{Boolean to jitter the count data or not.}
+
+\item{jitter.factor}{Factor value for jitter}
+
+\item{pch}{Standard pch value for the plot command.}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+plotted data
+}
+\description{
+This function plots the abundance of a particular OTU by class. The function
+uses the estimated posterior probabilities to make technical zeros
+transparent.
+}
+\examples{
+
+data(mouseData)
+classIndex=list(controls=which(pData(mouseData)$diet=="BK"))
+classIndex$cases=which(pData(mouseData)$diet=="Western")
+otuIndex = grep("Strep",fData(mouseData)$family)
+otuIndex=otuIndex[order(rowSums(MRcounts(mouseData)[otuIndex,]),decreasing=TRUE)]
+plotGenus(mouseData,otuIndex,classIndex,no=1:2,xaxt="n",norm=FALSE,ylab="Strep normalized log(cpt)")
+
+}
+\seealso{
+\code{\link{cumNorm}}
+}
+
diff --git a/man/plotMRheatmap.Rd b/man/plotMRheatmap.Rd
new file mode 100644
index 0000000..a17f0c7
--- /dev/null
+++ b/man/plotMRheatmap.Rd
@@ -0,0 +1,46 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotMRheatmap.R
+\name{plotMRheatmap}
+\alias{plotMRheatmap}
+\title{Basic heatmap plot function for normalized counts.}
+\usage{
+plotMRheatmap(obj, n, norm = TRUE, log = TRUE, fun = sd, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{n}{The number of features to plot. This chooses the 'n' features of greatest positive statistic.}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{fun}{Function to select top 'n' features.}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+plotted matrix
+}
+\description{
+This function plots a heatmap of the 'n' features with greatest variance
+across rows (or other statistic).
+}
+\examples{
+
+data(mouseData)
+trials = pData(mouseData)$diet
+heatmapColColors=brewer.pal(12,"Set3")[as.integer(factor(trials))];
+heatmapCols = colorRampPalette(brewer.pal(9, "RdBu"))(50)
+#### version using sd
+plotMRheatmap(obj=mouseData,n=200,cexRow = 0.4,cexCol = 0.4,trace="none",
+ col = heatmapCols,ColSideColors = heatmapColColors)
+#### version using MAD
+plotMRheatmap(obj=mouseData,n=50,fun=mad,cexRow = 0.4,cexCol = 0.4,trace="none",
+ col = heatmapCols,ColSideColors = heatmapColColors)
+
+}
+\seealso{
+\code{\link{cumNormMat}}
+}
+
diff --git a/man/plotOTU.Rd b/man/plotOTU.Rd
new file mode 100644
index 0000000..c622766
--- /dev/null
+++ b/man/plotOTU.Rd
@@ -0,0 +1,55 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotOTU.R
+\name{plotOTU}
+\alias{plotOTU}
+\title{Basic plot function of the raw or normalized data.}
+\usage{
+plotOTU(obj, otu, classIndex, log = TRUE, norm = TRUE, jitter.factor = 1,
+ pch = 21, labs = TRUE, xlab = NULL, ylab = NULL, jitter = TRUE, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data.}
+
+\item{otu}{The row number/OTU to plot.}
+
+\item{classIndex}{A list of the samples in their respective groups.}
+
+\item{log}{Whether or not to log2 transform the counts - if MRexperiment object.}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{jitter.factor}{Factor value for jitter.}
+
+\item{pch}{Standard pch value for the plot command.}
+
+\item{labs}{Whether to include group labels or not. (TRUE/FALSE)}
+
+\item{xlab}{xlabel for the plot.}
+
+\item{ylab}{ylabel for the plot.}
+
+\item{jitter}{Boolean to jitter the count data or not.}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+Plotted values
+}
+\description{
+This function plots the abundance of a particular OTU by class. The function
+uses the estimated posterior probabilities to make technical zeros
+transparent.
+}
+\examples{
+
+data(mouseData)
+classIndex=list(controls=which(pData(mouseData)$diet=="BK"))
+classIndex$cases=which(pData(mouseData)$diet=="Western")
+# you can specify whether or not to normalize, and to what level
+plotOTU(mouseData,otu=9083,classIndex,norm=FALSE,main="9083 feature abundances")
+
+}
+\seealso{
+\code{\link{cumNorm}}
+}
+
diff --git a/man/plotOrd.Rd b/man/plotOrd.Rd
new file mode 100644
index 0000000..7a966c2
--- /dev/null
+++ b/man/plotOrd.Rd
@@ -0,0 +1,51 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotOrd.R
+\name{plotOrd}
+\alias{plotOrd}
+\title{Plot of either PCA or MDS coordinates for the distances of normalized or unnormalized counts.}
+\usage{
+plotOrd(obj, tran = TRUE, comp = 1:2, norm = TRUE, log = TRUE,
+ usePCA = TRUE, useDist = FALSE, distfun = stats::dist,
+ dist.method = "euclidian", n = NULL, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object or count matrix.}
+
+\item{tran}{Transpose the matrix.}
+
+\item{comp}{Which components to display}
+
+\item{norm}{Whether or not to normalize the counts - if MRexperiment object.}
+
+\item{log}{Whether or not to log2 the counts - if MRexperiment object.}
+
+\item{usePCA}{TRUE/FALSE whether to use PCA or MDS coordinates (TRUE is PCA).}
+
+\item{useDist}{TRUE/FALSE whether to calculate distances.}
+
+\item{distfun}{Distance function, default is stats::dist}
+
+\item{dist.method}{If useDist==TRUE, what method to calculate distances.}
+
+\item{n}{Number of features to make use of in calculating your distances.}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+coordinates
+}
+\description{
+This function plots the PCA / MDS coordinates for the "n" features of interest. Potentially uncovering batch
+effects or feature relationships.
+}
+\examples{
+
+data(mouseData)
+cl = pData(mouseData)[,3]
+plotOrd(mouseData,tran=TRUE,useDist=TRUE,pch=21,bg=factor(cl),usePCA=FALSE)
+
+}
+\seealso{
+\code{\link{cumNormMat}}
+}
+
diff --git a/man/plotRare.Rd b/man/plotRare.Rd
new file mode 100644
index 0000000..ed8f34a
--- /dev/null
+++ b/man/plotRare.Rd
@@ -0,0 +1,37 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plotRare.R
+\name{plotRare}
+\alias{plotRare}
+\title{Plot of rarefaction effect}
+\usage{
+plotRare(obj, cl = NULL, ...)
+}
+\arguments{
+\item{obj}{A MRexperiment object with count data or matrix.}
+
+\item{cl}{Vector of classes for various samples.}
+
+\item{...}{Additional plot arguments.}
+}
+\value{
+Library size and number of detected features
+}
+\description{
+This function plots the number of observed features vs. the depth of coverage.
+}
+\examples{
+
+data(mouseData)
+cl = factor(pData(mouseData)[,3])
+res = plotRare(mouseData,cl=cl,pch=21,bg=cl)
+tmp=lapply(levels(cl), function(lv) lm(res[,"ident"]~res[,"libSize"]-1, subset=cl==lv))
+for(i in 1:length(levels(cl))){
+ abline(tmp[[i]], col=i)
+}
+legend("topleft", c("Diet 1","Diet 2"), text.col=c(1,2),box.col=NA)
+
+}
+\seealso{
+\code{\link{plotOrd}}, \code{\link{plotMRheatmap}}, \code{\link{plotCorr}}, \code{\link{plotOTU}}, \code{\link{plotGenus}}
+}
+
diff --git a/man/plotTimeSeries.Rd b/man/plotTimeSeries.Rd
new file mode 100644
index 0000000..a569c4b
--- /dev/null
+++ b/man/plotTimeSeries.Rd
@@ -0,0 +1,41 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{plotTimeSeries}
+\alias{plotTimeSeries}
+\title{Plot difference function for particular bacteria}
+\usage{
+plotTimeSeries(res, C = 0, xlab = "Time",
+ ylab = "Difference in abundance",
+ main = "SS difference function prediction", ...)
+}
+\arguments{
+\item{res}{Output of fitTimeSeries function}
+
+\item{C}{Value for which difference function has to be larger or smaller than (default 0).}
+
+\item{xlab}{X-label.}
+
+\item{ylab}{Y-label.}
+
+\item{main}{Main label.}
+
+\item{...}{Extra plotting arguments.}
+}
+\value{
+Plot of difference in abundance for significant features.
+}
+\description{
+Plot the difference in abundance for significant features.
+}
+\examples{
+
+data(mouseData)
+res = fitTimeSeries(obj=mouseData,feature="Actinobacteria",
+ class="status",id="mouseID",time="relativeTime",lvl='class',B=10)
+plotTimeSeries(res)
+
+}
+\seealso{
+\code{\link{fitTimeSeries}}
+}
+
diff --git a/man/posteriorProbs.Rd b/man/posteriorProbs.Rd
new file mode 100644
index 0000000..17916bd
--- /dev/null
+++ b/man/posteriorProbs.Rd
@@ -0,0 +1,41 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\docType{methods}
+\name{posteriorProbs}
+\alias{posteriorProbs}
+\alias{posteriorProbs,MRexperiment-method}
+\title{Access the posterior probabilities that results from analysis}
+\usage{
+posteriorProbs(obj)
+}
+\arguments{
+\item{obj}{a \code{MRexperiment} object.}
+}
+\value{
+Matrix of posterior probabilities
+}
+\description{
+Accessing the posterior probabilities following a run through
+\code{\link{fitZig}}
+}
+\examples{
+
+# This is a simple demonstration
+data(lungData)
+k = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-k]
+k = which(rowSums(MRcounts(lungTrim)>0)<30)
+lungTrim = cumNorm(lungTrim)
+lungTrim = lungTrim[-k,]
+smokingStatus = pData(lungTrim)$SmokingStatus
+mod = model.matrix(~smokingStatus)
+# The maxit is not meant to be 1 - this is for demonstration/speed
+settings = zigControl(maxit=1,verbose=FALSE)
+fit = fitZig(obj = lungTrim,mod=mod,control=settings)
+head(posteriorProbs(lungTrim))
+
+}
+\author{
+Joseph N. Paulson
+}
+
diff --git a/man/returnAppropriateObj.Rd b/man/returnAppropriateObj.Rd
new file mode 100644
index 0000000..8356612
--- /dev/null
+++ b/man/returnAppropriateObj.Rd
@@ -0,0 +1,31 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/allClasses.R
+\name{returnAppropriateObj}
+\alias{returnAppropriateObj}
+\title{Check if MRexperiment or matrix and return matrix}
+\usage{
+returnAppropriateObj(obj, norm, log, sl = 1000)
+}
+\arguments{
+\item{obj}{a \code{MRexperiment} or \code{matrix} object}
+
+\item{norm}{return a normalized \code{MRexperiment} matrix}
+
+\item{log}{return a log transformed \code{MRexperiment} matrix}
+
+\item{sl}{scaling value}
+}
+\value{
+Matrix
+}
+\description{
+Function to check if object is a MRexperiment
+class or matrix
+}
+\examples{
+
+data(lungData)
+head(returnAppropriateObj(lungData,norm=FALSE,log=FALSE))
+
+}
+
diff --git a/man/ssFit.Rd b/man/ssFit.Rd
new file mode 100644
index 0000000..36774c5
--- /dev/null
+++ b/man/ssFit.Rd
@@ -0,0 +1,48 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{ssFit}
+\alias{ssFit}
+\title{smoothing-splines anova fit}
+\usage{
+ssFit(formula, abundance, class, time, id, include = c("class", "time:class"),
+ pd, ...)
+}
+\arguments{
+\item{formula}{Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.}
+
+\item{abundance}{Numeric vector of abundances.}
+
+\item{class}{Class membership (factor of group membership).}
+
+\item{time}{Time point vector of relative times (same length as abundance).}
+
+\item{id}{Sample / patient id.}
+
+\item{include}{Parameters to include in prediction.}
+
+\item{pd}{Extra variable.}
+
+\item{...}{Extra parameters for ssanova function (see ?ssanova).}
+}
+\value{
+\itemize{A list containing:
+\item data : Inputed data
+\item fit : The interpolated / fitted values for timePoints
+\item se : The standard error for CI intervals
+\item timePoints : The time points interpolated over
+}
+}
+\description{
+Sets up a data-frame with the feature abundance,
+class information, time points, sample ids and returns
+the fitted values for the fitted model.
+}
+\examples{
+
+# Not run
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssPermAnalysis}} \code{\link{ssPerm}} \code{\link{ssIntervalCandidate}}
+}
+
diff --git a/man/ssIntervalCandidate.Rd b/man/ssIntervalCandidate.Rd
new file mode 100644
index 0000000..373489d
--- /dev/null
+++ b/man/ssIntervalCandidate.Rd
@@ -0,0 +1,34 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{ssIntervalCandidate}
+\alias{ssIntervalCandidate}
+\title{calculate interesting time intervals}
+\usage{
+ssIntervalCandidate(fit, standardError, timePoints, positive = TRUE, C = 0)
+}
+\arguments{
+\item{fit}{SS-Anova fits.}
+
+\item{standardError}{SS-Anova se estimates.}
+
+\item{timePoints}{Time points interpolated over.}
+
+\item{positive}{Positive region or negative region (difference in abundance is positive/negative).}
+
+\item{C}{Value for which difference function has to be larger or smaller than (default 0).}
+}
+\value{
+Matrix of time point intervals of interest
+}
+\description{
+Calculates time intervals of interest using SS-Anova fitted confidence intervals.
+}
+\examples{
+
+# Not run
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssFit}} \code{\link{ssPerm}} \code{\link{ssPermAnalysis}}
+}
+
diff --git a/man/ssPerm.Rd b/man/ssPerm.Rd
new file mode 100644
index 0000000..fa860a3
--- /dev/null
+++ b/man/ssPerm.Rd
@@ -0,0 +1,28 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{ssPerm}
+\alias{ssPerm}
+\title{class permutations for smoothing-spline time series analysis}
+\usage{
+ssPerm(df, B)
+}
+\arguments{
+\item{df}{Data frame containing class membership and sample/patient id label.}
+
+\item{B}{Number of permutations.}
+}
+\value{
+A list of permutted class memberships
+}
+\description{
+Creates a list of permuted class memberships for the time series permuation tests.
+}
+\examples{
+
+# Not run
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssFit}} \code{\link{ssPermAnalysis}} \code{\link{ssIntervalCandidate}}
+}
+
diff --git a/man/ssPermAnalysis.Rd b/man/ssPermAnalysis.Rd
new file mode 100644
index 0000000..c121dee
--- /dev/null
+++ b/man/ssPermAnalysis.Rd
@@ -0,0 +1,41 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{ssPermAnalysis}
+\alias{ssPermAnalysis}
+\title{smoothing-splines anova fits for each permutation}
+\usage{
+ssPermAnalysis(data, formula, permList, intTimes, timePoints,
+ include = c("class", "time:class"), ...)
+}
+\arguments{
+\item{data}{Data used in estimation.}
+
+\item{formula}{Formula for ssanova. Of the form: abundance ~ ... where ... includes any pData slot value.}
+
+\item{permList}{A list of permutted class memberships}
+
+\item{intTimes}{Interesting time intervals.}
+
+\item{timePoints}{Time points to interpolate over.}
+
+\item{include}{Parameters to include in prediction.}
+
+\item{...}{Options for ssanova}
+}
+\value{
+A matrix of permutted area estimates for time intervals of interest.
+}
+\description{
+Calculates the fit for each permutation and estimates
+the area under the null (permutted) model for interesting time
+intervals of differential abundance.
+}
+\examples{
+
+# Not run
+
+}
+\seealso{
+\code{\link{cumNorm}} \code{\link{fitTimeSeries}} \code{\link{ssFit}} \code{\link{ssPerm}} \code{\link{ssIntervalCandidate}}
+}
+
diff --git a/man/trapz.Rd b/man/trapz.Rd
new file mode 100644
index 0000000..6321731
--- /dev/null
+++ b/man/trapz.Rd
@@ -0,0 +1,37 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{trapz}
+\alias{trapz}
+\title{Trapezoidal Integration}
+\usage{
+trapz(x, y)
+}
+\arguments{
+\item{x}{x-coordinates of points on the x-axis}
+
+\item{y}{y-coordinates of function values}
+}
+\value{
+Approximated integral of the function from 'min(x)' to 'max(x)'.
+ Or a matrix of the same size as 'y'.
+}
+\description{
+Compute the area of a function with values 'y' at the points 'x'.
+Function comes from the pracma package.
+}
+\examples{
+
+# Calculate the area under the sine curve from 0 to pi:
+ n <- 101
+ x <- seq(0, pi, len = n)
+ y <- sin(x)
+ trapz(x, y) #=> 1.999835504
+
+# Use a correction term at the boundary: -h^2/12*(f'(b)-f'(a))
+ h <- x[2] - x[1]
+ ca <- (y[2]-y[1]) / h
+ cb <- (y[n]-y[n-1]) / h
+ trapz(x, y) - h^2/12 * (cb - ca) #=> 1.999999969
+
+}
+
diff --git a/man/ts2MRexperiment.Rd b/man/ts2MRexperiment.Rd
new file mode 100644
index 0000000..f97eeae
--- /dev/null
+++ b/man/ts2MRexperiment.Rd
@@ -0,0 +1,46 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fitTimeSeries.R
+\name{ts2MRexperiment}
+\alias{ts2MRexperiment}
+\title{With a list of fitTimeSeries results, generate
+an MRexperiment that can be plotted with metavizr}
+\usage{
+ts2MRexperiment(obj, sampleNames = NULL, sampleDescription = "timepoints",
+ taxonomyLevels = NULL, taxonomyHierarchyRoot = "bacteria",
+ taxonomyDescription = "taxonomy", featuresOfInterest = NULL)
+}
+\arguments{
+\item{obj}{Output of fitMultipleTimeSeries}
+
+\item{sampleNames}{Sample names for plot}
+
+\item{sampleDescription}{Description of samples for plot axis label}
+
+\item{taxonomyLevels}{Feature names for plot}
+
+\item{taxonomyHierarchyRoot}{Root of feature hierarchy for MRexperiment}
+
+\item{taxonomyDescription}{Description of features for plot axis label}
+
+\item{featuresOfInterest}{The features to select from the fitMultipleTimeSeries output}
+}
+\value{
+MRexperiment that contains fitTimeSeries data, featureData, and phenoData
+}
+\description{
+With a list of fitTimeSeries results, generate
+an MRexperiment that can be plotted with metavizr
+}
+\examples{
+
+data(mouseData)
+res = fitMultipleTimeSeries(obj=mouseData,lvl='phylum',class="status",
+ id="mouseID",time="relativeTime",B=1)
+obj = ts2MRexperiment(res)
+obj
+
+}
+\seealso{
+\code{\link{fitTimeSeries}} \code{\link{fitMultipleTimeSeries}}
+}
+
diff --git a/man/uniqueFeatures.Rd b/man/uniqueFeatures.Rd
new file mode 100644
index 0000000..1b93f3f
--- /dev/null
+++ b/man/uniqueFeatures.Rd
@@ -0,0 +1,31 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/misc.R
+\name{uniqueFeatures}
+\alias{uniqueFeatures}
+\title{Table of features unique to a group}
+\usage{
+uniqueFeatures(obj, cl, nsamples = 0, nreads = 0)
+}
+\arguments{
+\item{obj}{Either a MRexperiment object or matrix.}
+
+\item{cl}{A vector representing assigning samples to a group.}
+
+\item{nsamples}{The minimum number of positive samples.}
+
+\item{nreads}{The minimum number of raw reads.}
+}
+\value{
+Table of features unique to a group
+}
+\description{
+Creates a table of features, their index, number of positive samples in a group,
+and the number of reads in a group. Can threshold features by a minimum no. of reads
+or no. of samples.
+}
+\examples{
+data(mouseData)
+head(uniqueFeatures(mouseData[1:100,],cl=pData(mouseData)[,3]))
+
+}
+
diff --git a/man/zigControl.Rd b/man/zigControl.Rd
new file mode 100644
index 0000000..944958e
--- /dev/null
+++ b/man/zigControl.Rd
@@ -0,0 +1,38 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/zigControl.R
+\name{zigControl}
+\alias{settings2}
+\alias{zigControl}
+\title{Settings for the fitZig function}
+\usage{
+zigControl(tol = 1e-04, maxit = 10, verbose = TRUE,
+ dfMethod = "modified", pvalMethod = "default")
+}
+\arguments{
+\item{tol}{The tolerance for the difference in negative log likelihood estimates for a feature to remain active.}
+
+\item{maxit}{The maximum number of iterations for the expectation-maximization algorithm.}
+
+\item{verbose}{Whether to display iterative step summary statistics or not.}
+
+\item{dfMethod}{Either 'default' or 'modified' (by responsibilities).}
+
+\item{pvalMethod}{Either 'default' or 'bootstrap'.}
+}
+\value{
+The value for the tolerance, maximum no. of iterations, and the verbose warning.
+}
+\description{
+Settings for the fitZig function
+}
+\note{
+\code{\link{fitZig}} makes use of zigControl.
+}
+\examples{
+control = zigControl(tol=1e-10,maxit=10,verbose=FALSE)
+
+}
+\seealso{
+\code{\link{fitZig}} \code{\link{cumNorm}} \code{\link{plotOTU}}
+}
+
diff --git a/tests/testthat.R b/tests/testthat.R
new file mode 100644
index 0000000..b82d29f
--- /dev/null
+++ b/tests/testthat.R
@@ -0,0 +1,17 @@
+library("testthat")
+packageVersion("metagenomeSeq")
+# As suggested for opt-out option on testing by users,
+# recommended by CRAN: http://adv-r.had.co.nz/Testing.html
+# Previously, best practice was to put all test files in inst/tests
+# and ensure that R CMD check ran them by putting the following code in tests/test-all.R:
+# >library(testthat)
+# >library(yourpackage)
+# >test_package("yourpackage")
+# Now, recommended practice is to put your tests in tests/testthat,
+# and ensure R CMD check runs them by putting the following code in tests/test-all.R:
+# >library(testthat)
+# >test_check("yourpackage")
+# The advantage of this new structure is that the user has control over whether or not tests are installed using the –install-tests parameter to
+# R CMD install, or INSTALL_opts = c(“–install-tests”) argument to install.packages(). I’m not sure why you wouldn’t want to install the tests,
+# but now you have the flexibility as requested by CRAN maintainers.
+test_check("metagenomeSeq")
diff --git a/tests/testthat/test-fitZig.R b/tests/testthat/test-fitZig.R
new file mode 100644
index 0000000..6a7f773
--- /dev/null
+++ b/tests/testthat/test-fitZig.R
@@ -0,0 +1,58 @@
+################################################################################
+# metagenomeSeq plot functions unit tests
+################################################################################
+library("metagenomeSeq"); library("testthat");
+
+test_that("`fitZig` function provides expected values prior to split", {
+ # uses the lung data and pre-calculated fitZig result from
+ # prior to this separation
+ data(lungData)
+ path = system.file("extdata", package = "metagenomeSeq")
+ fit = readRDS(file.path(path,"lungfit.rds"))
+
+ # run the same fit
+ k = grep("Extraction.Control",pData(lungData)$SampleType)
+ lungTrim = lungData[,-k]
+ k = which(rowSums(MRcounts(lungTrim)>0)<30)
+ lungTrim = cumNorm(lungTrim)
+ lungTrim = lungTrim[-k,]
+ smokingStatus = pData(lungTrim)$SmokingStatus
+ mod = model.matrix(~smokingStatus)
+ settings = zigControl(maxit=1,verbose=FALSE)
+ fit2 = fitZig(obj = lungTrim,mod=mod,control=settings)
+ # because the ordering is wrong
+ expect_failure(expect_equal(fit,fit2))
+ # check that they're equal now
+ fit2 = fit2[names(fit)]
+ expect_equal(fit,fit2)
+})
+
+test_that("`fitZig` function treats a matrix the same", {
+ # uses the lung data and pre-calculated fitZig result from
+ # prior to this separation
+ data(lungData)
+ path = system.file("extdata", package = "metagenomeSeq")
+ fit = readRDS(file.path(path,"lungfit.rds"))
+
+ # run the same fit
+ k = grep("Extraction.Control",pData(lungData)$SampleType)
+ lungTrim = lungData[,-k]
+ k = which(rowSums(MRcounts(lungTrim)>0)<30)
+ lungTrim = cumNorm(lungTrim)
+ lungTrim = lungTrim[-k,]
+ smokingStatus = pData(lungTrim)$SmokingStatus
+ scalingFactor = log2(normFactors(lungTrim)/1000 +1)
+ mod = model.matrix(~smokingStatus)
+ mod = cbind(mod,scalingFactor)
+ settings = zigControl(maxit=1,verbose=FALSE)
+ cnts = MRcounts(lungTrim)
+ fit2 = fitZig(obj = lungTrim,mod=mod,control=settings,useCSSoffset=FALSE)
+ fit2 = fit2[names(fit)]
+
+ # expecting failure because of call
+ expect_failure(expect_equal(fit,fit2))
+ fit2$call = "123"
+ fit$call = "123"
+ # check that they're equal
+ expect_equal(fit,fit2)
+})
diff --git a/tests/testthat/test-norm.R b/tests/testthat/test-norm.R
new file mode 100644
index 0000000..c1ca639
--- /dev/null
+++ b/tests/testthat/test-norm.R
@@ -0,0 +1,35 @@
+################################################################################
+# metagenomeSeq plot functions unit tests
+################################################################################
+library("metagenomeSeq"); library("testthat");
+
+test_that("`calcNormFactors` function provides expected values", {
+ # uses the lung data and pre-calculated normalization factors
+ # for various values of p
+ data(lungData)
+ point25 = c(29,2475,2198,836,722,1820,79,1171,1985,710,145,742,848,89,1981)
+ point = c(43,2475,2198,836,722,1820,119,1171,1985,710,145,742,848,89,1981)
+ point100=as.numeric(unlist(libSize(lungData[,1:15])))
+ expect_equal(as.numeric(unlist(calcNormFactors(lungData[,1:15]))),point)
+ expect_equal(as.numeric(unlist(calcNormFactors(lungData[,1:15],p=.25))),point25)
+ expect_equal(as.numeric(unlist(calcNormFactors(lungData[,1:15],p=1))),point100)
+})
+
+test_that("`cumNorm` returns the same object as defined in the package", {
+ data(lungData); data(mouseData)
+ expect_equal(cumNorm(mouseData,p=.5), mouseData)
+ expect_equal(cumNorm(lungData), lungData)
+})
+
+test_that("`cumNormStat` returns the correct value", {
+ data(lungData); data(mouseData);
+ expect_equal(cumNormStat(lungData),0.7014946)
+ expect_equal(cumNormStat(mouseData),0.5)
+})
+
+test_that("`cumNormStatFast` returns the correct value", {
+ data(lungData); data(mouseData);
+ expect_equal(cumNormStatFast(lungData),0.7014946)
+ expect_equal(cumNormStatFast(mouseData),0.5)
+})
+
diff --git a/vignettes/fitTimeSeries.Rnw b/vignettes/fitTimeSeries.Rnw
new file mode 100644
index 0000000..4ca891a
--- /dev/null
+++ b/vignettes/fitTimeSeries.Rnw
@@ -0,0 +1,278 @@
+%\VignetteIndexEntry{fitTimeSeries: differential abundance analysis through time or location}
+%\VignetteEngine{knitr::knitr}
+\documentclass[a4paper,11pt]{article}
+\usepackage{url}
+\usepackage{afterpage}
+\usepackage{hyperref}
+\usepackage{geometry}
+\usepackage{cite}
+\geometry{hmargin=2.5cm, vmargin=2.5cm}
+\usepackage{graphicx}
+\usepackage{courier}
+\bibliographystyle{unsrt}
+
+\begin{document}
+<<include=FALSE>>=
+require(knitr)
+opts_chunk$set(concordance=TRUE,tidy=TRUE)
+@
+
+\title{{\textbf{\texttt{fitTimeSeries}: Longitudinal differential abundance analysis for marker-gene surveys}}}
+\author{Hisham Talukder, Joseph N. Paulson, Hector Corrada Bravo\\[1em]\\ Applied Mathematics $\&$ Statistics, and Scientific Computation\\ Center for Bioinformatics and Computational Biology\\ University of Maryland, College Park\\[1em]\\ \texttt{jpaulson at umiacs.umd.edu}}
+\date{Modified: February 18, 2015. Compiled: \today}
+\maketitle
+\tableofcontents
+
+\newpage
+
+<<config,echo=FALSE>>=
+options(width = 65)
+options(continue=" ")
+options(warn=-1)
+set.seed(42)
+@
+
+\section{Introduction}
+\textbf{This is a vignette specifically for the fitTimeSeries function. For a full list of functions available in the package:
+help(package=metagenomeSeq). For more information about a particular function call: ?function.}
+
+Smoothing spline regression models~\cite{Wahba:1990} are commonly used to model longitudinal data and form the basis for methods used in a large number of applications ~\cite{networkped1,LongCrisp}. Specifically, an extension of the methodology called Smoothing-Spline ANOVA~\cite{Gu} is capable of directly estimating a smooth function of interest while incorporating other covariates in the model.
+
+A common approach to detect regions/times of interest in a genome or for differential abundance is to model differences between two groups with respect to the quantitative measurements as smooth functions and perform statistical inference on these models. In particular, widely used methods for region finding using DNA methylation data use local regression methods to estimate these smooth functions. An important aspect of these tools is their ability to incorporate sample characteristics [...]
+
+\subsection{Problem Formulation}
+We model data in the following form:
+$$
+Y_{itk}= f_i(t,x_{k})+e_{tk}
+$$
+where i represents group factor (diet, health status, etc.), $t$ represents series factor (for example, time or location), $k$ represents replicate observations, $x_{k}$ are covariates for sample $k$ (including an indicator for group
+membership $I\{k \in i\}$) and $e_{tk}$ are independent $N(0,\sigma^2)$ errors. We assume $f_i$ to be a smooth function, defined in an interval $[a,b]$, that can be parametric, non-parametric or a mixture of both.
+
+Our goal is to identify intervals where the absolute difference between two groups $\eta_d(t)=f_1(t, \cdot)-f_2(t, \cdot)$ is large, that is, regions, $R_{t_1,t_2}$, where:
+$R_{t_1,t_2}=
+\{t_1,t_2 \in x
+\textit{ such that }
+| \eta_{d}(x) |
+\ge C \}$
+and $C$ is a predefined constant threshold.
+
+To identify these areas we use hypothesis testing using the area $A_{t_1,t_2}=\int_{R_{t_1,t_2}}\eta_d(t) dt$ under the estimated function of $\eta_d(t)$ as a statistic with null and alternative hypotheses
+$$
+ H_0: A_{t_1,t_2} \le K
+$$
+$$
+ H_1: A_{t_1,t_2} > K
+$$
+with $K$ some fixed threshold.
+
+We employ a permutation-based method to calculate a null distribution of the area statistics $A_(t1,t2)$'s. To do this,
+the group-membership indicator variables (0-1 binary variable) are randomly permuted $B$ times, e.g., $B=1000$ and the
+method above is used to estimate the difference function $\eta_d^b$ (in this case simulating the null hypothesis) and an area
+statistics $A_(t1,t2)^b$ for each random permutation. Estimates $A_(t1,t2)^b$ are then used to construct an empirical
+estimate of $A_(t1,t2)$ under the null hypothesis. The observed area, $A_(t1,t2)^*$, is compared to the empirical null
+distribution to calculate a p-value. Figure 1 illustrates the relationship between $R_(t1,t2)$ and $A_(t1,t2)$. The key
+is to estimate regions $R_(t1,t2)$ where point-wise confidence intervals would be appropriate.
+
+\section{Data preparation}
+Data should be preprocessed and prepared in tab-delimited files. Measurements are stored in a matrix with samples along the
+columns and features along the rows. For example, given $m$ features and $n$ samples, the entries in a marker-gene or
+metagenomic count matrix \textbf{C} ($m, n$), $c_{ij}$, are the number of reads annotated for a particular feature $i$
+(whether it be OTU, species, genus, etc.) in sample $j$.
+Alternatively, the measurements could be some quantitative measurement such as methylation percentages or CD4 levels.\\
+
+\begin{center}
+$\bordermatrix{ &sample_1&sample_2&\ldots &sample_n\cr feature_1&c_{11} & c_{12} & \ldots & c_{1n}\cr feature_2& c_{21} & c_{22} & \ldots & c_{2n}\cr \vdots & \vdots & \vdots & \ddots & \vdots\cr feature_m & c_{m1} & c_{m2} &\ldots & c_{mn}}$
+\end{center}
+
+Data should be stored in a file (tab-delimited by default) with sample names along the first row, feature names in the first
+column and should be loaded into R and formatted into a MRexperiment object. To prepare the data please read the section on data preparation in the full metagenomeSeq vignette - \texttt{vignette("metagenomeSeq")}.
+
+\subsection{Example datasets}
+There is a time-series dataset included as an examples in the \texttt{metagenomeSeq} package. Data needs to be in a \texttt{MRexperiment} object format to normalize, run the statistical tests, and visualize. As an example, throughout the vignette we'll use the following datasets.
+To understand a \texttt{fitTimeSeries}'s usage or included data simply enter ?\texttt{fitTimeSeries}.
+
+<<requireMetagenomeSeq,warning=FALSE,message=FALSE>>=
+library(metagenomeSeq)
+library(gss)
+@
+
+\begin{enumerate}
+\setcounter{enumi}{1}
+\item Humanized gnotobiotic mouse gut \cite{ts_mouse}:
+Twelve germ-free adult male C57BL/6J mice were fed a low-fat, plant polysaccharide-rich diet. Each mouse was gavaged with healthy adult human fecal material. Following the fecal transplant, mice remained on the low-fat, plant polysacchaaride-rich diet for four weeks, following which a subset of 6 were switched to a high-fat and high-sugar diet for eight weeks. Fecal samples for each mouse went through PCR amplification of the bacterial 16S rRNA gene V2 region weekly. Details of experimen [...]
+\url{http://gordonlab.wustl.edu/TurnbaughSE_10_09/STM_2009.html}
+
+\end{enumerate}
+<<dataset2,tidy=FALSE>>=
+data(mouseData)
+mouseData
+@
+
+
+\subsection{Creating a \texttt{MRexperiment} object with other measurements}
+
+For a fitTimeSeries analysis a minimal MRexperiment-object is required and can be created using the function \texttt{newMRexperiment} which takes a count matrix described above and phenoData (annotated data frame).
+\texttt{Biobase} provides functions to create annotated data frames.
+
+<<createMRexperiment1>>=
+# Creating mock sample replicates
+sampleID = rep(paste("sample",1:10,sep=":"),times=20)
+# Creating mock class membership
+class = rep(c(rep(0,5),rep(1,5)),times=20)
+# Creating mock time
+time = rep(1:20,each=10)
+
+phenotypeData = AnnotatedDataFrame(data.frame(sampleID,class,time))
+# Creating mock abundances
+set.seed(1)
+# No difference
+measurement1 = rnorm(200,mean=100,sd=1)
+# Some difference
+measurement2 = rnorm(200,mean=100,sd=1)
+measurement2[1:5]=measurement2[1:5] + 100
+measurement2[11:15]=measurement2[11:15] + 100
+measurement2[21:25]=measurement2[21:25] + 50
+mat = rbind(measurement1,measurement2)
+colnames(mat) = 1:200
+mat[1:2,1:10]
+@
+
+If phylogenetic information exists for the features and there is a desire to aggregate
+measurements based on similar annotations choosing the featureData column name in lvl will aggregate measurements using the default parameters in the \texttt{aggregateByTaxonomy} function.
+
+<<createMRexperiment2>>=
+# This is an example of potential lvl's to aggregate by.
+data(mouseData)
+colnames(fData(mouseData))
+@
+
+Here we create the actual MRexperiment to run through fitTimeSeries.
+<<createMRexperiment3,tidy=FALSE>>=
+obj = newMRexperiment(counts=mat,phenoData=phenotypeData)
+obj
+res1 = fitTimeSeries(obj,feature=1,
+ class='class',time='time',id='sampleID',
+ B=10,norm=FALSE,log=FALSE)
+res2 = fitTimeSeries(obj,feature=2,
+ class='class',time='time',id='sampleID',
+ B=10,norm=FALSE,log=FALSE)
+
+
+classInfo = factor(res1$data$class)
+par(mfrow=c(3,1))
+plotClassTimeSeries(res1,pch=21,bg=classInfo)
+plotTimeSeries(res2)
+plotClassTimeSeries(res2,pch=21,bg=classInfo)
+@
+
+\section{Time series analysis}
+Implemented in the \texttt{fitTimeSeries} function is a method for calculating time intervals for which
+bacteria are differentially abundant. Fitting is performed using Smoothing Splines ANOVA (SS-ANOVA),
+as implemented in the \texttt{gss} package. Given observations at multiple time points for two groups
+the method calculates a function modeling the difference in abundance across all time. Using group membership permutations we
+estimate a null distribution of areas under the difference curve for the time intervals of interest and report significant intervals of time. Here we provide a real example from the microbiome of two groups of mice on different diets.
+
+The gnotobiotic mice come from a longitudinal study ideal for this type of analysis.
+We choose to perform our analysis at the class level and look for
+differentially abundant time intervals for "Actinobacteria".
+For demonstrations sake we perform only 10 permutations.
+
+If you find the method useful, please cite:
+"Longitudinal differential abundance analysis for marker-gene surveys"
+Talukder H*, Paulson JN*, Bravo HC. (Submitted)
+
+<<timeSeries>>=
+res = fitTimeSeries(obj=mouseData,lvl="class",feature="Actinobacteria",class="status",id="mouseID",time="relativeTime",B=10)
+
+# We observe a time period of differential abundance for "Actinobacteria"
+res$timeIntervals
+
+str(res)
+@
+
+For example, to test every class in the mouse dataset:
+<<timeSeriesAllClasses, tidy=FALSE>>=
+classes = unique(fData(mouseData)[,"class"])
+
+timeSeriesFits = lapply(classes,function(i){
+ fitTimeSeries(obj=mouseData,
+ feature=i,
+ class="status",
+ id="mouseID",
+ time="relativeTime",
+ lvl='class',
+ C=.3,# a cutoff for 'interesting'
+ B=1) # B is the number of permutations and should clearly not be 1
+ })
+names(timeSeriesFits) = classes
+
+# Removing classes of bacteria without a potentially
+# interesting time interval difference.
+timeSeriesFits = sapply(timeSeriesFits,function(i){i[[1]]})[-grep("No",timeSeriesFits)]
+
+# Naming the various interesting time intervals.
+for(i in 1:length(timeSeriesFits)){
+ rownames(timeSeriesFits[[i]]) =
+ paste(
+ paste(names(timeSeriesFits)[i]," interval",sep=""),
+ 1:nrow(timeSeriesFits[[i]]),sep=":"
+ )
+}
+
+# Merging into a table.
+timeSeriesFits = do.call(rbind,timeSeriesFits)
+
+# Correcting for multiple testing.
+pvalues = timeSeriesFits[,"p.value"]
+adjPvalues = p.adjust(pvalues,"bonferroni")
+timeSeriesFits = cbind(timeSeriesFits,adjPvalues)
+
+head(timeSeriesFits)
+@
+Please see the help page for \texttt{fitTimeSeries} for parameters. Note, only two groups can be compared to each other and the time parameter must be an actual value (currently no support for posix, etc.).
+
+\subsection{Paramaters}
+There are a number of parameters for the \texttt{fitTimeSeries} function. We list and provide a brief discussion below. For
+parameters influencing \texttt{ssanova}, \texttt{aggregateByTaxonomy}, \texttt{MRcounts} type ?function for more details.
+\begin{itemize}
+ \item obj - the metagenomeSeq MRexperiment-class object.
+ \item feature - Name or row of feature of interest.
+ \item class - Name of column in phenoData of MRexperiment-class object for class memberhip.
+ \item time - Name of column in phenoData of MRexperiment-class object for relative time.
+ \item id - Name of column in phenoData of MRexperiment-class object for sample id.
+ \item method - Method to estimate time intervals of differentially abundant bacteria (only ssanova method implemented currently).
+ \item lvl - Vector or name of column in featureData of MRexperiment-class object for aggregating counts (if not OTU level).
+ \item C - Value for which difference function has to be larger or smaller than (default 0).
+ \item B - Number of permutations to perform (default 1000)
+ \item norm - When aggregating counts to normalize or not. (see MRcounts)
+ \item log - Log2 transform. (see MRcounts)
+ \item sl - Scaling value. (see MRcounts)
+ \item ... - Options for ssanova
+
+\end{itemize}
+
+\section{Visualization of features}
+To help with visualization and analysis of datasets \texttt{metagenomeSeq} has several plotting functions to gain insight of the model fits and the differentially abundant time intervals using \texttt{plotClassTimeSeries} and \texttt{plotTimeSeries} on the result. More plots will be updated.
+<<timeSeriesPlotting>>=
+par(mfrow=c(2,1))
+plotClassTimeSeries(res,pch=21,
+ bg=res$data$class,ylim=c(0,8))
+plotTimeSeries(res)
+@
+
+\section{Summary}
+
+\texttt{metagenomeSeq}'s \texttt{fitTimeSeries} is a novel methodology for differential abundance testing of longitudinal data. If you make use of the statistical method please cite our paper. If you made use of the manual/software, please cite the manual/software!
+
+\subsection{Citing fitTimeSeries}
+<<cite>>=
+citation("metagenomeSeq")
+@
+
+\subsection{Session Info}
+<<sessionInfo>>=
+sessionInfo()
+@
+
+\bibliography{fitTimeSeries}
+\end{document}
diff --git a/vignettes/fitTimeSeries.bib b/vignettes/fitTimeSeries.bib
new file mode 100644
index 0000000..dde866d
--- /dev/null
+++ b/vignettes/fitTimeSeries.bib
@@ -0,0 +1,40 @@
+ at BOOK{Wahba:1990,
+ AUTHOR = {G. Wahba},
+ TITLE = {Spline Models in Statistics},
+ SERIES = {CBMS-NSF Regional Conference Series},
+ PUBLISHER = {SIAM},
+ ADDRESS = {Philadelphia, PA},
+ YEAR = {1990}
+}
+ at ARTICLE{longcrisp,
+ author = {H. Jaroslaw and N. Elena and M.L. Nan},
+ title = {LongCriSP: A test for Bumphunting in Longitudinal data},
+ journal = {Statistics in Medicine},
+ year = {2006},
+ volume = {26},
+ pages = {1383--1397}
+}
+ at article{bumphunter,
+ title={Bump hunting to identify differentially methylated regions in epigenetic epidemiology studies},
+ author={Jaffe, Andrew E and Murakami, Peter and Lee, Hwajin and Leek, Jeffrey T and Fallin, M Daniele and Feinberg, Andrew P and Irizarry, Rafael A},
+ journal={International journal of epidemiology},
+ volume={41},
+ number={1},
+ pages={200--209},
+ year={2012},
+ publisher={IEA}
+}
+ at book{networkped1,
+ title={Graph-based data analysis: tree-structured covariance estimation, prediction by regularized kernel estimation and aggregate database query processing for probabilistic inference},
+ author={Bravo, H{\'e}ctor Corrada},
+ year={2008},
+ publisher={ProQuest}
+}
+ at BOOK{Gu,
+ author = {C. Gu},
+ title = {Smoothing Spline Anova Model},
+ series = {Springer Series in Statistics},
+ publisher = {Springer},
+ year = {2002}
+}
+ at article{ts_mouse, title={The effect of diet on the human gut microbiome: a metagenomic analysis in humanized gnotobiotic mice.}, volume={1}, number={6}, journal={Science translational medicine}, publisher={NIH Public Access}, author={Turnbaugh, Peter J and Ridaura, Vanessa K and Faith, Jeremiah J and Rey, Federico E and Knight, Rob and Gordon, Jeffrey I}, year={2009}, pages={6ra14}}
\ No newline at end of file
diff --git a/vignettes/metagenomeSeq.Rnw b/vignettes/metagenomeSeq.Rnw
new file mode 100644
index 0000000..2ded587
--- /dev/null
+++ b/vignettes/metagenomeSeq.Rnw
@@ -0,0 +1,725 @@
+%\VignetteIndexEntry{metagenomeSeq: statistical analysis for sparse high-throughput sequencing}
+%\VignetteEngine{knitr::knitr}
+\documentclass[a4paper,11pt]{article}
+\usepackage{url}
+\usepackage{afterpage}
+\usepackage{hyperref}
+\usepackage{geometry}
+\usepackage{cite}
+\geometry{hmargin=2.5cm, vmargin=2.5cm}
+\usepackage{graphicx}
+\usepackage{courier}
+\bibliographystyle{unsrt}
+
+\begin{document}
+<<include=FALSE>>=
+require(knitr)
+opts_chunk$set(concordance=TRUE,tidy=TRUE)
+@
+
+\title{{\textbf{\texttt{metagenomeSeq}: Statistical analysis for sparse high-throughput sequencing}}}
+\author{Joseph Nathaniel Paulson\\[1em]\\ Applied Mathematics $\&$ Statistics, and Scientific Computation\\ Center for Bioinformatics and Computational Biology\\ University of Maryland, College Park\\[1em]\\ \texttt{jpaulson at umiacs.umd.edu}}
+\date{Modified: October 4, 2016. Compiled: \today}
+\maketitle
+\tableofcontents
+
+\newpage
+
+<<config,echo=FALSE>>=
+options(width = 60)
+options(continue=" ")
+options(warn=-1)
+set.seed(42)
+@
+
+\section{Introduction}
+
+\textbf{This is a vignette for pieces of an association study pipeline. For a full list of functions available in the package: help(package=metagenomeSeq). For more information about a particular function call: ?function.} See \textit{fitFeatureModel} for our latest development.
+
+
+To load the metagenomeSeq library:
+<<requireMetagenomeSeq,warning=FALSE,message=FALSE>>=
+library(metagenomeSeq)
+@
+
+Metagenomics is the study of genetic material targeted directly from an environmental community.
+Originally focused on exploratory and validation projects, these studies now focus on understanding the differences in microbial communities caused by phenotypic differences.
+Analyzing high-throughput sequencing data has been a challenge to researchers due to the unique biological and technological biases that are present in marker-gene survey data.
+
+ We present a R package, \texttt{metagenomeSeq}, that implements methods developed to account for previously unaddressed biases specific to high-throughput sequencing microbial marker-gene survey data. Our method implements a novel normalization technique and method to account for sparsity due to undersampling. Other methods include
+ White \textit{et al.}'s Metastats and Segata \textit{et al.}'s LEfSe. The first is a non-parametric permutation test on $t$-statistics and the second is a non-parametric Kruskal-Wallis test followed by subsequent wilcox rank-sum tests on subgroups to guard against positive discoveries of differential abundance driven by potential confounders - neither address normalization nor sparsity.
+
+This vignette describes the basic protocol when using \texttt{metagenomeSeq}.
+A normalization method able to control for biases in measurements across taxanomic features and a mixture model that implements a zero-inflated Gaussian distribution to account for varying depths of coverage are implemented.
+Using a linear model methodology, it is easy to include confounding sources of variability and interpret results.
+Additionally, visualization functions are provided to examine discoveries.
+
+The software was designed to determine features (be it Operational Taxanomic Unit (OTU), species, etc.) that are differentially abundant between two or more groups of multiple samples.
+The software was also designed to address the effects of both normalization and undersampling of microbial communities on disease association detection and testing of feature correlations.
+
+\begin{figure}
+\centerline{\includegraphics[width=.55\textwidth]{overview.pdf}}
+\caption{General overview. metagenomeSeq requires the user to convert their data into MRexperiment objects. Using those MRexperiment objects, one can normalize their data, run statistical tests (abundance or presence-absence), and visualize or save results.}
+\end{figure}
+
+\newpage
+\section{Data preparation}
+Microbial marker-gene sequence data is preprocessed and counts are algorithmically defined
+from project-specific sequence data by clustering reads according to read similarity.
+Given $m$ features and $n$ samples, the elements in a count matrix
+\textbf{C} ($m, n$), $c_{ij}$, are the number of reads annotated for a particular
+feature $i$ (whether it be OTU, species, genus, etc.) in sample $j$. \\
+
+
+\begin{center}
+$\bordermatrix{ &sample_1&sample_2&\ldots &sample_n\cr feature_1&c_{11} & c_{12} & \ldots & c_{1n}\cr feature_2& c_{21} & c_{22} & \ldots & c_{2n}\cr \vdots & \vdots & \vdots & \ddots & \vdots\cr feature_m & c_{m1} & c_{m2} &\ldots & c_{mn}}$
+\end{center}
+
+Count data should be stored in a delimited (tab by default) file with sample names
+along the first row and feature names along the first column.
+
+Data is prepared and formatted as a \texttt{MRexperiment} object. For an overview of the internal structure please see Appendix A.
+
+
+\subsection{Biom-Format}
+You can load in BIOM file format data, the output of many commonly used, using the \texttt{loadBiom} function.
+The \texttt{biom2MRexperiment} and \texttt{MRexperiment2biom} functions serve as a gateway between the \texttt{biom-class} object defined in the \textbf{biom} package and a \texttt{MRexperiment-class} object. BIOM format files IO is available thanks to the \texttt{biomformat} package.
+
+As an example, we show how one can read in a BIOM file and convert it to a \texttt{MRexperiment} object.
+<<loadBiom>>=
+# reading in a biom file
+library(biomformat)
+biom_file <- system.file("extdata", "min_sparse_otu_table.biom", package = "biomformat")
+b <- read_biom(biom_file)
+biom2MRexperiment(b)
+@
+
+As an example, we show how one can write a \texttt{MRexperiment} object out as a BIOM file.
+Here is an example writing out the mouseData \texttt{MRexperiment} object to a BIOM file.
+<<writeBiom,eval=FALSE>>=
+data(mouseData)
+# options include to normalize or not
+b <- MRexperiment2biom(mouseData)
+write_biom(b,biom_file="~/Desktop/otu_table.biom")
+@
+
+\subsection{Loading count data}
+Following preprocessing and annotation of sequencing data \texttt{metagenomeSeq} requires a count matrix with features along rows and samples along the columns.
+\texttt{metagenomeSeq} includes functions for loading delimited files of counts
+\texttt{loadMeta} and phenodata \texttt{loadPhenoData}.
+
+As an example, a portion of the lung microbiome \cite{charlson}
+OTU matrix is provided in \texttt{metagenomeSeq}'s library "extdata" folder.
+The OTU matrix is stored as a tab delimited file.
+\texttt{loadMeta} loads the taxa and counts into a list.
+
+<<loadData>>=
+dataDirectory <- system.file("extdata", package="metagenomeSeq")
+lung = loadMeta(file.path(dataDirectory,"CHK_NAME.otus.count.csv"))
+dim(lung$counts)
+@
+
+
+\subsection{Loading taxonomy}
+Next we want to load the annotated taxonomy. Check to make sure that your taxa annotations and OTUs are in the same order as your matrix rows.
+
+<<loadTaxa>>=
+taxa = read.delim(file.path(dataDirectory,"CHK_otus.taxonomy.csv"),stringsAsFactors=FALSE)
+@
+
+As our OTUs appear to be in order with the count matrix we loaded earlier, the next step is to load phenodata.
+
+\textbf{Warning}: features need to have the same names as the rows of the count matrix when we create the MRexperiment object for provenance purposes.
+
+\subsection{Loading metadata}
+Phenotype data can be optionally loaded into \texttt{R} with \texttt{loadPhenoData}. This function loads the data as a list.
+
+<<loadClin>>=
+clin = loadPhenoData(file.path(dataDirectory,"CHK_clinical.csv"),tran=TRUE)
+ord = match(colnames(lung$counts),rownames(clin))
+clin = clin[ord,]
+head(clin[1:2,])
+@
+
+
+\textbf{Warning}: phenotypes must have the same names as the columns on the count matrix when we create the MRexperiment object for provenance purposes.
+
+\subsection{Creating a \texttt{MRexperiment} object}
+
+Function \texttt{newMRexperiment} takes a count matrix, phenoData (annotated data frame), and featureData (annotated data frame) as input.
+\texttt{Biobase} provides functions to create annotated data frames.
+Library sizes (depths of coverage) and normalization factors are also optional inputs.
+
+
+<<createMRexperiment1>>=
+phenotypeData = AnnotatedDataFrame(clin)
+phenotypeData
+@
+
+A feature annotated data frame. In this example it is simply the OTU numbers, but it can as easily be the annotated taxonomy at multiple levels.
+
+<<createMRexperiment2>>=
+OTUdata = AnnotatedDataFrame(taxa)
+OTUdata
+@
+
+
+<<createMRexperiment3,tidy=FALSE>>=
+obj = newMRexperiment(lung$counts,phenoData=phenotypeData,featureData=OTUdata)
+# Links to a paper providing further details can be included optionally.
+# experimentData(obj) = annotate::pmid2MIAME("21680950")
+obj
+@
+
+\subsection{Example datasets}
+There are two datasets included as examples in the \texttt{metagenomeSeq} package. Data needs to be in a \texttt{MRexperiment} object format to normalize, run statistical tests, and visualize. As an example, throughout the vignette we'll use the following datasets.
+To understand a function's usage or included data simply enter ?functionName.
+
+\begin{enumerate}
+\item Human lung microbiome \cite{charlson}:
+The lung microbiome consists of respiratory flora sampled from six healthy individuals. Three healthy nonsmokers and three healthy smokers. The upper lung tracts were sampled by oral wash and oro-/nasopharyngeal swabs. Samples were taken using two bronchoscopes, serial bronchoalveolar lavage and lower airway protected brushes.
+\end{enumerate}
+<<dataset1,tidy=FALSE>>=
+data(lungData)
+lungData
+@
+
+\begin{enumerate}
+\setcounter{enumi}{1}
+\item Humanized gnotobiotic mouse gut \cite{ts_mouse}:
+Twelve germ-free adult male C57BL/6J mice were fed a low-fat, plant polysaccharide-rich diet. Each mouse was gavaged with healthy adult human fecal material. Following the fecal transplant, mice remained on the low-fat, plant polysacchaaride-rich diet for four weeks, following which a subset of 6 were switched to a high-fat and high-sugar diet for eight weeks. Fecal samples for each mouse went through PCR amplification of the bacterial 16S rRNA gene V2 region weekly. Details of experimen [...]
+\url{http://gordonlab.wustl.edu/TurnbaughSE_10_09/STM_2009.html}
+
+\end{enumerate}
+<<dataset2,tidy=FALSE>>=
+data(mouseData)
+mouseData
+@
+
+\newpage
+\subsection{Useful commands}
+Phenotype information can be accessed with the \verb+phenoData+ and \verb+pData+ methods:
+<<pdata>>=
+phenoData(obj)
+head(pData(obj),3)
+@
+
+Feature information can be accessed with the \verb+featureData+ and \verb+fData+ methods:
+<<fdata>>=
+featureData(obj)
+head(fData(obj)[,-c(2,10)],3)
+@
+\newpage
+The raw or normalized counts matrix can be accessed with the \verb+MRcounts+ function:
+<<MRcounts>>=
+head(MRcounts(obj[,1:2]))
+@
+
+A \texttt{MRexperiment-class} object can be easily subsetted, for example:
+<<>>=
+featuresToKeep = which(rowSums(obj)>=100)
+samplesToKeep = which(pData(obj)$SmokingStatus=="Smoker")
+obj_smokers = obj[featuresToKeep,samplesToKeep]
+obj_smokers
+head(pData(obj_smokers),3)
+@
+
+Alternative normalization scaling factors can be accessed or replaced with the \verb+normFactors+ method:
+<<normFactors>>=
+head(normFactors(obj))
+normFactors(obj) <- rnorm(ncol(obj))
+head(normFactors(obj))
+@
+
+Library sizes (sequencing depths) can be accessed or replaced with the \verb+libSize+ method:
+<<libSize>>=
+head(libSize(obj))
+libSize(obj) <- rnorm(ncol(obj))
+head(libSize(obj))
+@
+
+\newpage
+Additionally, data can be filtered to maintain a threshold of minimum depth or OTU presence:
+<<filterData>>=
+data(mouseData)
+filterData(mouseData,present=10,depth=1000)
+@
+
+Two \texttt{MRexperiment-class} objects can be merged with the \texttt{mergeMRexperiments} function, e.g.:
+
+<<mergeMRexperiment>>=
+data(mouseData)
+newobj = mergeMRexperiments(mouseData,mouseData)
+newobj
+@
+
+
+\newpage
+\section{Normalization}
+Normalization is required due to varying depths of coverage across samples. \texttt{cumNorm} is a normalization method that calculates scaling factors equal to the sum of counts up to a particular quantile.
+
+Denote the $l$th quantile of sample $j$ as $q_j^l$, that is, in sample $j$ there are $l$ taxonomic features with counts smaller than $q_j^l$. For $l= \lfloor .95m \rfloor$ then $q_j^l$ corresponds to the 95th percentile of the count distribution for sample $j$.
+
+
+Denote $s_j^l= \sum_{(i|c_{ij}\leq q_j^l)}c_{ij}$ as the sum of counts for sample $j$ up to the $l$th quantile. Our normalization chooses a value $\hat{l}\leq m$ to define a normalization scaling factor for each sample to produce normalized counts $\tilde{c_{ij}}$ = $\frac{c_{ij}}{s_j^{\hat{l}}}N$ where $N$ is an appropriately chosen normalization constant. See Appendix C for more information on how our method calculates the proper percentile.
+
+These normalization factors are stored in the experiment summary slot. Functions to determine the proper percentile \texttt{cumNormStat}, save normalized counts \texttt{exportMat}, or save various sample statistics \texttt{exportStats} are also provided.
+Normalized counts can be called easily by \texttt{cumNormMat(MRexperimentObject)} or \texttt{MRcounts(MRexperimentObject,norm=TRUE,log=FALSE)}.
+
+\subsection{Calculating normalization factors}
+After defining a \texttt{MRexperiment} object, the first step is to calculate the proper percentile by which to normalize counts. There are several options in calculating and visualizing the relative differences in the reference. Figure 3 is an example from the lung dataset.
+
+<<calculateNormFactors>>=
+data(lungData)
+p=cumNormStatFast(lungData)
+@
+
+\noindent
+To calculate the scaling factors we simply run \texttt{cumNorm}
+
+<<normalizeData>>=
+lungData = cumNorm(lungData,p=p)
+@
+
+The user can alternatively choose different percentiles for the normalization scheme by specifying $p$.
+
+There are other functions, including \texttt{normFactors}, \texttt{cumNormMat}, that return the normalization factors or a normalized matrix for a specified percentile. To see a full list of functions please refer to the manual and help pages.
+
+\subsection{Exporting data}
+To export normalized count matrices:
+<<saveData>>=
+mat = MRcounts(lungData,norm=TRUE,log=TRUE)[1:5,1:5]
+exportMat(mat,file=file.path(dataDirectory,"tmp.tsv"))
+@
+
+\noindent
+To save sample statistics (sample scaling factor, quantile value, number of identified features and library size):
+<<exportStats>>=
+exportStats(lungData[,1:5],file=file.path(dataDirectory,"tmp.tsv"))
+head(read.csv(file=file.path(dataDirectory,"tmp.tsv"),sep="\t"))
+@
+
+
+<<removeData, echo=FALSE>>=
+system(paste("rm",file.path(dataDirectory,"tmp.tsv")))
+@
+
+\newpage
+\section{Statistical testing}
+Now that we have taken care of normalization we can address the effects of under sampling on the detecting differentially abundant features (OTUs, genes, etc). This is our latest development and we recommend \textit{fitFeatureModel} over \textit{fitZig}. \textit{MRcoefs}, \textit{MRtable} and \textit{MRfulltable} are useful summary tables of the model outputs.
+
+\subsection{Zero-inflated Log-Normal mixture model for each feature}
+By reparametrizing our zero-inflation model, we're able to fit a zero-inflated model for each specific OTU separately.
+We currently recommend using the zero-inflated log-normal model as implemented in \textit{fitFeatureModel}.
+
+\subsubsection{Example using fitFeatureModel for differential abundance testing}
+
+Here is an example comparing smoker's and non-smokers lung microbiome.
+
+<<fitFeatureModel>>=
+data(lungData)
+lungData = lungData[,-which(is.na(pData(lungData)$SmokingStatus))]
+lungData=filterData(lungData,present=30,depth=1)
+lungData <- cumNorm(lungData, p=.5)
+pd <- pData(lungData)
+mod <- model.matrix(~1+SmokingStatus, data=pd)
+lungres1 = fitFeatureModel(lungData,mod)
+head(MRcoefs(lungres1))
+@
+
+\subsection{Zero-inflated Gaussian mixture model}
+The depth of coverage in a sample is directly related to how many features are detected in a sample motivating our zero-inflated Gaussian (ZIG) mixture model. Figure 2 is representative of the linear relationship between depth of coverage and OTU identification ubiquitous in marker-gene survey datasets currently available. For a quick overview of the mathematical model see Appendix B.
+
+\begin{figure}
+\centerline{\includegraphics[width=.55\textwidth]{metagenomeSeq_figure1.png}}
+\caption{\footnotesize{The number of unique features is plotted against depth of coverage for samples from the Human Microbiome Project \cite{hmp}. Including the depth of coverage and the interaction of body site and sequencing site we are able to acheive an adjusted $\mathrm{R}^2$ of .94. The zero-inflated Gaussian mixture was developed to account for missing features.}}\label{fig1}
+\end{figure}
+
+Function \texttt{fitZig} performs a complex mathematical optimization routine to estimate probabilities that a zero for a particular feature in a sample is a technical zero or not. The function relies heavily on the \texttt{limma} package \cite{limma}. Design matrices can be created in R by using the \texttt{model.matrix} function and are inputs for \texttt{fitZig}.
+
+For large survey studies it is often pertinent to include phenotype information or confounders into a design matrix when testing the association between the abundance of taxonomic features and a phenotype phenotype of interest (disease, for
+instance). Our linear model methodology can easily incorporate these
+confounding covariates in a straightforward manner. \texttt{fitZig} output includes weighted fits for each of the $m$ features. Results can be filtered and saved using \texttt{MRcoefs} or \texttt{MRtable}.
+
+\subsubsection{Example using fitZig for differential abundance testing}
+\textbf{Warning}: The user should restrict significant features to those with a minimum number of positive samples. What this means is that one should not claim features are significant unless the effective number of samples is above a particular percentage. For example, fold-change estimates might be unreliable if an entire group does not have a positive count for the feature in question.
+
+
+We recommend the user remove features based on the number of estimated effective samples, please see \texttt{calculateEffectiveSamples}. We recommend removing features with less than the average number of effective samples in all features. In essence, setting eff = .5 when using \texttt{MRcoefs}, \texttt{MRfulltable}, or \texttt{MRtable}. To find features absent from a group the function \texttt{uniqueFeatures} provides a table of the feature ids, the number of positive features and read [...]
+
+In our analysis of the lung microbiome data, we can remove features that are not present in many samples, controls, and calculate the normalization factors. The user needs to decide which metadata should be included in the linear model.
+
+<<preprocess,dev='pdf',out.width='.55\\linewidth',out.height='.55\\linewidth',fig.cap='Relative difference for the median difference in counts from the reference.',fig.align='center',warning=FALSE>>=
+data(lungData)
+controls = grep("Extraction.Control",pData(lungData)$SampleType)
+lungTrim = lungData[,-controls]
+rareFeatures = which(rowSums(MRcounts(lungTrim)>0)<10)
+lungTrim = lungTrim[-rareFeatures,]
+lungp = cumNormStat(lungTrim,pFlag=TRUE,main="Trimmed lung data")
+lungTrim = cumNorm(lungTrim,p=lungp)
+@
+
+After the user defines an appropriate model matrix for hypothesis testing there are optional inputs to \texttt{fitZig}, including settings determined by \texttt{zigControl}. We ask the user to review the help files for both \texttt{fitZig} and \texttt{zigControl}. For this example we include body site as covariates and want to test for the bacteria differentially abundant between smokers and non-smokers.
+
+<<zigTesting>>=
+smokingStatus = pData(lungTrim)$SmokingStatus
+bodySite = pData(lungTrim)$SampleType
+normFactor = normFactors(lungTrim)
+normFactor = log2(normFactor/median(normFactor) + 1)
+mod = model.matrix(~smokingStatus+bodySite + normFactor)
+settings = zigControl(maxit=10,verbose=TRUE)
+fit = fitZig(obj = lungTrim,mod=mod,useCSSoffset = FALSE,
+ control=settings)
+
+# The default, useCSSoffset = TRUE, automatically includes the CSS scaling normalization factor.
+@
+
+The result, \texttt{fit}, is a list providing detailed estimates of the fits including a
+\texttt{limma} fit in \texttt{fit\$fit} and an \texttt{ebayes} statistical fit in \texttt{fit\$eb}.
+This data can be analyzed like any \texttt{limma} fit and in this example, the column of
+the fitted coefficientsrepresents the fold-change for our "smoker" vs. "nonsmoker" analysis.
+
+Looking at the particular analysis just performed, there appears to be OTUs representing two
+\textit{Prevotella}, two \textit{Neisseria}, a \textit{Porphyromonas} and a \textit{Leptotrichia} that are differentially abundant. One should check that similarly annotated OTUs are not equally differentially abundant in controls.
+
+Alternatively, the user can input a model with their own normalization factors including them directly in the model matrix and specifying the option \texttt{useCSSoffset = FALSE} in fitZig.
+
+\subsubsection{Multiple groups}
+Assuming there are multiple groups it is possible to make use of Limma's topTable functions for F-tests
+and contrast functions to compare multiple groups and covariates of interest. The output of fitZig includes a 'MLArrayLM' Limma object that can be called on by other functions. When running fitZig by default there is an additional covariate added to the design matrix. The fit and the ultimate design matrix are crucial for contrasts.
+<<contrasts>>=
+# maxit=1 is for demonstration purposes
+settings = zigControl(maxit=1,verbose=FALSE)
+mod = model.matrix(~bodySite)
+colnames(mod) = levels(bodySite)
+# fitting the ZIG model
+res = fitZig(obj = lungTrim,mod=mod,control=settings)
+# The output of fitZig contains a list of various useful items. hint: names(res).
+#
+# Probably the most useful is the limma 'MLArrayLM' object called fit.
+zigFit = res$fit
+finalMod = res$fit$design
+
+contrast.matrix = makeContrasts(BAL.A-BAL.B,OW-PSB,levels=finalMod)
+fit2 = contrasts.fit(zigFit, contrast.matrix)
+fit2 = eBayes(fit2)
+topTable(fit2)
+
+# See help pages on decideTests, topTable, topTableF, vennDiagram, etc.
+@
+Further specific details can be found in section 9.3 and beyond of the Limma user guide. The take home message is that to make use of any Limma functions one needs to extract the final model matrix used: \textit{res\$fit\$design} and the MLArrayLM Limma fit object: \textit{res\$fit}.
+
+\subsubsection{Exporting fits}
+Currently functions are being developed to wrap and output results more neatly, but \texttt{MRcoefs}, \texttt{MRtable}, \texttt{MRfulltable} can be used to view coefficient fits and related statistics and export the data with optional output values - see help files to learn how they differ. An important note is that the \texttt{by} variable controls which coefficients are of interest whereas \texttt{coef} determines the display.\\
+
+To only consider features that are found in a large percentage of effectively positive (positive samples + the weight of zero counts included in the Gaussian mixture) use the \textbf{eff} option in the \texttt{MRtables}.
+
+<<fittedResult,tidy=TRUE>>=
+taxa =
+ sapply(strsplit(as.character(fData(lungTrim)$taxa),split=";"),
+ function(i){i[length(i)]})
+head(MRcoefs(fit,taxa=taxa,coef=2))
+@
+
+\subsection{Time series analysis}
+Implemented in the \texttt{fitTimeSeries} function is a method for calculating time intervals for which bacteria are
+differentially abundant. Fitting is performed using Smoothing Splines ANOVA (SS-ANOVA), as implemented in the \texttt{gss}
+package. Given observations at multiple time points for two groups the method calculates a function modeling the difference
+in abundance across all time. Using group membership permutations weestimate a null distribution of areas under the difference
+curve for the time intervals of interest and report significant intervals of time.
+
+Use of the function for analyses should cite:
+"Finding regions of interest in high throughput genomics data using smoothing splines"
+Talukder H, Paulson JN, Bravo HC. (Submitted)
+
+For a description of how to perform a time-series / genome based analysis call the \texttt{fitTimeSeries} vignette.
+<<timeSeries>>=
+# vignette("fitTimeSeries")
+@
+
+\subsection{Log Normal permutation test}
+Included is a standard log normal linear model with permutation based p-values permutation. We show the fit for the same model as above using 10 permutations providing p-value resolution to the tenth. The \texttt{coef} parameter refers to the coefficient of interest to test. We first generate the list of significant features.
+
+<<perm>>=
+coeffOfInterest = 2
+res = fitLogNormal(obj = lungTrim, mod = mod, useCSSoffset = FALSE, B = 10, coef = coeffOfInterest)
+
+# extract p.values and adjust for multiple testing
+# res$p are the p-values calculated through permutation
+adjustedPvalues = p.adjust(res$p,method="fdr")
+
+# extract the absolute fold-change estimates
+foldChange = abs(res$fit$coef[,coeffOfInterest])
+
+# determine features still significant and order by the
+sigList = which(adjustedPvalues <= .05)
+sigList = sigList[order(foldChange[sigList])]
+
+# view the top taxa associated with the coefficient of interest.
+head(taxa[sigList])
+@
+
+\subsection{Presence-absence testing}
+The hypothesis for the implemented presence-absence test is that the proportion/odds of a given feature present is higher/lower among one group of individuals compared to another, and we want to test whether any difference in the proportions observed is significant. We use Fisher's exact test to create a 2x2 contingency table and calculate p-values, odd's ratios, and confidence intervals. \texttt{fitPA} calculates the presence-absence for each organism and returns a table of p-values, o [...]
+
+<<presenceAbsence>>=
+classes = pData(mouseData)$diet
+res = fitPA(mouseData[1:5,],cl=classes)
+# Warning - the p-value is calculating 1 despite a high odd's ratio.
+head(res)
+@
+
+\subsection{Discovery odds ratio testing}
+The hypothesis for the implemented discovery test is that the proportion of observed counts for a feature of all counts are comparable between groups. We use Fisher's exact test to create a 2x2 contingency table and calculate p-values, odd's ratios, and confidence intervals. \texttt{fitDO} calculates the proportion of counts for each organism and returns a table of p-values, odd's ratios, and confidence intervals. The function will accept either a \texttt{MRexperiment} object or matrix.
+
+<<discOdds>>=
+classes = pData(mouseData)$diet
+res = fitDO(mouseData[1:100,],cl=classes,norm=FALSE,log=FALSE)
+head(res)
+@
+
+\subsection{Feature correlations}
+To test the correlations of abundance features, or samples, in a pairwise fashion we have implemented \texttt{correlationTest} and \texttt{correctIndices}. The \texttt{correlationTest} function will calculate basic pearson, spearman, kendall correlation statistics for the rows of the input and report the associated p-values. If a vector of length ncol(obj) it will also calculate the correlation of each row with the associated vector.
+
+<<corTest>>=
+cors = correlationTest(mouseData[55:60,],norm=FALSE,log=FALSE)
+head(cors)
+@
+\textbf{Caution:} http://www.ncbi.nlm.nih.gov/pubmed/23028285
+
+\subsection{Unique OTUs or features}
+To find features absent from any number of classes the function \texttt{uniqueFeatures} provides a table of the feature ids, the number of positive features and reads for each group. Thresholding for the number of positive samples or reads required are options.
+
+<<uniqueFeatures>>=
+cl = pData(mouseData)[["diet"]]
+uniqueFeatures(mouseData,cl,nsamples = 10,nreads = 100)
+@
+
+\newpage
+\section{Aggregating counts}
+Normalization is recommended at the OTU level. However, functions are in place to aggregate
+the count matrix (normalized or not), based on a particular user defined level. Using the
+featureData information in the MRexperiment object, calling \texttt{aggregateByTaxonomy} or \texttt{aggTax} on a MRexperiment object and declaring particular featureData column name (i.e.
+'genus') will aggregate counts to the desired level with the aggfun function (default colSums). Possible aggfun alternatives include colMeans and colMedians.
+
+<<aggTax>>=
+obj = aggTax(mouseData,lvl='phylum',out='matrix')
+head(obj[1:5,1:5])
+@
+
+Additionally, aggregating samples can be done using the
+phenoData information in the MRexperiment object. Calling \texttt{aggregateBySample} or \texttt{aggsamp} on a MRexperiment object and declaring a particular phenoData column name (i.e.
+'diet') will aggregate counts with the aggfun function (default rowMeans). Possible aggfun alternatives include rowSums and rowMedians.
+
+<<aggSamp>>=
+obj = aggSamp(mouseData,fct='mouseID',out='matrix')
+head(obj[1:5,1:5])
+@
+
+The \texttt{aggregateByTaxonomy},\texttt{aggregateBySample}, \texttt{aggTax} \texttt{aggSamp} functions are flexible enough to put in either 1) a matrix with a vector of labels or 2) a MRexperiment object with a vector of labels or featureData column name. The function can also output either a matrix or MRexperiment object.
+
+\newpage
+\section{Visualization of features}
+
+To help with visualization and analysis of datasets \texttt{metagenomeSeq} has several plotting functions to gain insight of the dataset's overall structure and particular individual features. An initial interactive exploration of the data can be displayed with the \texttt{display} function.
+
+For an overall look at the dataset we provide a number of plots including heatmaps of feature counts: \texttt{plotMRheatmap}, basic feature correlation structures: \texttt{plotCorr},
+PCA/MDS coordinates of samples or features: \texttt{plotOrd}, rarefaction effects: \texttt{plotRare} and contingency table
+style plots: \texttt{plotBubble}.
+
+
+Other plotting functions look at particular features such as the abundance for a single feature: \texttt{plotOTU} and \texttt{plotFeature}, or of multiple features at once:
+\texttt{plotGenus}. Plotting multiple OTUs with similar annotations allows for
+additional control of false discoveries.
+
+\subsection{Interactive Display}
+Due to recent advances in the \texttt{interactiveDisplay} package, calling the \texttt{display} function on
+\texttt{MRexperiment} objects will bring up a browser to explore your data through several interactive visualizations.
+For more detailed interactive visualizations one might be interested in the shiny-phyloseq package.
+
+<<interactiveDisplay>>=
+# Calling display on the MRexperiment object will start a browser session with interactive plots.
+
+# require(interactiveDisplay)
+# display(mouseData)
+@
+
+\subsection{Structural overview}
+Many studies begin by comparing the abundance composition across
+sample or feature phenotypes. Often a first step of data analysis is a
+heatmap, correlation or co-occurence plot or some other data exploratory method.
+The following functions have been implemented to provide a first step overview
+of the data:
+
+
+\begin{enumerate}
+\item \texttt{plotMRheatmap} - heatmap of abundance estimates (Fig. 4 left)
+\item \texttt{plotCorr} - heatmap of pairwise correlations (Fig. 4 right)
+\item \texttt{plotOrd} - PCA/CMDS components (Fig. 5 left)
+\item \texttt{plotRare} - rarefaction effect (Fig. 5 right)
+\item \texttt{plotBubble} - contingency table style plot (see help)
+\end{enumerate}
+
+\noindent
+Each of the above can include phenotypic information in helping to explore the data.
+
+Below we show an example of how to create a heatmap and hierarchical clustering of $\log_2$
+transformed counts for the 200 OTUs with the largest overall variance.
+Red values indicate counts close to zero. Row color labels indicate OTU
+taxonomic class; column color labels indicate diet (green = high fat,
+yellow = low fat). Notice the samples cluster by diet in these cases
+and there are obvious clusters. We then plot a correlation matrix for the same features.
+
+<<heatmapData,fig.cap='Left) Abundance heatmap (plotMRheatmap). Right) Correlation heatmap (plotCorr).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth'>>=
+trials = pData(mouseData)$diet
+heatmapColColors=brewer.pal(12,"Set3")[as.integer(factor(trials))];
+heatmapCols = colorRampPalette(brewer.pal(9, "RdBu"))(50)
+
+# plotMRheatmap
+plotMRheatmap(obj=mouseData,n=200,cexRow = 0.4,cexCol = 0.4,trace="none",
+ col = heatmapCols,ColSideColors = heatmapColColors)
+
+# plotCorr
+plotCorr(obj=mouseData,n=200,cexRow = 0.25,cexCol = 0.25,
+ trace="none",dendrogram="none",col=heatmapCols)
+@
+
+Below is an example of plotting CMDS plots of the data and the rarefaction effect at the OTU level. None of the data is removed (we recommend removing outliers typically).
+<<MDSandRareplots,fig.cap='Left) CMDS of features (plotOrd). Right) Rarefaction effect (plotRare).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth'>>=
+cl = factor(pData(mouseData)$diet)
+
+# plotOrd - can load vegan and set distfun = vegdist and use dist.method="bray"
+plotOrd(mouseData,tran=TRUE,usePCA=FALSE,useDist=TRUE,bg=cl,pch=21)
+
+# plotRare
+res = plotRare(mouseData,cl=cl,pch=21,bg=cl)
+
+# Linear fits for plotRare / legend
+tmp=lapply(levels(cl), function(lv)
+ lm(res[,"ident"]~res[,"libSize"]-1, subset=cl==lv))
+for(i in 1:length(levels(cl))){
+ abline(tmp[[i]], col=i)
+}
+legend("topleft", c("Diet 1","Diet 2"), text.col=c(1,2),box.col=NA)
+@
+
+\subsection{Feature specific}
+Reads clustered with high similarity represent functional or taxonomic units.
+However, it is possible that reads from the same organism get clustered into
+multiple OTUs. Following differential abundance analysis.
+It is important to confirm differential abundance.
+One way to limit false positives is ensure that the feature is actually abundant (enough positive samples).
+Another way is to plot the abundances of features similarly annotated.
+
+\begin{enumerate}
+\item \texttt{plotOTU} - abundances of a particular feature by group (Fig. 6 left)
+\item \texttt{plotGenus} - abundances for several features similarly annotated by group (Fig. 6 right)
+\item \texttt{plotFeature} - abundances of a particular feature by group (similar to plotOTU, Fig. 7)
+\end{enumerate}
+
+
+Below we use \texttt{plotOTU} to plot the normalized log(cpt) of a specific OTU annotated as \textit{Neisseria meningitidis}, in particular the 779th row of lungTrim's count matrix. Using \texttt{plotGenus} we plot the normalized log(cpt) of all OTUs annotated as \textit{Neisseria meningitidis}.
+
+It would appear that \textit{Neisseria meningitidis} is differentially more abundant in nonsmokers.
+<<plotOTUData,fig.cap='Left) Abundance plot (plotOTU). Right) Multiple OTU abundances (plotGenus).',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth',tidy=TRUE>>=
+head(MRtable(fit,coef=2,taxa=1:length(fData(lungTrim)$taxa)))
+patients=sapply(strsplit(rownames(pData(lungTrim)),split="_"),
+ function(i){
+ i[3]
+ })
+pData(lungTrim)$patients=patients
+classIndex=list(smoker=which(pData(lungTrim)$SmokingStatus=="Smoker"))
+classIndex$nonsmoker=which(pData(lungTrim)$SmokingStatus=="NonSmoker")
+otu = 779
+
+# plotOTU
+plotOTU(lungTrim,otu=otu,classIndex,main="Neisseria meningitidis")
+
+# Now multiple OTUs annotated similarly
+x = fData(lungTrim)$taxa[otu]
+otulist = grep(x,fData(lungTrim)$taxa)
+
+# plotGenus
+plotGenus(lungTrim,otulist,classIndex,labs=FALSE,
+ main="Neisseria meningitidis")
+
+lablist<- c("S","NS")
+axis(1, at=seq(1,6,by=1), labels = rep(lablist,times=3))
+@
+
+<<plotFeatureData,fig.cap='Plot of raw abundances',dev='pdf',fig.show='hold',out.width='.5\\linewidth', out.height='.5\\linewidth',tidy=TRUE>>=
+classIndex=list(Western=which(pData(mouseData)$diet=="Western"))
+classIndex$BK=which(pData(mouseData)$diet=="BK")
+otuIndex = 8770
+
+# par(mfrow=c(1,2))
+dates = pData(mouseData)$date
+plotFeature(mouseData,norm=FALSE,log=FALSE,otuIndex,classIndex,
+ col=dates,sortby=dates,ylab="Raw reads")
+@
+
+\newpage
+\section{Summary}
+
+\texttt{metagenomeSeq} is specifically designed for sparse high-throughput sequencing experiments that addresses the analysis of differential abundance for marker-gene survey data. The package, while designed for marker-gene survey datasets, may be appropriate for other sparse data sets for which the zero-inflated Gaussian mixture model may apply. If you make use of the statistical method please cite our paper. If you made use of the manual/software, please cite the manual/software!
+
+\subsection{Citing metagenomeSeq}
+<<cite>>=
+citation("metagenomeSeq")
+@
+
+\subsection{Session Info}
+<<sessionInfo>>=
+sessionInfo()
+@
+
+\newpage
+\section{Appendix}
+\subsection{Appendix A: MRexperiment internals}
+The S4 class system in R allows for object oriented definitions. \texttt{metagenomeSeq} makes use of the \texttt{Biobase} package in Bioconductor and their virtual-class, \texttt{eSet}. Building off of \texttt{eSet}, the main S4 class in \texttt{metagenomeSeq} is termed \texttt{MRexperiment}. \texttt{MRexperiment} is a simple extension of \texttt{eSet}, adding a single slot, \texttt{expSummary}.
+
+The experiment summary slot is a data frame that includes the depth of coverage and the normalization factors for each sample. Future datasets can be formated as MRexperiment objects and analyzed with relative ease. A \texttt{MRexperiment} object is created by calling \texttt{newMRexperiment}, passing the counts, phenotype and feature data as parameters.
+
+We do not include normalization factors or library size in the currently available slot specified for the sample specific phenotype data. All matrices are organized in the \texttt{assayData} slot. All phenotype data (disease status, age, etc.) is stored in \texttt{phenoData} and feature data (OTUs, taxanomic assignment to varying levels, etc.) in \texttt{featureData}. Additional slots are available for reproducibility and annotation.
+
+\subsection{Appendix B: Mathematical model}
+
+Defining the class comparison of interest as $k(j)=I\{j \in \mathrm{ group } A\}$. The zero-inflated model is defined for the continuity-corrected $\log_2$ of the count data $y_{ij} = \log_2(c_{ij}+1)$ as a mixture of a point mass at zero $I_{\{0\}}(y_{ij})$ and a count distribution $f_{count}(y_{ij};\mu_i, \sigma_i^2) \sim N(\mu_i, \sigma_i^2)$.
+Given mixture parameters $\pi_{j}$, we have that the density of the zero-inflated Gaussian distribution for feature $i$, in sample $j$ with $S_{j}$ total counts is:
+
+\begin{equation}
+f_{zig}(y_{ij}; \theta ) = \pi_{j}(S_{j}) \cdot I_{\{0\}}(y_{ij})
++ (1-\pi_{j}(S_{j})) \cdot f_{count}(y_{ij};\theta)
+\end{equation}
+
+Maximum-likelihood estimates are approximated using an EM algorithm,
+where we treat mixture membership $\Delta_{ij}=1$ if $y_{ij}$ is
+generated from the zero point mass as latent indicator variables\cite{EM}. We make use of an EM algorithm to account for the linear relationship between sparsity and depth of coverage. The user can specify within the \texttt{fitZig} function a non-default zero model that accounts for more than simply the depth of coverage (e.g. country, age, any metadata associated with sparsity, etc.).
+See Figure 8 for the graphical model.
+
+\begin{figure}
+\centerline{\includegraphics[width=.7\textwidth]{metagenomeSeq_figure2.png}}
+\caption{\footnotesize{Graphical model. Green nodes represent observed variables: $S_j$ is the
+total number of reads in sample $j$; $k_j$ the case-control status
+of sample $j$; and $y_{ij}$ the logged normalized counts for feature $i$ in sample $j$. Yellow nodes represent counts obtained from each mixture component: counts come from either a spike-mass at zero,
+$y_{ij}^0$, or the ``count'' distribution, $y_{ij}^1$. Grey nodes $b_{0i}$, $b_{1i}$ and $\sigma_{i}^2$ represent the
+estimated overall mean, fold-change and variance of the count distribution component for feature $i$. $\pi_j$, is the mixture proportion for sample $j$ which depends on sequencing depth via a linear model defined by parameters $\beta_0$ and $\beta_1$. The expected value of latent indicator variables $\Delta_{ij}$ give the posterior probability of a count being generated from a spike-mass at zero, i.e. $y_{ij}^0$. We assume $M$ features and $N$ samples.}}
+\end{figure}
+
+More information will be included later. For now, please see the online methods in:
+
+http://www.nature.com/nmeth/journal/vaop/ncurrent/full/nmeth.2658.html
+
+\subsection{Appendix C: Calculating the proper percentile} To be included: an overview of the two methods implemented for the data driven percentile calculation and more description below.
+
+
+The choice of the appropriate quantile given is crucial for ensuring that the normalization approach does not introduce normalization-related artifacts in the data. At a high level, the count distribution of samples should all be roughly equivalent and independent of each other up to this quantile under the assumption that, at this range, counts are derived from a common distribution.
+
+
+More information will be included later. For now, please see the online methods in:
+
+http://www.nature.com/nmeth/journal/vaop/ncurrent/full/nmeth.2658.html
+
+\newpage
+\bibliography{metagenomeSeq}
+\end{document}
diff --git a/vignettes/metagenomeSeq.bib b/vignettes/metagenomeSeq.bib
new file mode 100644
index 0000000..1822098
--- /dev/null
+++ b/vignettes/metagenomeSeq.bib
@@ -0,0 +1,33 @@
+ at article{metastats, title={Statistical Methods for Detecting Differentially Abundant Features in Clinical Metagenomic Samples}, volume={11}, journal={PLOS Comp Bio}, publisher={PLOS}, author={White, James and Nagaranjan, Niranjan and Pop, Mihai}, year={2009}}
+ at article{lefse,
+abstract = {ABSTRACT: This study describes and validates a new method for metagenomic biomarker discovery by way of class comparison, tests of biological consistency and effect size estimation. This addresses the challenge of finding organisms, genes, or pathways that consistently explain the differences between two or more microbial communities which is a central problem to the study of metagenomics. We extensively validate our method on several microbiomes and a convenient online inter [...]
+author = {Segata, Nicola and Izard, Jacques and Waldron, Levi and Gevers, Dirk and Miropolsky, Larisa and Garrett, Wendy S and Huttenhower, Curtis},
+doi = {10.1186/gb-2011-12-6-r60},
+file = {:Users/jnpaulson/Downloads/gb-2011-12-6-r60.pdf:pdf},
+issn = {1465-6914},
+journal = {Genome biology},
+month = jun,
+number = {6},
+pages = {R60},
+pmid = {21702898},
+publisher = {BioMed Central Ltd},
+title = {{Metagenomic biomarker discovery and explanation.}},
+volume = {12},
+year = {2011}
+}
+ at article{ts_mouse, title={The effect of diet on the human gut microbiome: a metagenomic analysis in humanized gnotobiotic mice.}, volume={1}, number={6}, journal={Science translational medicine}, publisher={NIH Public Access}, author={Turnbaugh, Peter J and Ridaura, Vanessa K and Faith, Jeremiah J and Rey, Federico E and Knight, Rob and Gordon, Jeffrey I}, year={2009}, pages={6ra14}}
+ at article{edgeR, title={edgeR: a Bioconductor package for differential expression analysis of digital gene expression data}, volume={26}, number={1}, journal={Bioinformatics}, publisher={Oxford University Press}, author={Robinson, Mark D and McCarthy, Davis J and Smyth, Gordon K}, year={2010}, pages={139--140}}
+
+ at article{deseq, title={Differential expression analysis for sequence count data.}, volume={11}, number={10}, journal={Genome Biology}, publisher={BioMed Central Ltd}, author={Anders, Simon and Huber, Wolfgang}, year={2010}, pages={R106}}
+
+ at article{charlson, title={Topographical Continuity of Bacterial Populations in the Healthy Human Respiratory Tract.}, volume={184}, journal={American Journal of Respiratory and Critical Care Medicine}, publisher={Am Thoracic Soc}, author={Charlson, Emily S and Bittinger, Kyle and Haas, Andrew R and Fitzgerald, Ayannah S and Frank, Ian and Yadav, Anjana and Bushman, Frederic D and Collman, Ronald G}, year={2011}}
+
+ at article{ghodsi, title={DNACLUST: accurate and efficient clustering of phylogenetic marker genes.}, volume={12}, number={1}, journal={BMC Bioinformatics}, publisher={BioMed Central Ltd}, author={Ghodsi, Mohammadreza and Liu, Bo and Pop, Mihai}, year={2011}, pages={271}}
+
+ at article{hmp, title={A framework for human microbiome research}, volume={486}, url={http://www.nature.com/doifinder/10.1038/nature11209}, number={7402}, journal={Nature}, publisher={Nature Publishing Group}, author={HMP, Consortium}, year={2012}}
+
+ at article{recount, title={ReCount: A multi-experiment resource of analysis-ready RNA-seq gene count datasets.}, volume={12}, url={http://www.ncbi.nlm.nih.gov/pubmed/22087737}, number={1}, journal={BMC Bioinformatics}, publisher={BioMed Central Ltd}, author={Frazee, Alyssa C and Langmead, Ben and Leek, Jeffrey T}, year={2011}, pages={449}}
+
+ at book{limma, title={Limma: linear models for microarray data}, number={October}, booktitle={Bioinformatics and Computational Biology Solutions using R and Bioconductor}, publisher={Springer}, author={Smyth, Gordon K}, year={2005}, pages={397--420}}
+
+ at article{EM, title={Maximum likelihood from incomplete data via the EM algorithm}, volume={39}, url={http://www.jstor.org/stable/2984875}, number={1}, journal={Journal of the Royal Statistical Society Series B Methodological}, publisher={JSTOR}, author={Dempster, A P and Laird, N M and Rubin, D B}, year={1977}, pages={1--38}}
\ No newline at end of file
diff --git a/vignettes/metagenomeSeq_figure1.png b/vignettes/metagenomeSeq_figure1.png
new file mode 100644
index 0000000..5739dc6
Binary files /dev/null and b/vignettes/metagenomeSeq_figure1.png differ
diff --git a/vignettes/metagenomeSeq_figure2.png b/vignettes/metagenomeSeq_figure2.png
new file mode 100644
index 0000000..0ec80e6
Binary files /dev/null and b/vignettes/metagenomeSeq_figure2.png differ
diff --git a/vignettes/overview.pdf b/vignettes/overview.pdf
new file mode 100644
index 0000000..8019983
Binary files /dev/null and b/vignettes/overview.pdf differ
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/r-bioc-metagenomeseq.git
More information about the debian-med-commit
mailing list