index.html 01_annotation.html 02_sample_estimations.html

In this document, we will perform a series of differential expression analyses using the data which survived sample estimation.

1 Extract significantly changed genes

My original work in this context was to perform all possible contrasts using the entire data set. After discussion with Najib and Santuza, it was initially agreed that we would use a smaller subset in order to evaluate the methods for DE along with batch effects etc.

## cl_all_kexptv1 comes from sample_estimations when we removed an
## outlier sample (hpgl0490).
cl_all_filt <- sm(normalize_expt(cl_all_kexptv1, filter="cbcb"))
cl_all_de_sva <- sm(all_pairwise(
    cl_all_filt, model_batch="svaseq", surrogates=1,
    which_voom="limma", edger_method="long"))

2 Choose contrasts to keep and evaluate

I am going to split these results into 2 categories: clbrener analyses over time, and cl14 over time.

clb_times_keepers <- list(
    "clbr_tryp_to_a60" = c("CLBr.A60", "CLBr.Tryp"),
##    "clbr_tryp_to_a96" = c("CLBr.A96", "CLBr.Tryp"),
    "clbr_a60_to_a96" = c("CLBr.A96", "CLBr.A60"),
    "clbr_a96_to_tryp" = c("CLBr.Tryp", "CLBr.A96"))
cl14_times_keepers <- list(
    "cl14_tryp_to_a60" = c("CL14.A60", "CL14.Tryp"),
##    "cl14_tryp_to_a96" = c("CL14.A96", "CL14.Tryp"),
    "cl14_a60_to_a96" = c("CL14.A96", "CL14.A60"),
    "cl14_a96_to_tryp" = c("CL14.Tryp", "CL14.A96"))
times_keepers <- list(
    "clbr_tryp_to_a60" = c("CLBr.A60", "CLBr.Tryp"),
    "clbr_a60_to_a96" = c("CLBr.A96", "CLBr.A60"),
    "clbr_a96_to_tryp" = c("CLBr.Tryp", "CLBr.A96"),
    "cl14_tryp_to_a60" = c("CL14.A60", "CL14.Tryp"),
    "cl14_a60_to_a96" = c("CL14.A96", "CL14.A60"),
    "cl14_a96_to_tryp" = c("CL14.Tryp", "CL14.A96"))
strains_keepers <- list(
    "a60_clbr_over_cl14" = c("CLBr.A60", "CL14.A60"),
    "a96_clbr_over_cl14" = c("CLBr.A96", "CL14.A96"),
    "tryp_clbr_over_cl14" = c("CLBr.Tryp", "CL14.Tryp"))

3 Extract strain comparisons

strain_comparisons <- sm(combine_de_tables(
    cl_all_de_sva,
    excel=paste0("excel/strain_comparisons-v", ver, ".xlsx"),
    rownames=FALSE,
    keepers=strains_keepers))
strain_only_limma <- sm(combine_de_tables(
    cl_all_de_sva,
    excel=paste0("excel/strain_comparison_limma-v", ver, ".xlsx"),
    keepers=strains_keepers,
    rownames=FALSE,
    include_basic=FALSE,
    include_deseq=FALSE,
    include_edger=FALSE))

4 CLBrener time comparisons

clb_compare_times <- sm(combine_de_tables(
    cl_all_de_sva,
    excel=paste0("excel/clb_compare_times-v", ver, ".xlsx"),
    rownames=FALSE,
    keepers=clb_times_keepers))
clb_only_limma <- sm(combine_de_tables(
    cl_all_de_sva,
    excel=paste0("excel/clb_compare_times_limma-v", ver, ".xlsx"),
    keepers=clb_times_keepers,
    rownames=FALSE,
    include_basic=FALSE,
    include_deseq=FALSE,
    include_edger=FALSE))

5 CL14 time comparisons

cl14_compare_times <- sm(combine_de_tables(
    cl_all_de_sva,
    excel=paste0("excel/cl14_compare_times-v", ver, ".xlsx"),
    rownames=FALSE,
    keepers=cl14_times_keepers))
cl14_only_limma <- sm(combine_de_tables(
    cl_all_de_sva,
    excel=paste0("excel/cl14_compare_times_limma-v", ver, ".xlsx"),
    keepers=cl14_times_keepers,
    rownames=FALSE,
    include_basic=FALSE,
    include_deseq=FALSE,
    include_edger=FALSE))
all_compare_times <- sm(combine_de_tables(
    cl_all_de_sva,
    excel=paste0("excel/compare_times_all_limma-v", ver, ".xlsx"),
    keepers=times_keepers,
    include_basic=FALSE,
    include_deseq=FALSE,
    include_edger=FALSE,
    rownames=FALSE))

all_times_sig <- sm(extract_significant_genes(
    all_compare_times,
    according_to="limma",
    excel=paste0("excel/all_times_sig-v", ver, ".xlsx")))
## Error in get_sig_genes(table, fc = fc, p = p, z = z, n = n, column = fc_column, : There is no edger_logfc column in the table.

6 Boxplots of CLB/CL14 gene families

Hmm I think the goal laid out by Najib is to have some plots which show in a more concise fashion the changes over time in these specific gene families and be able to compare those differences from CL14 to CLBrener.

I messed up the semantic copy number filter with this.

## In this case, I want 'random' to be a sampling of all data
extract_families_clbr <- sm(semantic_copynumber_extract(
    clb_compare_times,
    semantic_column="genedescription"))
extract_families_cl14 <- sm(semantic_copynumber_extract(
    cl14_compare_times,
    semantic_column="genedescription"))

dgf_df <- data.frame(
    "CLBr.A60" = extract_families_clbr$data$CLBr.A96_vs_CLBr.A60$DGF$limma_logfc,
    "CL14.A60" = extract_families_cl14$data$CL14.A96_vs_CL14.A60$DGF$limma_logfc,
    "CLBr.A96" = extract_families_clbr$data$CLBr.Tryp_vs_CLBr.A96$DGF$limma_logfc,
    "CL14.A96" = extract_families_cl14$data$CL14.Tryp_vs_CL14.A96$DGF$limma_logfc,
    "CLBr.Tryp" = extract_families_clbr$data$CLBr.A60_vs_CLBr.Tryp$DGF$limma_logfc,
    "CL14.Tryp" = extract_families_cl14$data$CL14.A60_vs_CL14.Tryp$DGF$limma_logfc
)
masp_df <- data.frame(
    "CLBr.A60" = extract_families_clbr$data$CLBr.A96_vs_CLBr.A60$MASP$limma_logfc,
    "CL14.A60" = extract_families_cl14$data$CL14.A96_vs_CL14.A60$MASP$limma_logfc,
    "CLBr.A96" = extract_families_clbr$data$CLBr.Tryp_vs_CLBr.A96$MASP$limma_logfc,
    "CL14.A96" = extract_families_cl14$data$CL14.Tryp_vs_CL14.A96$MASP$limma_logfc,
    "CLBr.Tryp" = extract_families_clbr$data$CLBr.A60_vs_CLBr.Tryp$MASP$limma_logfc,
    "CL14.Tryp" = extract_families_cl14$data$CL14.A60_vs_CL14.Tryp$MASP$limma_logfc
)
mucin_df <- data.frame(
    "CLBr.A60" = extract_families_clbr$data$CLBr.A96_vs_CLBr.A60$mucin$limma_logfc,
    "CL14.A60" = extract_families_cl14$data$CL14.A96_vs_CL14.A60$mucin$limma_logfc,
    "CLBr.A96" = extract_families_clbr$data$CLBr.Tryp_vs_CLBr.A96$mucin$limma_logfc,
    "CL14.A96" = extract_families_cl14$data$CL14.Tryp_vs_CL14.A96$mucin$limma_logfc,
    "CLBr.Tryp" = extract_families_clbr$data$CLBr.A60_vs_CLBr.Tryp$mucin$limma_logfc,
    "CL14.Tryp" = extract_families_cl14$data$CL14.A60_vs_CL14.Tryp$mucin$limma_logfc
)
sialidase_df <- data.frame(
    "CLBr.A60" = extract_families_clbr$data$CLBr.A96_vs_CLBr.A60$sialidase$limma_logfc,
    "CL14.A60" = extract_families_cl14$data$CL14.A96_vs_CL14.A60$sialidase$limma_logfc,
    "CLBr.A96" = extract_families_clbr$data$CLBr.Tryp_vs_CLBr.A96$sialidase$limma_logfc,
    "CL14.A96" = extract_families_cl14$data$CL14.Tryp_vs_CL14.A96$sialidase$limma_logfc,
    "CLBr.Tryp" = extract_families_clbr$data$CLBr.A60_vs_CLBr.Tryp$sialidase$limma_logfc,
    "CL14.Tryp" = extract_families_cl14$data$CL14.A60_vs_CL14.Tryp$sialidase$limma_logfc
)
rhs_df <- data.frame(
    "CLBr.A60" = extract_families_clbr$data$CLBr.A96_vs_CLBr.A60$RHS$limma_logfc,
    "CL14.A60" = extract_families_cl14$data$CL14.A96_vs_CL14.A60$RHS$limma_logfc,
    "CLBr.A96" = extract_families_clbr$data$CLBr.Tryp_vs_CLBr.A96$RHS$limma_logfc,
    "CL14.A96" = extract_families_cl14$data$CL14.Tryp_vs_CL14.A96$RHS$limma_logfc,
    "CLBr.Tryp" = extract_families_clbr$data$CLBr.A60_vs_CLBr.Tryp$RHS$limma_logfc,
    "CL14.Tryp" = extract_families_cl14$data$CL14.A60_vs_CL14.Tryp$RHS$limma_logfc
)
gp63_df <- data.frame(
    "CLBr.A60" = extract_families_clbr$data$CLBr.A96_vs_CLBr.A60$GP63$limma_logfc,
    "CL14.A60" = extract_families_cl14$data$CL14.A96_vs_CL14.A60$GP63$limma_logfc,
    "CLBr.A96" = extract_families_clbr$data$CLBr.Tryp_vs_CLBr.A96$GP63$limma_logfc,
    "CL14.A96" = extract_families_cl14$data$CL14.Tryp_vs_CL14.A96$GP63$limma_logfc,
    "CLBr.Tryp" = extract_families_clbr$data$CLBr.A60_vs_CLBr.Tryp$GP63$limma_logfc,
    "CL14.Tryp" = extract_families_cl14$data$CL14.A60_vs_CL14.Tryp$GP63$limma_logfc
)

dgf_box <- plot_boxplot(dgf_df)
dgf_box

dgf_bean <- beanplot::beanplot(dgf_df, method="jitter")

masp_box <- plot_boxplot(masp_df)
masp_box

masp_bean <- beanplot::beanplot(masp_df, method="jitter")

mucin_box <- plot_boxplot(mucin_df)
mucin_box

mucin_bean <- beanplot::beanplot(mucin_df, method="jitter")

sialidase_box <- plot_boxplot(sialidase_df)
sialidase_box

sialidase_bean <- beanplot::beanplot(sialidase_df, method="jitter")

rhs_box <- plot_boxplot(rhs_df)
rhs_box

rhs_bean <- beanplot::beanplot(rhs_df, method="jitter")

gp_box <- plot_boxplot(gp63_df)
gp_box

gp_bean <- beanplot::beanplot(gp63_df, method="jitter")

## Compare DGF distributions across strains
cor.test(dgf_df[["CLBr.Tryp"]], dgf_df[["CL14.Tryp"]])
##
##  Pearson's product-moment correlation
##
## data:  dgf_df[["CLBr.Tryp"]] and dgf_df[["CL14.Tryp"]]
## t = 14, df = 510, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4660 0.5909
## sample estimates:
##    cor
## 0.5313
t.test(dgf_df[["CLBr.Tryp"]], dgf_df[["CL14.Tryp"]])
##
##  Welch Two Sample t-test
##
## data:  dgf_df[["CLBr.Tryp"]] and dgf_df[["CL14.Tryp"]]
## t = -5.3, df = 900, p-value = 1e-07
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.3742 -0.1728
## sample estimates:
## mean of x mean of y
##     1.629     1.902
ks.test(dgf_df[["CLBr.Tryp"]], dgf_df[["CL14.Tryp"]])
## Warning in ks.test(dgf_df[["CLBr.Tryp"]], dgf_df[["CL14.Tryp"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  dgf_df[["CLBr.Tryp"]] and dgf_df[["CL14.Tryp"]]
## D = 0.23, p-value = 3e-12
## alternative hypothesis: two-sided
cor.test(dgf_df[["CLBr.A60"]], dgf_df[["CL14.A60"]])
##
##  Pearson's product-moment correlation
##
## data:  dgf_df[["CLBr.A60"]] and dgf_df[["CL14.A60"]]
## t = 4.3, df = 510, p-value = 2e-05
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1033 0.2708
## sample estimates:
##    cor
## 0.1884
t.test(dgf_df[["CLBr.A60"]], dgf_df[["CL14.A60"]])
##
##  Welch Two Sample t-test
##
## data:  dgf_df[["CLBr.A60"]] and dgf_df[["CL14.A60"]]
## t = -16, df = 870, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -1.0877 -0.8473
## sample estimates:
## mean of x mean of y
##   -0.8600    0.1075
ks.test(dgf_df[["CLBr.A60"]], dgf_df[["CL14.A60"]])
## Warning in ks.test(dgf_df[["CLBr.A60"]], dgf_df[["CL14.A60"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  dgf_df[["CLBr.A60"]] and dgf_df[["CL14.A60"]]
## D = 0.58, p-value <2e-16
## alternative hypothesis: two-sided
cor.test(dgf_df[["CLBr.A96"]], dgf_df[["CL14.A96"]])
##
##  Pearson's product-moment correlation
##
## data:  dgf_df[["CLBr.A96"]] and dgf_df[["CL14.A96"]]
## t = 6.1, df = 510, p-value = 2e-09
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1802 0.3419
## sample estimates:
##    cor
## 0.2629
t.test(dgf_df[["CLBr.A96"]], dgf_df[["CL14.A96"]])
##
##  Welch Two Sample t-test
##
## data:  dgf_df[["CLBr.A96"]] and dgf_df[["CL14.A96"]]
## t = 19, df = 770, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  1.114 1.368
## sample estimates:
## mean of x mean of y
##   -0.7688   -2.0098
ks.test(dgf_df[["CLBr.A96"]], dgf_df[["CL14.A96"]])
## Warning in ks.test(dgf_df[["CLBr.A96"]], dgf_df[["CL14.A96"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  dgf_df[["CLBr.A96"]] and dgf_df[["CL14.A96"]]
## D = 0.63, p-value <2e-16
## alternative hypothesis: two-sided
## Compare MASP distributions across strains
cor.test(masp_df[["CLBr.Tryp"]], masp_df[["CL14.Tryp"]])
##
##  Pearson's product-moment correlation
##
## data:  masp_df[["CLBr.Tryp"]] and masp_df[["CL14.Tryp"]]
## t = 43, df = 1300, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7444 0.7891
## sample estimates:
##    cor
## 0.7677
t.test(masp_df[["CLBr.Tryp"]], masp_df[["CL14.Tryp"]])
##
##  Welch Two Sample t-test
##
## data:  masp_df[["CLBr.Tryp"]] and masp_df[["CL14.Tryp"]]
## t = -6, df = 2400, p-value = 2e-09
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.4683 -0.2383
## sample estimates:
## mean of x mean of y
##    -2.049    -1.696
ks.test(masp_df[["CLBr.Tryp"]], masp_df[["CL14.Tryp"]])
## Warning in ks.test(masp_df[["CLBr.Tryp"]], masp_df[["CL14.Tryp"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  masp_df[["CLBr.Tryp"]] and masp_df[["CL14.Tryp"]]
## D = 0.14, p-value = 4e-12
## alternative hypothesis: two-sided
cor.test(masp_df[["CLBr.A60"]], masp_df[["CL14.A60"]])
##
##  Pearson's product-moment correlation
##
## data:  masp_df[["CLBr.A60"]] and masp_df[["CL14.A60"]]
## t = 16, df = 1300, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3505 0.4421
## sample estimates:
##    cor
## 0.3973
t.test(masp_df[["CLBr.A60"]], masp_df[["CL14.A60"]])
##
##  Welch Two Sample t-test
##
## data:  masp_df[["CLBr.A60"]] and masp_df[["CL14.A60"]]
## t = 20, df = 2200, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.8963 1.0940
## sample estimates:
## mean of x mean of y
##    1.3720    0.3769
ks.test(masp_df[["CLBr.A60"]], masp_df[["CL14.A60"]])
## Warning in ks.test(masp_df[["CLBr.A60"]], masp_df[["CL14.A60"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  masp_df[["CLBr.A60"]] and masp_df[["CL14.A60"]]
## D = 0.39, p-value <2e-16
## alternative hypothesis: two-sided
cor.test(masp_df[["CLBr.A96"]], masp_df[["CL14.A96"]])
##
##  Pearson's product-moment correlation
##
## data:  masp_df[["CLBr.A96"]] and masp_df[["CL14.A96"]]
## t = 17, df = 1300, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3750 0.4645
## sample estimates:
##    cor
## 0.4208
t.test(masp_df[["CLBr.A96"]], masp_df[["CL14.A96"]])
##
##  Welch Two Sample t-test
##
## data:  masp_df[["CLBr.A96"]] and masp_df[["CL14.A96"]]
## t = -12, df = 2600, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.7469 -0.5367
## sample estimates:
## mean of x mean of y
##    0.6771    1.3190
ks.test(masp_df[["CLBr.A96"]], masp_df[["CL14.A96"]])
## Warning in ks.test(masp_df[["CLBr.A96"]], masp_df[["CL14.A96"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  masp_df[["CLBr.A96"]] and masp_df[["CL14.A96"]]
## D = 0.34, p-value <2e-16
## alternative hypothesis: two-sided
## Compare MUCIN distributions across strains
cor.test(mucin_df[["CLBr.Tryp"]], mucin_df[["CL14.Tryp"]])
##
##  Pearson's product-moment correlation
##
## data:  mucin_df[["CLBr.Tryp"]] and mucin_df[["CL14.Tryp"]]
## t = 58, df = 2100, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7647 0.7979
## sample estimates:
##    cor
## 0.7819
t.test(mucin_df[["CLBr.Tryp"]], mucin_df[["CL14.Tryp"]])
##
##  Welch Two Sample t-test
##
## data:  mucin_df[["CLBr.Tryp"]] and mucin_df[["CL14.Tryp"]]
## t = -8.8, df = 3900, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.4950 -0.3152
## sample estimates:
## mean of x mean of y
##    -2.027    -1.622
ks.test(mucin_df[["CLBr.Tryp"]], mucin_df[["CL14.Tryp"]])
## Warning in ks.test(mucin_df[["CLBr.Tryp"]], mucin_df[["CL14.Tryp"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  mucin_df[["CLBr.Tryp"]] and mucin_df[["CL14.Tryp"]]
## D = 0.15, p-value <2e-16
## alternative hypothesis: two-sided
cor.test(mucin_df[["CLBr.A60"]], mucin_df[["CL14.A60"]])
##
##  Pearson's product-moment correlation
##
## data:  mucin_df[["CLBr.A60"]] and mucin_df[["CL14.A60"]]
## t = 20, df = 2100, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3627 0.4343
## sample estimates:
##    cor
## 0.3991
t.test(mucin_df[["CLBr.A60"]], mucin_df[["CL14.A60"]])
##
##  Welch Two Sample t-test
##
## data:  mucin_df[["CLBr.A60"]] and mucin_df[["CL14.A60"]]
## t = 26, df = 3700, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.9384 1.0940
## sample estimates:
## mean of x mean of y
##    1.2379    0.2217
ks.test(mucin_df[["CLBr.A60"]], mucin_df[["CL14.A60"]])
## Warning in ks.test(mucin_df[["CLBr.A60"]], mucin_df[["CL14.A60"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  mucin_df[["CLBr.A60"]] and mucin_df[["CL14.A60"]]
## D = 0.36, p-value <2e-16
## alternative hypothesis: two-sided
cor.test(mucin_df[["CLBr.A96"]], mucin_df[["CL14.A96"]])
##
##  Pearson's product-moment correlation
##
## data:  mucin_df[["CLBr.A96"]] and mucin_df[["CL14.A96"]]
## t = 25, df = 2100, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4469 0.5124
## sample estimates:
##    cor
## 0.4804
t.test(mucin_df[["CLBr.A96"]], mucin_df[["CL14.A96"]])
##
##  Welch Two Sample t-test
##
## data:  mucin_df[["CLBr.A96"]] and mucin_df[["CL14.A96"]]
## t = -14, df = 4200, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.6947 -0.5276
## sample estimates:
## mean of x mean of y
##    0.7891    1.4002
ks.test(mucin_df[["CLBr.A96"]], mucin_df[["CL14.A96"]])
## Warning in ks.test(mucin_df[["CLBr.A96"]], mucin_df[["CL14.A96"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  mucin_df[["CLBr.A96"]] and mucin_df[["CL14.A96"]]
## D = 0.29, p-value <2e-16
## alternative hypothesis: two-sided
## Compare SIALIDASE distributions across strains
cor.test(sialidase_df[["CLBr.Tryp"]], sialidase_df[["CL14.Tryp"]])
##
##  Pearson's product-moment correlation
##
## data:  sialidase_df[["CLBr.Tryp"]] and sialidase_df[["CL14.Tryp"]]
## t = 76, df = 1500, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8836 0.9042
## sample estimates:
##    cor
## 0.8944
t.test(sialidase_df[["CLBr.Tryp"]], sialidase_df[["CL14.Tryp"]])
##
##  Welch Two Sample t-test
##
## data:  sialidase_df[["CLBr.Tryp"]] and sialidase_df[["CL14.Tryp"]]
## t = -9.3, df = 2700, p-value <2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.8029 -0.5221
## sample estimates:
## mean of x mean of y
##    -1.682    -1.019
ks.test(sialidase_df[["CLBr.Tryp"]], sialidase_df[["CL14.Tryp"]])
## Warning in ks.test(sialidase_df[["CLBr.Tryp"]], sialidase_df[["CL14.Tryp"]]): p-value will
## be approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  sialidase_df[["CLBr.Tryp"]] and sialidase_df[["CL14.Tryp"]]
## D = 0.17, p-value <2e-16
## alternative hypothesis: two-sided
cor.test(sialidase_df[["CLBr.A60"]], sialidase_df[["CL14.A60"]])
##
##  Pearson's product-moment correlation
##
## data:  sialidase_df[["CLBr.A60"]] and sialidase_df[["CL14.A60"]]
## t = 9, df = 1500, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1796 0.2767
## sample estimates:
##    cor
## 0.2287
t.test(sialidase_df[["CLBr.A60"]], sialidase_df[["CL14.A60"]])
##
##  Welch Two Sample t-test
##
## data:  sialidase_df[["CLBr.A60"]] and sialidase_df[["CL14.A60"]]
## t = 6.1, df = 2900, p-value = 9e-10
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.2024 0.3921
## sample estimates:
## mean of x mean of y
##    0.4314    0.1342
ks.test(sialidase_df[["CLBr.A60"]], sialidase_df[["CL14.A60"]])
## Warning in ks.test(sialidase_df[["CLBr.A60"]], sialidase_df[["CL14.A60"]]): p-value will
## be approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  sialidase_df[["CLBr.A60"]] and sialidase_df[["CL14.A60"]]
## D = 0.15, p-value = 6e-15
## alternative hypothesis: two-sided
cor.test(sialidase_df[["CLBr.A96"]], sialidase_df[["CL14.A96"]])
##
##  Pearson's product-moment correlation
##
## data:  sialidase_df[["CLBr.A96"]] and sialidase_df[["CL14.A96"]]
## t = 31, df = 1500, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5991 0.6609
## sample estimates:
##   cor
## 0.631
t.test(sialidase_df[["CLBr.A96"]], sialidase_df[["CL14.A96"]])
##
##  Welch Two Sample t-test
##
## data:  sialidase_df[["CLBr.A96"]] and sialidase_df[["CL14.A96"]]
## t = 5.3, df = 2700, p-value = 1e-07
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.2295 0.5011
## sample estimates:
## mean of x mean of y
##    1.2501    0.8848
ks.test(sialidase_df[["CLBr.A96"]], sialidase_df[["CL14.A96"]])
## Warning in ks.test(sialidase_df[["CLBr.A96"]], sialidase_df[["CL14.A96"]]): p-value will
## be approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  sialidase_df[["CLBr.A96"]] and sialidase_df[["CL14.A96"]]
## D = 0.085, p-value = 5e-05
## alternative hypothesis: two-sided
## Compare RHS distributions across strains
cor.test(rhs_df[["CLBr.Tryp"]], rhs_df[["CL14.Tryp"]])
##
##  Pearson's product-moment correlation
##
## data:  rhs_df[["CLBr.Tryp"]] and rhs_df[["CL14.Tryp"]]
## t = 19, df = 720, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5327 0.6295
## sample estimates:
##    cor
## 0.5832
t.test(rhs_df[["CLBr.Tryp"]], rhs_df[["CL14.Tryp"]])
##
##  Welch Two Sample t-test
##
## data:  rhs_df[["CLBr.Tryp"]] and rhs_df[["CL14.Tryp"]]
## t = -1.7, df = 1300, p-value = 0.08
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.143908  0.009066
## sample estimates:
## mean of x mean of y
##    0.3241    0.3915
ks.test(rhs_df[["CLBr.Tryp"]], rhs_df[["CL14.Tryp"]])
## Warning in ks.test(rhs_df[["CLBr.Tryp"]], rhs_df[["CL14.Tryp"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  rhs_df[["CLBr.Tryp"]] and rhs_df[["CL14.Tryp"]]
## D = 0.12, p-value = 3e-05
## alternative hypothesis: two-sided
cor.test(rhs_df[["CLBr.A60"]], rhs_df[["CL14.A60"]])
##
##  Pearson's product-moment correlation
##
## data:  rhs_df[["CLBr.A60"]] and rhs_df[["CL14.A60"]]
## t = 3.9, df = 720, p-value = 1e-04
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.07013 0.21360
## sample estimates:
##    cor
## 0.1426
t.test(rhs_df[["CLBr.A60"]], rhs_df[["CL14.A60"]])
##
##  Welch Two Sample t-test
##
## data:  rhs_df[["CLBr.A60"]] and rhs_df[["CL14.A60"]]
## t = -6.5, df = 1000, p-value = 9e-11
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.4716 -0.2541
## sample estimates:
## mean of x mean of y
##   -0.1563    0.2066
ks.test(rhs_df[["CLBr.A60"]], rhs_df[["CL14.A60"]])
## Warning in ks.test(rhs_df[["CLBr.A60"]], rhs_df[["CL14.A60"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  rhs_df[["CLBr.A60"]] and rhs_df[["CL14.A60"]]
## D = 0.15, p-value = 7e-08
## alternative hypothesis: two-sided
cor.test(rhs_df[["CLBr.A96"]], rhs_df[["CL14.A96"]])
##
##  Pearson's product-moment correlation
##
## data:  rhs_df[["CLBr.A96"]] and rhs_df[["CL14.A96"]]
## t = 7.8, df = 720, p-value = 3e-14
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2096 0.3448
## sample estimates:
##    cor
## 0.2786
t.test(rhs_df[["CLBr.A96"]], rhs_df[["CL14.A96"]])
##
##  Welch Two Sample t-test
##
## data:  rhs_df[["CLBr.A96"]] and rhs_df[["CL14.A96"]]
## t = 7.1, df = 1000, p-value = 2e-12
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.3122 0.5484
## sample estimates:
## mean of x mean of y
##   -0.1678   -0.5981
ks.test(rhs_df[["CLBr.A96"]], rhs_df[["CL14.A96"]])
## Warning in ks.test(rhs_df[["CLBr.A96"]], rhs_df[["CL14.A96"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  rhs_df[["CLBr.A96"]] and rhs_df[["CL14.A96"]]
## D = 0.17, p-value = 1e-09
## alternative hypothesis: two-sided
## Compare GP63 distributions across strains
cor.test(gp63_df[["CLBr.Tryp"]], gp63_df[["CL14.Tryp"]])
##
##  Pearson's product-moment correlation
##
## data:  gp63_df[["CLBr.Tryp"]] and gp63_df[["CL14.Tryp"]]
## t = 32, df = 340, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8363 0.8902
## sample estimates:
##    cor
## 0.8657
t.test(gp63_df[["CLBr.Tryp"]], gp63_df[["CL14.Tryp"]])
##
##  Welch Two Sample t-test
##
## data:  gp63_df[["CLBr.Tryp"]] and gp63_df[["CL14.Tryp"]]
## t = -1, df = 600, p-value = 0.3
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.3761  0.1225
## sample estimates:
## mean of x mean of y
##   -0.4112   -0.2844
ks.test(gp63_df[["CLBr.Tryp"]], gp63_df[["CL14.Tryp"]])
## Warning in ks.test(gp63_df[["CLBr.Tryp"]], gp63_df[["CL14.Tryp"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  gp63_df[["CLBr.Tryp"]] and gp63_df[["CL14.Tryp"]]
## D = 0.13, p-value = 0.005
## alternative hypothesis: two-sided
cor.test(gp63_df[["CLBr.A60"]], gp63_df[["CL14.A60"]])
##
##  Pearson's product-moment correlation
##
## data:  gp63_df[["CLBr.A60"]] and gp63_df[["CL14.A60"]]
## t = 6.9, df = 340, p-value = 3e-11
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2549 0.4421
## sample estimates:
##   cor
## 0.352
t.test(gp63_df[["CLBr.A60"]], gp63_df[["CL14.A60"]])
##
##  Welch Two Sample t-test
##
## data:  gp63_df[["CLBr.A60"]] and gp63_df[["CL14.A60"]]
## t = 1.6, df = 550, p-value = 0.1
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.02863  0.29197
## sample estimates:
## mean of x mean of y
##  -0.04841  -0.18008
ks.test(gp63_df[["CLBr.A60"]], gp63_df[["CL14.A60"]])
## Warning in ks.test(gp63_df[["CLBr.A60"]], gp63_df[["CL14.A60"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  gp63_df[["CLBr.A60"]] and gp63_df[["CL14.A60"]]
## D = 0.15, p-value = 9e-04
## alternative hypothesis: two-sided
cor.test(gp63_df[["CLBr.A96"]], gp63_df[["CL14.A96"]])
##
##  Pearson's product-moment correlation
##
## data:  gp63_df[["CLBr.A96"]] and gp63_df[["CL14.A96"]]
## t = 18, df = 340, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6466 0.7546
## sample estimates:
##    cor
## 0.7047
t.test(gp63_df[["CLBr.A96"]], gp63_df[["CL14.A96"]])
##
##  Welch Two Sample t-test
##
## data:  gp63_df[["CLBr.A96"]] and gp63_df[["CL14.A96"]]
## t = -0.048, df = 670, p-value = 1
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.2034  0.1937
## sample estimates:
## mean of x mean of y
##    0.4596    0.4644
ks.test(gp63_df[["CLBr.A96"]], gp63_df[["CL14.A96"]])
## Warning in ks.test(gp63_df[["CLBr.A96"]], gp63_df[["CL14.A96"]]): p-value will be
## approximate in the presence of ties
##
##  Two-sample Kolmogorov-Smirnov test
##
## data:  gp63_df[["CLBr.A96"]] and gp63_df[["CL14.A96"]]
## D = 0.059, p-value = 0.6
## alternative hypothesis: two-sided

7 Strain significance

8 CLBr significance

clbr_times_sig <- sm(extract_significant_genes(
    clb_compare_times, according_to="limma",
    excel=paste0("excel/clb_times_sig-v", ver, ".xlsx")))

9 CL14 significance

cl14_times_sig <- sm(extract_significant_genes(
    cl14_compare_times, according_to="limma",
    excel=paste0("excel/cl14_times_sig-v", ver, ".xlsx")))

10 Sanity check on route to an improved non-rpkm expression value

I want to make 100% certain that when I plot what I call the coefficient scatter plot, that the dots on the screen are in fact representative of the post-limma/deseq/edger values.

I keep a set of tables in my limma output called ‘identity_tables’ which in theory are the pre-contrast values for each gene by condition. If I am 100% correct, then I should be able to recreate the logFC from topTable() by takinng two of these and subtracting them.

test_genes_clbr_tryp <- cl_all_de_sva[["limma"]][["identity_tables"]][["CLBr.Tryp"]]
test_genes_clbr_a60 <- cl_all_de_sva[["limma"]][["identity_tables"]][["CLBr.A60"]]
test_genes_clbr_contrast <- cl_all_de_sva[["limma"]][["all_tables"]][["CLBr.Tryp_vs_CLBr.A60"]]

test_genes_clbr_tryp["TcCLB.511211.160", ]
##                  logFC AveExpr     t   P.Value adj.P.Val     B
## TcCLB.511211.160 10.32   11.39 92.26 2.952e-24 5.764e-23 45.43
test_genes_clbr_a60["TcCLB.511211.160", ]
##                  logFC AveExpr     t  P.Value adj.P.Val  B
## TcCLB.511211.160 11.65   11.39 138.6 3.09e-27 2.148e-25 52
test_genes_clbr_contrast["TcCLB.511211.160", ]
##                   logFC AveExpr      t   P.Value adj.P.Val     B
## TcCLB.511211.160 -1.328   11.39 -9.528 3.342e-08 4.509e-07 8.559
10.77 - 11.64
## [1] -0.87

On the other hand, I also want to have a standard error / variance estimate to come along with this data. I have two likely places to acquire that:

  1. As per Hector’s email, take the logFC from the identity table and divide it by the t statistic in the same table. This should provide standard error.
  2. eBayes() or perhaps contrast.fit() I am not sure which, generates a table named ‘stdev.unscaled’ for every gene/condition. This may be collected.

With that in mind, I wrote a little function get_pairwise_gene_abundances() that collects these in four tables: expression_values, t_values, error_values, and stdev_values.

abundances <- get_pairwise_gene_abundances(cl_all_de_sva)
tmp_expression <- abundances[["expression_values"]]
tmp_annotations <- Biobase::fData(cl_all_kexptv1[["expressionset"]])
tmp_expression <- merge(tmp_annotations, tmp_expression, by="row.names")
rownames(tmp_expression) <- tmp_expression[["Row.names"]]
tmp_expression <- tmp_expression[, -1]
tmp_expression <- tmp_expression[, c("txchrom", "txstrand", "genedescription", "width",
                                     "CL14.A60", "CL14.A96", "CL14.Tryp",
                                     "CLBr.A60", "CLBr.A96", "CLBr.Tryp")]
tmp_errors <- abundances[["another_error"]]
tmp_errors <- tmp_errors[, 1:6]
colnames(tmp_errors) <- c("CL14.A60_se", "CL14.A96_se", "CL14.Tryp_se",
                          "CLBr.A60_se", "CLBr_A96_se", "CL14.Tryp_se")
tmp_expression <- merge(tmp_expression, tmp_errors, by="row.names")
rownames(tmp_expression) <- tmp_expression[["Row.names"]]
tmp_expression <- tmp_expression[, -1]
expression_written <- write_xls(data=tmp_expression,
                                sheet="expression_values",
                                title="Table S3. Expression values making up the contrast logFCs (with standard error values obtained by dividing the expression by the t-statistic.)")
##error_written <- write_xls(data=tmp_errors, start_col=16, rownames=FALSE,
##                           ##title="Error value obtained by dividing the expression / t-statistic",
##                           sheet="expression_values",
##                           wb=expression_written[["workbook"]])
openxlsx::saveWorkbook(wb=expression_written[["workbook"]],
                       file=paste0("excel/written_abundance_test-v", ver, ".xlsx"),
                       overwrite=TRUE)

##canaries <- c("TcCLB.511511.6", "TcCLB.511511.3", "TcCLB.511727.190", "TcCLB.469785.40",
##              "TcCLB.506563.10", "TcCLB.511127.10", "TcCLB.504005.6", "TcCLB.507611.300")
canaries <- c("TcCLB.511727.190", "TcCLB.469785.40",
              "TcCLB.506563.10", "TcCLB.511127.10",
              "TcCLB.504005.6", "TcCLB.507611.300")
## Reorder the data to match the existing figure
conditions <- c("CLBr.A60", "CLBr.A96", "CLBr.Tryp",
                "CL14.A60", "CL14.A96", "CL14.Tryp")
expressions <- abundances[["expression_values"]][, conditions]
stdevs <- abundances[["stdev_values"]][, conditions]
errs <- abundances[["error_values"]][, conditions]
adjp_values <- list()
library(ggplot2)
for (num in 1:length(canaries)) {
    canary <- canaries[num]
    point <- 2 ^ expressions[canary, ]
    ##stdev <- 2 ^ stdevs[canary, ]
    err <- 2 ^ errs[canary, ]
    my_colors <- c("blue","green","red","blue","green","red")
    canary_df <- data.frame(
        "id" = names(point),
        "values" = as.numeric(point),
        "colors" = my_colors,
        "err" = as.numeric(err),
        "plus_err" = as.numeric(err) + as.numeric(point),
        "minus_err" = as.numeric(point) - as.numeric(err))
    print(canary_df)
    fun_barplot <- ggplot2::ggplot(data=canary_df, colour=my_colors,
                                   aes_string(x="id", y="values")) +
        ggplot2::geom_bar(stat="identity", colour="black", fill=my_colors) +
        ggplot2::theme_bw() + ggplot2::ylab("Expression Value") +
        ggplot2::ggtitle(canary) +
        ggplot2::geom_errorbar(aes(ymax=plus_err, ymin=minus_err), width=0.3)
    pdf_filename <- paste0("images/", num, "_", canary, "_expression.pdf")
    pdf(file=pdf_filename)
    print(fun_barplot)
    dev.off()
    ## Now extract the adjusted p-values from the pairwise contrasts...
    ## test_genes_clbr_contrast <- cl_all_de_sva[["limma"]][["all_tables"]][["CLBr.Tryp_vs_CLBr.A60"]]
    adjps <- c()
    the_contrasts <- c("CLBr.Tryp_vs_CL14.Tryp", "CLBr.A60_vs_CL14.A60", "CLBr.A96_vs_CL14.A96")
    for (contr in the_contrasts) {
        adjp <- cl_all_de_sva[["limma"]][["all_tables"]][[contr]][canary, "adj.P.Val"]
        adjps[[contr]] <- adjp
    }
    adjp_values[[canary]] <- adjps
}
##          id values colors   err plus_err minus_err
## 1  CLBr.A60 150.12   blue 1.045   151.17    149.08
## 2  CLBr.A96 114.25  green 1.042   115.29    113.20
## 3 CLBr.Tryp  25.81    red 1.056    26.87     24.76
## 4  CL14.A60 136.52   blue 1.050   137.57    135.47
## 5  CL14.A96 144.31  green 1.046   145.35    143.26
## 6 CL14.Tryp  35.21    red 1.042    36.25     34.17
##          id values colors   err plus_err minus_err
## 1  CLBr.A60 48.168   blue 1.092   49.260    47.076
## 2  CLBr.A96 21.917  green 1.074   22.991    20.844
## 3 CLBr.Tryp  6.521    red 1.112    7.633     5.409
## 4  CL14.A60 33.918   blue 1.099   35.017    32.820
## 5  CL14.A96 29.857  green 1.103   30.960    28.754
## 6 CL14.Tryp 12.042    red 1.077   13.119    10.965
##          id values colors   err plus_err minus_err
## 1  CLBr.A60  51.55   blue 1.097    52.65     50.46
## 2  CLBr.A96  80.45  green 1.064    81.51     79.39
## 3 CLBr.Tryp  26.72    red 1.090    27.81     25.63
## 4  CL14.A60  53.82   blue 1.090    54.91     52.73
## 5  CL14.A96  45.82  green 1.097    46.92     44.73
## 6 CL14.Tryp  20.63    red 1.069    21.70     19.57
##          id values colors   err plus_err minus_err
## 1  CLBr.A60 1.1526   blue 1.635    2.788   -0.4824
## 2  CLBr.A96 2.5368  green 1.255    3.792    1.2814
## 3 CLBr.Tryp 2.7454    red 1.253    3.999    1.4921
## 4  CL14.A60 2.2207   blue 1.471    3.692    0.7494
## 5  CL14.A96 0.8299  green 1.635    2.465   -0.8050
## 6 CL14.Tryp 2.5527    red 1.206    3.759    1.3468
##          id values colors   err plus_err minus_err
## 1  CLBr.A60  41.70   blue 1.069    42.77     40.63
## 2  CLBr.A96  97.21  green 1.040    98.25     96.17
## 3 CLBr.Tryp  23.98    red 1.057    25.04     22.93
## 4  CL14.A60  47.57   blue 1.059    48.63     46.51
## 5  CL14.A96  80.50  green 1.051    81.56     79.45
## 6 CL14.Tryp  44.20    red 1.040    45.24     43.16
##          id values colors   err plus_err minus_err
## 1  CLBr.A60  19.73   blue 1.118    20.84     18.61
## 2  CLBr.A96  19.23  green 1.066    20.29     18.16
## 3 CLBr.Tryp  18.55    red 1.075    19.62     17.47
## 4  CL14.A60  22.78   blue 1.098    23.88     21.69
## 5  CL14.A96  14.37  green 1.131    15.50     13.24
## 6 CL14.Tryp  58.00    red 1.047    59.05     56.95
## A query from Santuza, generate p-values between some of these bars.
## How do I do that when I extracted the values and variances from limma without the
## associated raw values?
## hmm...
adjp_values
## $TcCLB.511727.190
## CLBr.Tryp_vs_CL14.Tryp   CLBr.A60_vs_CL14.A60   CLBr.A96_vs_CL14.A96
##               0.001010               0.366300               0.003662
##
## $TcCLB.469785.40
## CLBr.Tryp_vs_CL14.Tryp   CLBr.A60_vs_CL14.A60   CLBr.A96_vs_CL14.A96
##                 0.0095                 0.2082                 0.1439
##
## $TcCLB.506563.10
## CLBr.Tryp_vs_CL14.Tryp   CLBr.A60_vs_CL14.A60   CLBr.A96_vs_CL14.A96
##              6.988e-03              8.092e-01              1.186e-05
##
## $TcCLB.511127.10
## CLBr.Tryp_vs_CL14.Tryp   CLBr.A60_vs_CL14.A60   CLBr.A96_vs_CL14.A96
##                0.79790                0.36950                0.02504
##
## $TcCLB.504005.6
## CLBr.Tryp_vs_CL14.Tryp   CLBr.A60_vs_CL14.A60   CLBr.A96_vs_CL14.A96
##              0.0003928              0.6424000              0.1738000
##
## $TcCLB.507611.300
## CLBr.Tryp_vs_CL14.Tryp   CLBr.A60_vs_CL14.A60   CLBr.A96_vs_CL14.A96
##              4.366e-07              7.122e-01              2.317e-01

11 Sanity checks

The following block is an attempt to ensure that my previous analyses still make sense. In addition, I am looking to extract the abundances of some transcripts following voom() etc.

abundance_expt <- sm(create_expt(
    metadata="sample_sheets/cl14clbr_samples_combined_retained.xlsx",
    gene_info=all_genes,
    file_column="clbrenerfile"))
abundance_expt <- expt_subset(abundance_expt, subset=outlier_subset)
abundance_written <- write_expt(abundance_expt, excel="excel/retained_samples_written.xlsx",
                                filter=TRUE, transform="log2", norm="quant", convert="raw",
                                batch="sva")
## Writing the legend.
## Writing the raw reads.
## Graphing the raw reads.
## There is just one batch in this data.
## There is just one batch in this data.
## Writing the normalized reads.
## Graphing the normalized reads.
## Writing the median reads by factor.
## The factor CL14.A60 has 3 rows.
## The factor CL14.A96 has 3 rows.
## The factor CL14.Epi has 3 rows.
## The factor CL14.Tryp has 3 rows.
## The factor CLBr.A60 has 3 rows.
## The factor CLBr.A96 has 3 rows.
## The factor CLBr.Epi has 3 rows.
## The factor CLBr.Tryp has 2 rows.
abundance_expt <- sm(normalize_expt(abundance_expt, filter=TRUE))
abundances_pairwise <- sm(all_pairwise(abundance_expt, model_batch="sva",
                                       which_voom="limma", edger_method="long"))
limma_pairwise_result <- sm(limma_pairwise(abundance_expt, model_batch="sva", which_voom="limma"))
deseq_pairwise_result <- sm(deseq_pairwise(abundance_expt, model_batch="sva", which_voom="limma"))
edger_pairwise_result <- sm(edger_pairwise(abundance_expt, model_batch="sva", which_voom="limma"))
abundances_written <- sm(combine_de_tables(abundances_pairwise))
abundances_sig <- extract_significant_genes(abundances_written)
## Writing a legend of columns.
## Writing excel data sheet 0/28: CL14.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1824 genes.
## After (adj)p filter, the down genes table has 1944 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 815 genes.
## After fold change filter, the down genes table has 862 genes.
## Writing excel data sheet 1/28: CL14.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2439 genes.
## After (adj)p filter, the down genes table has 3460 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 990 genes.
## After fold change filter, the down genes table has 853 genes.
## Writing excel data sheet 2/28: CL14.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5106 genes.
## After (adj)p filter, the down genes table has 7158 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2670 genes.
## After fold change filter, the down genes table has 2603 genes.
## Writing excel data sheet 3/28: CLBr.A60_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1390 genes.
## After (adj)p filter, the down genes table has 1316 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 531 genes.
## After fold change filter, the down genes table has 561 genes.
## Writing excel data sheet 4/28: CLBr.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4227 genes.
## After (adj)p filter, the down genes table has 7007 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2311 genes.
## After fold change filter, the down genes table has 2460 genes.
## Writing excel data sheet 5/28: CLBr.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4798 genes.
## After (adj)p filter, the down genes table has 7193 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2521 genes.
## After fold change filter, the down genes table has 2311 genes.
## Writing excel data sheet 6/28: CLBr.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5924 genes.
## After (adj)p filter, the down genes table has 9088 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3563 genes.
## After fold change filter, the down genes table has 4914 genes.
## Writing excel data sheet 7/28: CL14.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3718 genes.
## After (adj)p filter, the down genes table has 4473 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1414 genes.
## After fold change filter, the down genes table has 1444 genes.
## Writing excel data sheet 8/28: CL14.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6204 genes.
## After (adj)p filter, the down genes table has 7286 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3582 genes.
## After fold change filter, the down genes table has 3099 genes.
## Writing excel data sheet 9/28: CLBr.A60_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 256 genes.
## After (adj)p filter, the down genes table has 682 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 105 genes.
## After fold change filter, the down genes table has 199 genes.
## Writing excel data sheet 10/28: CLBr.A96_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2685 genes.
## After (adj)p filter, the down genes table has 3719 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1445 genes.
## After fold change filter, the down genes table has 713 genes.
## Writing excel data sheet 11/28: CLBr.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3565 genes.
## After (adj)p filter, the down genes table has 5005 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1616 genes.
## After fold change filter, the down genes table has 982 genes.
## Writing excel data sheet 12/28: CLBr.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5327 genes.
## After (adj)p filter, the down genes table has 7885 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3017 genes.
## After fold change filter, the down genes table has 3677 genes.
## Writing excel data sheet 13/28: CL14.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7202 genes.
## After (adj)p filter, the down genes table has 8378 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3384 genes.
## After fold change filter, the down genes table has 3395 genes.
## Writing excel data sheet 14/28: CLBr.A60_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4237 genes.
## After (adj)p filter, the down genes table has 3090 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1290 genes.
## After fold change filter, the down genes table has 1419 genes.
## Writing excel data sheet 15/28: CLBr.A96_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5979 genes.
## After (adj)p filter, the down genes table has 7377 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2702 genes.
## After fold change filter, the down genes table has 2643 genes.
## Writing excel data sheet 16/28: CLBr.Epi_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4921 genes.
## After (adj)p filter, the down genes table has 6202 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1578 genes.
## After fold change filter, the down genes table has 999 genes.
## Writing excel data sheet 17/28: CLBr.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6979 genes.
## After (adj)p filter, the down genes table has 9208 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3773 genes.
## After fold change filter, the down genes table has 4662 genes.
## Writing excel data sheet 18/28: CLBr.A60_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7356 genes.
## After (adj)p filter, the down genes table has 5624 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2932 genes.
## After fold change filter, the down genes table has 3524 genes.
## Writing excel data sheet 19/28: CLBr.A96_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6032 genes.
## After (adj)p filter, the down genes table has 6731 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2394 genes.
## After fold change filter, the down genes table has 2928 genes.
## Writing excel data sheet 20/28: CLBr.Epi_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7506 genes.
## After (adj)p filter, the down genes table has 8078 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3554 genes.
## After fold change filter, the down genes table has 3725 genes.
## Writing excel data sheet 21/28: CLBr.Tryp_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4130 genes.
## After (adj)p filter, the down genes table has 6171 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1714 genes.
## After fold change filter, the down genes table has 2026 genes.
## Writing excel data sheet 22/28: CLBr.A96_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3014 genes.
## After (adj)p filter, the down genes table has 4377 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1764 genes.
## After fold change filter, the down genes table has 955 genes.
## Writing excel data sheet 23/28: CLBr.Epi_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3600 genes.
## After (adj)p filter, the down genes table has 5494 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1792 genes.
## After fold change filter, the down genes table has 1014 genes.
## Writing excel data sheet 24/28: CLBr.Tryp_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4972 genes.
## After (adj)p filter, the down genes table has 8069 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3034 genes.
## After fold change filter, the down genes table has 3836 genes.
## Writing excel data sheet 25/28: CLBr.Epi_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5916 genes.
## After (adj)p filter, the down genes table has 6108 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2389 genes.
## After fold change filter, the down genes table has 2284 genes.
## Writing excel data sheet 26/28: CLBr.Tryp_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5194 genes.
## After (adj)p filter, the down genes table has 6540 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2209 genes.
## After fold change filter, the down genes table has 2102 genes.
## Writing excel data sheet 27/28: CLBr.Tryp_vs_CLBr.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6644 genes.
## After (adj)p filter, the down genes table has 8201 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3035 genes.
## After fold change filter, the down genes table has 3773 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/28: Writing excel data sheet up_1limma_CL14.A96_vs_CL14.A60
## 1/28: Writing excel data sheet down_1limma_CL14.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 2/28: Writing excel data sheet up_2limma_CL14.Epi_vs_CL14.A60
## 2/28: Writing excel data sheet down_2limma_CL14.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 3/28: Writing excel data sheet up_3limma_CL14.Tryp_vs_CL14.A60
## 3/28: Writing excel data sheet down_3limma_CL14.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 4/28: Writing excel data sheet up_4limma_CLBr.A60_vs_CL14.A60
## 4/28: Writing excel data sheet down_4limma_CLBr.A60_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 5/28: Writing excel data sheet up_5limma_CLBr.A96_vs_CL14.A60
## 5/28: Writing excel data sheet down_5limma_CLBr.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 6/28: Writing excel data sheet up_6limma_CLBr.Epi_vs_CL14.A60
## 6/28: Writing excel data sheet down_6limma_CLBr.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 7/28: Writing excel data sheet up_7limma_CLBr.Tryp_vs_CL14.A60
## 7/28: Writing excel data sheet down_7limma_CLBr.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 8/28: Writing excel data sheet up_8limma_CL14.Epi_vs_CL14.A96
## 8/28: Writing excel data sheet down_8limma_CL14.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 9/28: Writing excel data sheet up_9limma_CL14.Tryp_vs_CL14.A96
## 9/28: Writing excel data sheet down_9limma_CL14.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 10/28: Writing excel data sheet up_10limma_CLBr.A60_vs_CL14.A96
## 10/28: Writing excel data sheet down_10limma_CLBr.A60_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 11/28: Writing excel data sheet up_11limma_CLBr.A96_vs_CL14.A96
## 11/28: Writing excel data sheet down_11limma_CLBr.A96_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 12/28: Writing excel data sheet up_12limma_CLBr.Epi_vs_CL14.A96
## 12/28: Writing excel data sheet down_12limma_CLBr.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet up_13limma_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet down_13limma_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet up_14limma_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet down_14limma_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 15/28: Writing excel data sheet up_15limma_CLBr.A60_vs_CL14.Epi
## 15/28: Writing excel data sheet down_15limma_CLBr.A60_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 16/28: Writing excel data sheet up_16limma_CLBr.A96_vs_CL14.Epi
## 16/28: Writing excel data sheet down_16limma_CLBr.A96_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 17/28: Writing excel data sheet up_17limma_CLBr.Epi_vs_CL14.Epi
## 17/28: Writing excel data sheet down_17limma_CLBr.Epi_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet up_18limma_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet down_18limma_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet up_19limma_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet down_19limma_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet up_20limma_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet down_20limma_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet up_21limma_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet down_21limma_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet up_22limma_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet down_22limma_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## hmph, still too long, truncating to 30 characters.
## 23/28: Writing excel data sheet up_23limma_CLBr.A96_vs_CLBr.A60
## 23/28: Writing excel data sheet down_23limma_CLBr.A96_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 24/28: Writing excel data sheet up_24limma_CLBr.Epi_vs_CLBr.A60
## 24/28: Writing excel data sheet down_24limma_CLBr.Epi_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet up_25limma_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet down_25limma_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 26/28: Writing excel data sheet up_26limma_CLBr.Epi_vs_CLBr.A96
## 26/28: Writing excel data sheet down_26limma_CLBr.Epi_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet up_27limma_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet down_27limma_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet up_28limma_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet down_28limma_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## Writing excel data sheet 28/28: CL14.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4434 genes.
## After (adj)p filter, the down genes table has 1298 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2538 genes.
## After fold change filter, the down genes table has 272 genes.
## Writing excel data sheet 29/28: CL14.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3898 genes.
## After (adj)p filter, the down genes table has 2444 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2104 genes.
## After fold change filter, the down genes table has 732 genes.
## Writing excel data sheet 30/28: CL14.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7908 genes.
## After (adj)p filter, the down genes table has 4514 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4693 genes.
## After fold change filter, the down genes table has 1212 genes.
## Writing excel data sheet 31/28: CLBr.A60_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2505 genes.
## After (adj)p filter, the down genes table has 1782 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1275 genes.
## After fold change filter, the down genes table has 650 genes.
## Writing excel data sheet 32/28: CLBr.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6432 genes.
## After (adj)p filter, the down genes table has 3508 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4035 genes.
## After fold change filter, the down genes table has 589 genes.
## Writing excel data sheet 33/28: CLBr.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7785 genes.
## After (adj)p filter, the down genes table has 4068 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4545 genes.
## After fold change filter, the down genes table has 932 genes.
## Writing excel data sheet 34/28: CLBr.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 8975 genes.
## After (adj)p filter, the down genes table has 5370 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 6177 genes.
## After fold change filter, the down genes table has 1909 genes.
## Writing excel data sheet 35/28: CL14.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3004 genes.
## After (adj)p filter, the down genes table has 5762 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 943 genes.
## After fold change filter, the down genes table has 2745 genes.
## Writing excel data sheet 36/28: CL14.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6492 genes.
## After (adj)p filter, the down genes table has 6458 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3741 genes.
## After fold change filter, the down genes table has 2739 genes.
## Writing excel data sheet 37/28: CLBr.A60_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 145 genes.
## After (adj)p filter, the down genes table has 1629 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 64 genes.
## After fold change filter, the down genes table has 779 genes.
## Writing excel data sheet 38/28: CLBr.A96_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2910 genes.
## After (adj)p filter, the down genes table has 2989 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1753 genes.
## After fold change filter, the down genes table has 438 genes.
## Writing excel data sheet 39/28: CLBr.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4072 genes.
## After (adj)p filter, the down genes table has 3973 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1754 genes.
## After fold change filter, the down genes table has 954 genes.
## Writing excel data sheet 40/28: CLBr.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6252 genes.
## After (adj)p filter, the down genes table has 5450 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3828 genes.
## After fold change filter, the down genes table has 1869 genes.
## Writing excel data sheet 41/28: CL14.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 8406 genes.
## After (adj)p filter, the down genes table has 6131 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4835 genes.
## After fold change filter, the down genes table has 2568 genes.
## Writing excel data sheet 42/28: CLBr.A60_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3813 genes.
## After (adj)p filter, the down genes table has 3784 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1462 genes.
## After fold change filter, the down genes table has 1584 genes.
## Writing excel data sheet 43/28: CLBr.A96_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6658 genes.
## After (adj)p filter, the down genes table has 4666 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3795 genes.
## After fold change filter, the down genes table has 1270 genes.
## Writing excel data sheet 44/28: CLBr.Epi_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6541 genes.
## After (adj)p filter, the down genes table has 3208 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2881 genes.
## After fold change filter, the down genes table has 410 genes.
## Writing excel data sheet 45/28: CLBr.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 8692 genes.
## After (adj)p filter, the down genes table has 5881 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 5603 genes.
## After fold change filter, the down genes table has 2313 genes.
## Writing excel data sheet 46/28: CLBr.A60_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5340 genes.
## After (adj)p filter, the down genes table has 7331 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2155 genes.
## After fold change filter, the down genes table has 4594 genes.
## Writing excel data sheet 47/28: CLBr.A96_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4921 genes.
## After (adj)p filter, the down genes table has 6119 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2139 genes.
## After fold change filter, the down genes table has 2666 genes.
## Writing excel data sheet 48/28: CLBr.Epi_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6884 genes.
## After (adj)p filter, the down genes table has 7144 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3468 genes.
## After fold change filter, the down genes table has 3737 genes.
## Writing excel data sheet 49/28: CLBr.Tryp_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3934 genes.
## After (adj)p filter, the down genes table has 2662 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2071 genes.
## After fold change filter, the down genes table has 815 genes.
## Writing excel data sheet 50/28: CLBr.A96_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4460 genes.
## After (adj)p filter, the down genes table has 2165 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2872 genes.
## After fold change filter, the down genes table has 238 genes.
## Writing excel data sheet 51/28: CLBr.Epi_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5623 genes.
## After (adj)p filter, the down genes table has 3062 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2933 genes.
## After fold change filter, the down genes table has 532 genes.
## Writing excel data sheet 52/28: CLBr.Tryp_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7287 genes.
## After (adj)p filter, the down genes table has 4541 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4675 genes.
## After fold change filter, the down genes table has 1364 genes.
## Writing excel data sheet 53/28: CLBr.Epi_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5548 genes.
## After (adj)p filter, the down genes table has 4743 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2123 genes.
## After fold change filter, the down genes table has 2334 genes.
## Writing excel data sheet 54/28: CLBr.Tryp_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5659 genes.
## After (adj)p filter, the down genes table has 3733 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2726 genes.
## After fold change filter, the down genes table has 887 genes.
## Writing excel data sheet 55/28: CLBr.Tryp_vs_CLBr.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6392 genes.
## After (adj)p filter, the down genes table has 5712 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3729 genes.
## After fold change filter, the down genes table has 2271 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/28: Writing excel data sheet up_1edger_CL14.A96_vs_CL14.A60
## 1/28: Writing excel data sheet down_1edger_CL14.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 2/28: Writing excel data sheet up_2edger_CL14.Epi_vs_CL14.A60
## 2/28: Writing excel data sheet down_2edger_CL14.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 3/28: Writing excel data sheet up_3edger_CL14.Tryp_vs_CL14.A60
## 3/28: Writing excel data sheet down_3edger_CL14.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 4/28: Writing excel data sheet up_4edger_CLBr.A60_vs_CL14.A60
## 4/28: Writing excel data sheet down_4edger_CLBr.A60_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 5/28: Writing excel data sheet up_5edger_CLBr.A96_vs_CL14.A60
## 5/28: Writing excel data sheet down_5edger_CLBr.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 6/28: Writing excel data sheet up_6edger_CLBr.Epi_vs_CL14.A60
## 6/28: Writing excel data sheet down_6edger_CLBr.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 7/28: Writing excel data sheet up_7edger_CLBr.Tryp_vs_CL14.A60
## 7/28: Writing excel data sheet down_7edger_CLBr.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 8/28: Writing excel data sheet up_8edger_CL14.Epi_vs_CL14.A96
## 8/28: Writing excel data sheet down_8edger_CL14.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 9/28: Writing excel data sheet up_9edger_CL14.Tryp_vs_CL14.A96
## 9/28: Writing excel data sheet down_9edger_CL14.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 10/28: Writing excel data sheet up_10edger_CLBr.A60_vs_CL14.A96
## 10/28: Writing excel data sheet down_10edger_CLBr.A60_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 11/28: Writing excel data sheet up_11edger_CLBr.A96_vs_CL14.A96
## 11/28: Writing excel data sheet down_11edger_CLBr.A96_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 12/28: Writing excel data sheet up_12edger_CLBr.Epi_vs_CL14.A96
## 12/28: Writing excel data sheet down_12edger_CLBr.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet up_13edger_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet down_13edger_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet up_14edger_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet down_14edger_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 15/28: Writing excel data sheet up_15edger_CLBr.A60_vs_CL14.Epi
## 15/28: Writing excel data sheet down_15edger_CLBr.A60_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 16/28: Writing excel data sheet up_16edger_CLBr.A96_vs_CL14.Epi
## 16/28: Writing excel data sheet down_16edger_CLBr.A96_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 17/28: Writing excel data sheet up_17edger_CLBr.Epi_vs_CL14.Epi
## 17/28: Writing excel data sheet down_17edger_CLBr.Epi_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet up_18edger_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet down_18edger_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet up_19edger_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet down_19edger_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet up_20edger_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet down_20edger_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet up_21edger_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet down_21edger_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet up_22edger_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet down_22edger_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## hmph, still too long, truncating to 30 characters.
## 23/28: Writing excel data sheet up_23edger_CLBr.A96_vs_CLBr.A60
## 23/28: Writing excel data sheet down_23edger_CLBr.A96_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 24/28: Writing excel data sheet up_24edger_CLBr.Epi_vs_CLBr.A60
## 24/28: Writing excel data sheet down_24edger_CLBr.Epi_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet up_25edger_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet down_25edger_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 26/28: Writing excel data sheet up_26edger_CLBr.Epi_vs_CLBr.A96
## 26/28: Writing excel data sheet down_26edger_CLBr.Epi_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet up_27edger_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet down_27edger_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet up_28edger_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet down_28edger_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## Writing excel data sheet 56/28: CL14.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4341 genes.
## After (adj)p filter, the down genes table has 1602 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2334 genes.
## After fold change filter, the down genes table has 297 genes.
## Writing excel data sheet 57/28: CL14.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4045 genes.
## After (adj)p filter, the down genes table has 3110 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1970 genes.
## After fold change filter, the down genes table has 710 genes.
## Writing excel data sheet 58/28: CL14.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 8267 genes.
## After (adj)p filter, the down genes table has 4824 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4670 genes.
## After fold change filter, the down genes table has 1161 genes.
## Writing excel data sheet 59/28: CLBr.A60_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2858 genes.
## After (adj)p filter, the down genes table has 2022 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1215 genes.
## After fold change filter, the down genes table has 627 genes.
## Writing excel data sheet 60/28: CLBr.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6744 genes.
## After (adj)p filter, the down genes table has 3944 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3966 genes.
## After fold change filter, the down genes table has 563 genes.
## Writing excel data sheet 61/28: CLBr.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7761 genes.
## After (adj)p filter, the down genes table has 4666 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4357 genes.
## After fold change filter, the down genes table has 972 genes.
## Writing excel data sheet 62/28: CLBr.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 9520 genes.
## After (adj)p filter, the down genes table has 5485 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 6311 genes.
## After fold change filter, the down genes table has 1758 genes.
## Writing excel data sheet 63/28: CL14.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3430 genes.
## After (adj)p filter, the down genes table has 6072 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 934 genes.
## After fold change filter, the down genes table has 2615 genes.
## Writing excel data sheet 64/28: CL14.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7073 genes.
## After (adj)p filter, the down genes table has 6487 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3830 genes.
## After fold change filter, the down genes table has 2582 genes.
## Writing excel data sheet 65/28: CLBr.A60_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 262 genes.
## After (adj)p filter, the down genes table has 1523 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 59 genes.
## After fold change filter, the down genes table has 635 genes.
## Writing excel data sheet 66/28: CLBr.A96_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3216 genes.
## After (adj)p filter, the down genes table has 3051 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1765 genes.
## After fold change filter, the down genes table has 360 genes.
## Writing excel data sheet 67/28: CLBr.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4436 genes.
## After (adj)p filter, the down genes table has 4406 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1741 genes.
## After fold change filter, the down genes table has 907 genes.
## Writing excel data sheet 68/28: CLBr.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7050 genes.
## After (adj)p filter, the down genes table has 5307 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3937 genes.
## After fold change filter, the down genes table has 1593 genes.
## Writing excel data sheet 69/28: CL14.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 8995 genes.
## After (adj)p filter, the down genes table has 6289 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4947 genes.
## After fold change filter, the down genes table has 2449 genes.
## Writing excel data sheet 70/28: CLBr.A60_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4432 genes.
## After (adj)p filter, the down genes table has 3990 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1462 genes.
## After fold change filter, the down genes table has 1484 genes.
## Writing excel data sheet 71/28: CLBr.A96_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7330 genes.
## After (adj)p filter, the down genes table has 4844 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3830 genes.
## After fold change filter, the down genes table has 1194 genes.
## Writing excel data sheet 72/28: CLBr.Epi_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6750 genes.
## After (adj)p filter, the down genes table has 3866 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2777 genes.
## After fold change filter, the down genes table has 392 genes.
## Writing excel data sheet 73/28: CLBr.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 9355 genes.
## After (adj)p filter, the down genes table has 5814 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 5751 genes.
## After fold change filter, the down genes table has 2082 genes.
## Writing excel data sheet 74/28: CLBr.A60_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5647 genes.
## After (adj)p filter, the down genes table has 7681 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2114 genes.
## After fold change filter, the down genes table has 4574 genes.
## Writing excel data sheet 75/28: CLBr.A96_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5402 genes.
## After (adj)p filter, the down genes table has 6513 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2123 genes.
## After fold change filter, the down genes table has 2634 genes.
## Writing excel data sheet 76/28: CLBr.Epi_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6974 genes.
## After (adj)p filter, the down genes table has 7868 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3326 genes.
## After fold change filter, the down genes table has 3816 genes.
## Writing excel data sheet 77/28: CLBr.Tryp_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4376 genes.
## After (adj)p filter, the down genes table has 2920 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2056 genes.
## After fold change filter, the down genes table has 744 genes.
## Writing excel data sheet 78/28: CLBr.A96_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4600 genes.
## After (adj)p filter, the down genes table has 2672 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2800 genes.
## After fold change filter, the down genes table has 217 genes.
## Writing excel data sheet 79/28: CLBr.Epi_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5576 genes.
## After (adj)p filter, the down genes table has 3753 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2733 genes.
## After fold change filter, the down genes table has 542 genes.
## Writing excel data sheet 80/28: CLBr.Tryp_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7790 genes.
## After (adj)p filter, the down genes table has 4687 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 4711 genes.
## After fold change filter, the down genes table has 1217 genes.
## Writing excel data sheet 81/28: CLBr.Epi_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5629 genes.
## After (adj)p filter, the down genes table has 5567 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1977 genes.
## After fold change filter, the down genes table has 2374 genes.
## Writing excel data sheet 82/28: CLBr.Tryp_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6254 genes.
## After (adj)p filter, the down genes table has 4066 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2731 genes.
## After fold change filter, the down genes table has 825 genes.
## Writing excel data sheet 83/28: CLBr.Tryp_vs_CLBr.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 7343 genes.
## After (adj)p filter, the down genes table has 5663 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 3815 genes.
## After fold change filter, the down genes table has 2052 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/28: Writing excel data sheet up_1deseq_CL14.A96_vs_CL14.A60
## 1/28: Writing excel data sheet down_1deseq_CL14.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 2/28: Writing excel data sheet up_2deseq_CL14.Epi_vs_CL14.A60
## 2/28: Writing excel data sheet down_2deseq_CL14.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 3/28: Writing excel data sheet up_3deseq_CL14.Tryp_vs_CL14.A60
## 3/28: Writing excel data sheet down_3deseq_CL14.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 4/28: Writing excel data sheet up_4deseq_CLBr.A60_vs_CL14.A60
## 4/28: Writing excel data sheet down_4deseq_CLBr.A60_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 5/28: Writing excel data sheet up_5deseq_CLBr.A96_vs_CL14.A60
## 5/28: Writing excel data sheet down_5deseq_CLBr.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 6/28: Writing excel data sheet up_6deseq_CLBr.Epi_vs_CL14.A60
## 6/28: Writing excel data sheet down_6deseq_CLBr.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 7/28: Writing excel data sheet up_7deseq_CLBr.Tryp_vs_CL14.A60
## 7/28: Writing excel data sheet down_7deseq_CLBr.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 8/28: Writing excel data sheet up_8deseq_CL14.Epi_vs_CL14.A96
## 8/28: Writing excel data sheet down_8deseq_CL14.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 9/28: Writing excel data sheet up_9deseq_CL14.Tryp_vs_CL14.A96
## 9/28: Writing excel data sheet down_9deseq_CL14.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 10/28: Writing excel data sheet up_10deseq_CLBr.A60_vs_CL14.A96
## 10/28: Writing excel data sheet down_10deseq_CLBr.A60_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 11/28: Writing excel data sheet up_11deseq_CLBr.A96_vs_CL14.A96
## 11/28: Writing excel data sheet down_11deseq_CLBr.A96_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 12/28: Writing excel data sheet up_12deseq_CLBr.Epi_vs_CL14.A96
## 12/28: Writing excel data sheet down_12deseq_CLBr.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet up_13deseq_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet down_13deseq_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet up_14deseq_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet down_14deseq_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 15/28: Writing excel data sheet up_15deseq_CLBr.A60_vs_CL14.Epi
## 15/28: Writing excel data sheet down_15deseq_CLBr.A60_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 16/28: Writing excel data sheet up_16deseq_CLBr.A96_vs_CL14.Epi
## 16/28: Writing excel data sheet down_16deseq_CLBr.A96_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 17/28: Writing excel data sheet up_17deseq_CLBr.Epi_vs_CL14.Epi
## 17/28: Writing excel data sheet down_17deseq_CLBr.Epi_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet up_18deseq_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet down_18deseq_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet up_19deseq_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet down_19deseq_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet up_20deseq_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet down_20deseq_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet up_21deseq_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet down_21deseq_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet up_22deseq_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet down_22deseq_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## hmph, still too long, truncating to 30 characters.
## 23/28: Writing excel data sheet up_23deseq_CLBr.A96_vs_CLBr.A60
## 23/28: Writing excel data sheet down_23deseq_CLBr.A96_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 24/28: Writing excel data sheet up_24deseq_CLBr.Epi_vs_CLBr.A60
## 24/28: Writing excel data sheet down_24deseq_CLBr.Epi_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet up_25deseq_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet down_25deseq_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 26/28: Writing excel data sheet up_26deseq_CLBr.Epi_vs_CLBr.A96
## 26/28: Writing excel data sheet down_26deseq_CLBr.Epi_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet up_27deseq_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet down_27deseq_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet up_28deseq_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet down_28deseq_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## Writing excel data sheet 84/28: CL14.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1036 genes.
## After (adj)p filter, the down genes table has 1272 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 566 genes.
## After fold change filter, the down genes table has 614 genes.
## Writing excel data sheet 85/28: CL14.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Writing excel data sheet 86/28: CL14.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1827 genes.
## After (adj)p filter, the down genes table has 2809 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1264 genes.
## After fold change filter, the down genes table has 1341 genes.
## Writing excel data sheet 87/28: CLBr.A60_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 448 genes.
## After (adj)p filter, the down genes table has 651 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 309 genes.
## After fold change filter, the down genes table has 388 genes.
## Writing excel data sheet 88/28: CLBr.A96_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2820 genes.
## After (adj)p filter, the down genes table has 4367 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1757 genes.
## After fold change filter, the down genes table has 1611 genes.
## Writing excel data sheet 89/28: CLBr.Epi_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3335 genes.
## After (adj)p filter, the down genes table has 4948 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1957 genes.
## After fold change filter, the down genes table has 1713 genes.
## Writing excel data sheet 90/28: CLBr.Tryp_vs_CL14.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2301 genes.
## After (adj)p filter, the down genes table has 3370 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1868 genes.
## After fold change filter, the down genes table has 2262 genes.
## Writing excel data sheet 91/28: CL14.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1 genes.
## After (adj)p filter, the down genes table has 0 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1 genes.
## After fold change filter, the down genes table has 0 genes.
## Writing excel data sheet 92/28: CL14.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4110 genes.
## After (adj)p filter, the down genes table has 4919 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2513 genes.
## After fold change filter, the down genes table has 2554 genes.
## Writing excel data sheet 93/28: CLBr.A60_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 326 genes.
## After (adj)p filter, the down genes table has 546 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 50 genes.
## After fold change filter, the down genes table has 147 genes.
## Writing excel data sheet 94/28: CLBr.A96_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2937 genes.
## After (adj)p filter, the down genes table has 3788 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1239 genes.
## After fold change filter, the down genes table has 622 genes.
## Writing excel data sheet 95/28: CLBr.Epi_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3773 genes.
## After (adj)p filter, the down genes table has 5258 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1445 genes.
## After fold change filter, the down genes table has 927 genes.
## Writing excel data sheet 96/28: CLBr.Tryp_vs_CL14.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1815 genes.
## After (adj)p filter, the down genes table has 2534 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1267 genes.
## After fold change filter, the down genes table has 1323 genes.
## Writing excel data sheet 97/28: CL14.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 18 genes.
## After (adj)p filter, the down genes table has 40 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 17 genes.
## After fold change filter, the down genes table has 27 genes.
## Writing excel data sheet 98/28: CLBr.A60_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2 genes.
## After (adj)p filter, the down genes table has 5 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2 genes.
## After fold change filter, the down genes table has 3 genes.
## Writing excel data sheet 99/28: CLBr.A96_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 84 genes.
## After (adj)p filter, the down genes table has 74 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 68 genes.
## After fold change filter, the down genes table has 50 genes.
## Writing excel data sheet 100/28: CLBr.Epi_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1 genes.
## After (adj)p filter, the down genes table has 7 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1 genes.
## After fold change filter, the down genes table has 5 genes.
## Writing excel data sheet 101/28: CLBr.Tryp_vs_CL14.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 2 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 2 genes.
## Writing excel data sheet 102/28: CLBr.A60_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 4738 genes.
## After (adj)p filter, the down genes table has 3689 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2311 genes.
## After fold change filter, the down genes table has 2455 genes.
## Writing excel data sheet 103/28: CLBr.A96_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3361 genes.
## After (adj)p filter, the down genes table has 3713 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1754 genes.
## After fold change filter, the down genes table has 1871 genes.
## Writing excel data sheet 104/28: CLBr.Epi_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 5252 genes.
## After (adj)p filter, the down genes table has 5553 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2986 genes.
## After fold change filter, the down genes table has 2963 genes.
## Writing excel data sheet 105/28: CLBr.Tryp_vs_CL14.Tryp
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 541 genes.
## After (adj)p filter, the down genes table has 450 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 451 genes.
## After fold change filter, the down genes table has 308 genes.
## Writing excel data sheet 106/28: CLBr.A96_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2934 genes.
## After (adj)p filter, the down genes table has 3974 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1485 genes.
## After fold change filter, the down genes table has 607 genes.
## Writing excel data sheet 107/28: CLBr.Epi_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 3633 genes.
## After (adj)p filter, the down genes table has 5340 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1576 genes.
## After fold change filter, the down genes table has 818 genes.
## Writing excel data sheet 108/28: CLBr.Tryp_vs_CLBr.A60
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1803 genes.
## After (adj)p filter, the down genes table has 2647 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1370 genes.
## After fold change filter, the down genes table has 1392 genes.
## Writing excel data sheet 109/28: CLBr.Epi_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 6140 genes.
## After (adj)p filter, the down genes table has 6525 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 2142 genes.
## After fold change filter, the down genes table has 2152 genes.
## Writing excel data sheet 110/28: CLBr.Tryp_vs_CLBr.A96
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 1220 genes.
## After (adj)p filter, the down genes table has 1483 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 717 genes.
## After fold change filter, the down genes table has 554 genes.
## Writing excel data sheet 111/28: CLBr.Tryp_vs_CLBr.Epi
## Assuming the fold changes are on the log scale and so taking >< 0
## After (adj)p filter, the up genes table has 2447 genes.
## After (adj)p filter, the down genes table has 2871 genes.
## Assuming the fold changes are on the log scale and so taking -1.0 * fc
## After fold change filter, the up genes table has 1394 genes.
## After fold change filter, the down genes table has 1366 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/28: Writing excel data sheet up_1basic_CL14.A96_vs_CL14.A60
## 1/28: Writing excel data sheet down_1basic_CL14.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 2/28: Writing excel data sheet up_2basic_CL14.Epi_vs_CL14.A60
## 2/28: Writing excel data sheet down_2basic_CL14.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 3/28: Writing excel data sheet up_3basic_CL14.Tryp_vs_CL14.A60
## 3/28: Writing excel data sheet down_3basic_CL14.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 4/28: Writing excel data sheet up_4basic_CLBr.A60_vs_CL14.A60
## 4/28: Writing excel data sheet down_4basic_CLBr.A60_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 5/28: Writing excel data sheet up_5basic_CLBr.A96_vs_CL14.A60
## 5/28: Writing excel data sheet down_5basic_CLBr.A96_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 6/28: Writing excel data sheet up_6basic_CLBr.Epi_vs_CL14.A60
## 6/28: Writing excel data sheet down_6basic_CLBr.Epi_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 7/28: Writing excel data sheet up_7basic_CLBr.Tryp_vs_CL14.A60
## 7/28: Writing excel data sheet down_7basic_CLBr.Tryp_vs_CL14.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 8/28: Writing excel data sheet up_8basic_CL14.Epi_vs_CL14.A96
## 8/28: Writing excel data sheet down_8basic_CL14.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 9/28: Writing excel data sheet up_9basic_CL14.Tryp_vs_CL14.A96
## 9/28: Writing excel data sheet down_9basic_CL14.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 10/28: Writing excel data sheet up_10basic_CLBr.A60_vs_CL14.A96
## 10/28: Writing excel data sheet down_10basic_CLBr.A60_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 11/28: Writing excel data sheet up_11basic_CLBr.A96_vs_CL14.A96
## 11/28: Writing excel data sheet down_11basic_CLBr.A96_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 12/28: Writing excel data sheet up_12basic_CLBr.Epi_vs_CL14.A96
## 12/28: Writing excel data sheet down_12basic_CLBr.Epi_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet up_13basic_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 13/28: Writing excel data sheet down_13basic_CLBr.Tryp_vs_CL14.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet up_14basic_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 14/28: Writing excel data sheet down_14basic_CL14.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 15/28: Writing excel data sheet up_15basic_CLBr.A60_vs_CL14.Epi
## 15/28: Writing excel data sheet down_15basic_CLBr.A60_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 16/28: Writing excel data sheet up_16basic_CLBr.A96_vs_CL14.Epi
## 16/28: Writing excel data sheet down_16basic_CLBr.A96_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 17/28: Writing excel data sheet up_17basic_CLBr.Epi_vs_CL14.Epi
## 17/28: Writing excel data sheet down_17basic_CLBr.Epi_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet up_18basic_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 18/28: Writing excel data sheet down_18basic_CLBr.Tryp_vs_CL14.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet up_19basic_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 19/28: Writing excel data sheet down_19basic_CLBr.A60_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet up_20basic_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 20/28: Writing excel data sheet down_20basic_CLBr.A96_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet up_21basic_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 21/28: Writing excel data sheet down_21basic_CLBr.Epi_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet up_22basic_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## 22/28: Writing excel data sheet down_22basic_CLBr.Tryp_vs_CL14.Tryp
## The sheet name was too long for Excel, truncating it by removing vowels.
## hmph, still too long, truncating to 30 characters.
## 23/28: Writing excel data sheet up_23basic_CLBr.A96_vs_CLBr.A60
## 23/28: Writing excel data sheet down_23basic_CLBr.A96_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 24/28: Writing excel data sheet up_24basic_CLBr.Epi_vs_CLBr.A60
## 24/28: Writing excel data sheet down_24basic_CLBr.Epi_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet up_25basic_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 25/28: Writing excel data sheet down_25basic_CLBr.Tryp_vs_CLBr.A60
## The sheet name was too long for Excel, truncating it by removing vowels.
## 26/28: Writing excel data sheet up_26basic_CLBr.Epi_vs_CLBr.A96
## 26/28: Writing excel data sheet down_26basic_CLBr.Epi_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet up_27basic_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 27/28: Writing excel data sheet down_27basic_CLBr.Tryp_vs_CLBr.A96
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet up_28basic_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## 28/28: Writing excel data sheet down_28basic_CLBr.Tryp_vs_CLBr.Epi
## The sheet name was too long for Excel, truncating it by removing vowels.
## Adding significance bar plots.
all_abundances <- get_pairwise_gene_abundances(abundances_pairwise)
all_expression <- all_abundances[["expression_values"]]
all_annotations <- Biobase::fData(abundance_expt[["expressionset"]])
all_expression <- merge(all_annotations, all_expression, by="row.names")
rownames(all_expression) <- all_expression[["Row.names"]]
all_expression <- all_expression[, -1]
##all_expression <- all_expression[, c("txchrom", "txstrand", "genedescription", "genesize",
##                                     "CL14.A60", "CL14.A96", "CL14.Tryp",
##                                     "CLBr.A60", "CLBr.A96", "CLBr.Tryp")]
all_errors <- all_abundances[["error_values"]]
all_errors <- all_errors[, 1:6]
##colnames(all_errors) <- c("CL14.A60_se", "CL14.A96_se", "CL14.Tryp_se",
##                          "CLBr.A60_se", "CLBr_A96_se", "CL14.Tryp_se")
##all_expression <- merge(all_expression, all_errors, by="row.names")
##rownames(all_expression) <- all_expression[["Row.names"]]
##all_expression <- all_expression[, -1]
all_expression_written <- write_xls(data=all_expression,
                                sheet="expression_values",
                                title="Table SXX. Expression values making up the contrast logFCs (with standard error values obtained by dividing the expression by the t-statistic.)")
##error_written <- write_xls(data=tmp_errors, start_col=16, rownames=FALSE,
##                           ##title="Error value obtained by dividing the expression / t-statistic",
##                           sheet="expression_values",
##                           wb=expression_written[["workbook"]])
openxlsx::saveWorkbook(wb=all_expression_written[["workbook"]],
                       file=paste0("excel/tableSxx_ExpressionValuesWithEpis.xlsx"),
                       overwrite=TRUE)

12 Significance bar plots

clbr_bars <- sm(significant_barplots(clb_compare_times))
clbr_bars$limma

clbr_bars_brokenp <- sm(significant_barplots(clb_compare_times, invert=TRUE))

cl14_bars <- sm(significant_barplots(cl14_compare_times))
strain_bars <- sm(significant_barplots(strain_comparisons))
cl14_bars_brokenp <- significant_barplots(cl14_compare_times, invert=TRUE)
strain_bars_brokenp <- significant_barplots(strain_comparisons, invert=TRUE)

clbr_bars$limma

cl14_bars$limma

strain_bars$limma

pdf(file="images/cl14_barplot_inverted.pdf")
cl14_bars_brokenp$limma
dev.off()
## png
##   2
pdf(file="images/clbr_barplot_inverted.pdf")
clbr_bars_brokenp$limma
dev.off()
## png
##   2

13 Remove multi-gene families for gene ontology

Redo GO analyses excluding multigene family members. I believe we discussed that the best way to do this was to:

  1. generate DE tables with multigene family members filtered out
  2. Redo GO/KEGG on remainder.
## clbr_times_filtered <- semantic_copynumber_filter(clbr_times_sig$limma,
##                                                   semantic_column="genedescription")
## cl14_times_filtered <- semantic_copynumber_filter(cl14_times_sig$limma,
##                                                   semantic_column="genedescription")
## strains_filtered <- semantic_copynumber_filter(strains_sig$limma,
##                                                semantic_column="genedescription")
clbr_times_filtered <- sm(semantic_copynumber_filter(clb_compare_times,
                                                     semantic_column="genedescription"))
cl14_times_filtered <- sm(semantic_copynumber_filter(cl14_compare_times,
                                                     semantic_column="genedescription"))
strains_filtered <- sm(semantic_copynumber_filter(strain_comparisons,
                                                  semantic_column="genedescription"))

clbr_times_sigfilt <- sm(extract_significant_genes(clbr_times_filtered, according_to="limma",
                                                   excel=paste0("excel/clb_times_filtered_sig-v",
                                                                ver, ".xlsx")))
cl14_times_sigfilt <- sm(extract_significant_genes(cl14_times_filtered, according_to="limma",
                                                   excel=paste0("excel/cl14_times_filtered_sig-v",
                                                                ver, ".xlsx")))
strains_sigfilt <- sm(extract_significant_genes(strains_filtered, according_to="limma",
                                                excel=paste0("excel/strain_comparisons_filtered_sig-v",
                                                             ver, ".xlsx")))

## Najib wants to know how many entries for each family were removed by the semantic filtering
## from the significance tables.
semantic_names <- c("mucin","sialidase","RHS","MASP","DGF","GP63")
find_numbers <- function(datum, direction="ups", table_name="CLBr.A60_vs_CLBr.Tryp") {
    for (name in semantic_names) {
        table <- datum[["limma"]][[direction]][[table_name]]
        search <- grepl(pattern=name, x=table[["genedescription"]])
        number <- sum(search)
        message(paste0("The ", direction, " table ", table_name,
                       " was pruned for ",
                       name, " by ", number, " genes."))
    }
}
find_numbers(clbr_times_sig)
## The ups table CLBr.A60_vs_CLBr.Tryp was pruned for mucin by 64 genes.
## The ups table CLBr.A60_vs_CLBr.Tryp was pruned for sialidase by 99 genes.
## The ups table CLBr.A60_vs_CLBr.Tryp was pruned for RHS by 111 genes.
## The ups table CLBr.A60_vs_CLBr.Tryp was pruned for MASP by 42 genes.
## The ups table CLBr.A60_vs_CLBr.Tryp was pruned for DGF by 378 genes.
## The ups table CLBr.A60_vs_CLBr.Tryp was pruned for GP63 by 59 genes.
find_numbers(clbr_times_sig, direction="downs")
## The downs table CLBr.A60_vs_CLBr.Tryp was pruned for mucin by 1500 genes.
## The downs table CLBr.A60_vs_CLBr.Tryp was pruned for sialidase by 809 genes.
## The downs table CLBr.A60_vs_CLBr.Tryp was pruned for RHS by 17 genes.
## The downs table CLBr.A60_vs_CLBr.Tryp was pruned for MASP by 937 genes.
## The downs table CLBr.A60_vs_CLBr.Tryp was pruned for DGF by 4 genes.
## The downs table CLBr.A60_vs_CLBr.Tryp was pruned for GP63 by 95 genes.
find_numbers(clbr_times_sig, table_name="CLBr.A96_vs_CLBr.A60")
## The ups table CLBr.A96_vs_CLBr.A60 was pruned for mucin by 1031 genes.
## The ups table CLBr.A96_vs_CLBr.A60 was pruned for sialidase by 288 genes.
## The ups table CLBr.A96_vs_CLBr.A60 was pruned for RHS by 24 genes.
## The ups table CLBr.A96_vs_CLBr.A60 was pruned for MASP by 714 genes.
## The ups table CLBr.A96_vs_CLBr.A60 was pruned for DGF by 0 genes.
## The ups table CLBr.A96_vs_CLBr.A60 was pruned for GP63 by 47 genes.
find_numbers(clbr_times_sig, direction="downs", table_name="CLBr.A96_vs_CLBr.A60")
## The downs table CLBr.A96_vs_CLBr.A60 was pruned for mucin by 92 genes.
## The downs table CLBr.A96_vs_CLBr.A60 was pruned for sialidase by 69 genes.
## The downs table CLBr.A96_vs_CLBr.A60 was pruned for RHS by 47 genes.
## The downs table CLBr.A96_vs_CLBr.A60 was pruned for MASP by 55 genes.
## The downs table CLBr.A96_vs_CLBr.A60 was pruned for DGF by 149 genes.
## The downs table CLBr.A96_vs_CLBr.A60 was pruned for GP63 by 44 genes.
find_numbers(clbr_times_sig, table_name="CLBr.Tryp_vs_CLBr.A96")
## The ups table CLBr.Tryp_vs_CLBr.A96 was pruned for mucin by 794 genes.
## The ups table CLBr.Tryp_vs_CLBr.A96 was pruned for sialidase by 740 genes.
## The ups table CLBr.Tryp_vs_CLBr.A96 was pruned for RHS by 21 genes.
## The ups table CLBr.Tryp_vs_CLBr.A96 was pruned for MASP by 417 genes.
## The ups table CLBr.Tryp_vs_CLBr.A96 was pruned for DGF by 7 genes.
## The ups table CLBr.Tryp_vs_CLBr.A96 was pruned for GP63 by 77 genes.
find_numbers(clbr_times_sig, direction="downs", table_name="CLBr.Tryp_vs_CLBr.A96")
## The downs table CLBr.Tryp_vs_CLBr.A96 was pruned for mucin by 148 genes.
## The downs table CLBr.Tryp_vs_CLBr.A96 was pruned for sialidase by 67 genes.
## The downs table CLBr.Tryp_vs_CLBr.A96 was pruned for RHS by 69 genes.
## The downs table CLBr.Tryp_vs_CLBr.A96 was pruned for MASP by 84 genes.
## The downs table CLBr.Tryp_vs_CLBr.A96 was pruned for DGF by 169 genes.
## The downs table CLBr.Tryp_vs_CLBr.A96 was pruned for GP63 by 21 genes.
find_numbers(cl14_times_sig, table_name="CL14.A60_vs_CL14.Tryp")
## The ups table CL14.A60_vs_CL14.Tryp was pruned for mucin by 26 genes.
## The ups table CL14.A60_vs_CL14.Tryp was pruned for sialidase by 66 genes.
## The ups table CL14.A60_vs_CL14.Tryp was pruned for RHS by 107 genes.
## The ups table CL14.A60_vs_CL14.Tryp was pruned for MASP by 21 genes.
## The ups table CL14.A60_vs_CL14.Tryp was pruned for DGF by 450 genes.
## The ups table CL14.A60_vs_CL14.Tryp was pruned for GP63 by 30 genes.
find_numbers(cl14_times_sig, direction="downs", table_name="CL14.A60_vs_CL14.Tryp")
## The downs table CL14.A60_vs_CL14.Tryp was pruned for mucin by 1393 genes.
## The downs table CL14.A60_vs_CL14.Tryp was pruned for sialidase by 572 genes.
## The downs table CL14.A60_vs_CL14.Tryp was pruned for RHS by 3 genes.
## The downs table CL14.A60_vs_CL14.Tryp was pruned for MASP by 923 genes.
## The downs table CL14.A60_vs_CL14.Tryp was pruned for DGF by 2 genes.
## The downs table CL14.A60_vs_CL14.Tryp was pruned for GP63 by 77 genes.
find_numbers(cl14_times_sig, table_name="CL14.A96_vs_CL14.A60")
## The ups table CL14.A96_vs_CL14.A60 was pruned for mucin by 172 genes.
## The ups table CL14.A96_vs_CL14.A60 was pruned for sialidase by 120 genes.
## The ups table CL14.A96_vs_CL14.A60 was pruned for RHS by 80 genes.
## The ups table CL14.A96_vs_CL14.A60 was pruned for MASP by 126 genes.
## The ups table CL14.A96_vs_CL14.A60 was pruned for DGF by 49 genes.
## The ups table CL14.A96_vs_CL14.A60 was pruned for GP63 by 9 genes.
find_numbers(cl14_times_sig, direction="downs", table_name="CL14.A96_vs_CL14.A60")
## The downs table CL14.A96_vs_CL14.A60 was pruned for mucin by 58 genes.
## The downs table CL14.A96_vs_CL14.A60 was pruned for sialidase by 90 genes.
## The downs table CL14.A96_vs_CL14.A60 was pruned for RHS by 48 genes.
## The downs table CL14.A96_vs_CL14.A60 was pruned for MASP by 31 genes.
## The downs table CL14.A96_vs_CL14.A60 was pruned for DGF by 34 genes.
## The downs table CL14.A96_vs_CL14.A60 was pruned for GP63 by 13 genes.
find_numbers(cl14_times_sig, table_name="CL14.Tryp_vs_CL14.A96")
## The ups table CL14.Tryp_vs_CL14.A96 was pruned for mucin by 1343 genes.
## The ups table CL14.Tryp_vs_CL14.A96 was pruned for sialidase by 594 genes.
## The ups table CL14.Tryp_vs_CL14.A96 was pruned for RHS by 38 genes.
## The ups table CL14.Tryp_vs_CL14.A96 was pruned for MASP by 812 genes.
## The ups table CL14.Tryp_vs_CL14.A96 was pruned for DGF by 8 genes.
## The ups table CL14.Tryp_vs_CL14.A96 was pruned for GP63 by 75 genes.
find_numbers(cl14_times_sig, direction="downs", table_name="CL14.Tryp_vs_CL14.A96")
## The downs table CL14.Tryp_vs_CL14.A96 was pruned for mucin by 90 genes.
## The downs table CL14.Tryp_vs_CL14.A96 was pruned for sialidase by 141 genes.
## The downs table CL14.Tryp_vs_CL14.A96 was pruned for RHS by 171 genes.
## The downs table CL14.Tryp_vs_CL14.A96 was pruned for MASP by 62 genes.
## The downs table CL14.Tryp_vs_CL14.A96 was pruned for DGF by 425 genes.
## The downs table CL14.Tryp_vs_CL14.A96 was pruned for GP63 by 18 genes.

13.1 Many many MA plots!

filenames <- c("mucin.txt", "masp.txt", "gp63.txt", "transsialidase.txt",
               "retrotransposon.txt", "dispersed.txt")
family_colors <- c("blue", "red", "green", "purple", "brown", "yellow")
names(family_colors) <- c("mucin", "MASP", "GP63", "trans_sialidase", "rhs", "DGF")
for (num in 1:length(names(clb_times_keepers))) {
    contrast_names <- names(clb_times_keepers)
    contrast <- contrast_names[[num]]
    for (file_num in 1:length(filenames)) {
        color <- family_colors[[file_num]]
        families <- names(family_colors)
        family <- families[[file_num]]
        file <- filenames[[file_num]]
        filename <- paste0("reference/families/", file)
        output <- paste0("images/", contrast, "_", family, "_ma-v", ver, ".png")
        svg_output <- paste0("images/", contrast, "_", family, "_ma-v", ver, ".svg")
        family <- read.csv(filename, header=FALSE, sep=":")
        family <- family[[1]]
        limma_plot <- extract_de_ma(clb_compare_times, type="limma",
                                    table=contrast, family=family,
                                    insig_color="lightgrey", sig_color="#444444",
                                    family_color=color, label_numbers=FALSE)
        the_plot <- limma_plot$plot + ylim(-10, 10) + theme(legend.position="none")
        png(file=output)
        plot(the_plot)
        dev.off()
        svg(file=svg_output)
        plot(the_plot)
        dev.off()
    }
}
## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).
## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : embedded
## nul(s) found in input
## Warning: Removed 1 rows containing missing values (geom_point).

## Warning: Removed 1 rows containing missing values (geom_point).
## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : embedded
## nul(s) found in input

## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : embedded
## nul(s) found in input
for (num in 1:length(names(cl14_times_keepers))) {
    contrast_names <- names(cl14_times_keepers)
    contrast <- contrast_names[[num]]
    for (file_num in 1:length(filenames)) {
        color <- family_colors[[file_num]]
        families <- names(family_colors)
        family <- families[[file_num]]
        file <- filenames[[file_num]]
        filename <- paste0("reference/families/", file)
        output <- paste0("images/", contrast, "_", family, "_ma-v", ver, ".png")
        svg_output <- paste0("images/", contrast, "_", family, "_ma-v", ver, ".svg")
        family <- read.csv(filename, header=FALSE, sep=":")
        family <- family[[1]]
        limma_plot <- extract_de_ma(cl14_compare_times, type="limma",
                                    table=contrast, family=family,
                                    insig_color="lightgrey", sig_color="#444444",
                                    family_color=color, label_numbers=FALSE)
        the_plot <- limma_plot$plot + ylim(-10, 10) + theme(legend.position="none")
        png(file=output)
        plot(the_plot)
        dev.off()
        svg(file=svg_output)
        plot(the_plot)
        dev.off()
    }
}
## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : embedded
## nul(s) found in input

## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : embedded
## nul(s) found in input

## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : embedded
## nul(s) found in input

index.html 01_annotation.html 02_sample_estimation.html

pander::pander(sessionInfo())

R version 3.4.1 (2017-06-30)

**Platform:** x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.utf8, LC_NUMERIC=C, LC_TIME=en_US.utf8, LC_COLLATE=en_US.utf8, LC_MONETARY=en_US.utf8, LC_MESSAGES=en_US.utf8, LC_PAPER=en_US.utf8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.utf8 and LC_IDENTIFICATION=C

attached base packages: stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: edgeR(v.3.18.1), limma(v.3.32.5), ggplot2(v.2.2.1), Vennerable(v.3.1.0.9000), ruv(v.0.9.6) and hpgltools(v.2017.01)

loaded via a namespace (and not attached): Rtsne(v.0.13), colorspace(v.1.3-2), Heatplus(v.2.22.0), rprojroot(v.1.2), htmlTable(v.1.9), corpcor(v.1.6.9), XVector(v.0.16.0), GenomicRanges(v.1.28.4), base64enc(v.0.1-3), roxygen2(v.6.0.1), ggrepel(v.0.6.5), bit64(v.0.9-7), AnnotationDbi(v.1.38.2), xml2(v.1.1.1), codetools(v.0.2-15), splines(v.3.4.1), doParallel(v.1.0.10), robustbase(v.0.92-7), geneplotter(v.1.54.0), knitr(v.1.17), Formula(v.1.2-2), Rsamtools(v.1.28.0), annotate(v.1.54.0), cluster(v.2.0.6), graph(v.1.54.0), compiler(v.3.4.1), backports(v.1.1.0), Matrix(v.1.2-11), lazyeval(v.0.2.0), acepack(v.1.4.1), htmltools(v.0.3.6), tools(v.3.4.1), gtable(v.0.2.0), GenomeInfoDbData(v.0.99.0), reshape2(v.1.4.2), Rcpp(v.0.12.12), Biobase(v.2.36.2), Biostrings(v.2.44.2), preprocessCore(v.1.38.1), nlme(v.3.1-131), rtracklayer(v.1.36.4), iterators(v.1.0.8), stringr(v.1.2.0), openxlsx(v.4.0.17), testthat(v.1.0.2), gtools(v.3.5.0), devtools(v.1.13.3), XML(v.3.98-1.9), beanplot(v.1.2), DEoptimR(v.1.0-8), directlabels(v.2017.03.31), zlibbioc(v.1.22.0), scales(v.0.4.1), BiocInstaller(v.1.26.0), parallel(v.3.4.1), SummarizedExperiment(v.1.6.3), RBGL(v.1.52.0), RColorBrewer(v.1.1-2), yaml(v.2.1.14), memoise(v.1.1.0), gridExtra(v.2.2.1), pander(v.0.6.1), biomaRt(v.2.32.1), rpart(v.4.1-11), latticeExtra(v.0.6-28), stringi(v.1.1.5), RSQLite(v.2.0), genefilter(v.1.58.1), S4Vectors(v.0.14.3), foreach(v.1.4.3), checkmate(v.1.8.3), GenomicFeatures(v.1.28.4), BiocGenerics(v.0.22.0), BiocParallel(v.1.10.1), GenomeInfoDb(v.1.12.2), rlang(v.0.1.2), commonmark(v.1.2), matrixStats(v.0.52.2), bitops(v.1.0-6), evaluate(v.0.10.1), lattice(v.0.20-35), GenomicAlignments(v.1.12.2), htmlwidgets(v.0.9), labeling(v.0.3), bit(v.1.1-12), plyr(v.1.8.4), magrittr(v.1.5), DESeq2(v.1.16.1), R6(v.2.2.2), IRanges(v.2.10.2), Hmisc(v.4.0-3), DelayedArray(v.0.2.7), DBI(v.0.7), foreign(v.0.8-69), withr(v.2.0.0), mgcv(v.1.8-18), survival(v.2.41-3), RCurl(v.1.95-4.8), nnet(v.7.3-12), tibble(v.1.3.3), crayon(v.1.3.2), KernSmooth(v.2.23-15), OrganismDbi(v.1.18.0), rmarkdown(v.1.6), locfit(v.1.5-9.1), grid(v.3.4.1), sva(v.3.24.4), data.table(v.1.10.4), blob(v.1.1.0), digest(v.0.6.12), xtable(v.1.8-2), stats4(v.3.4.1), munsell(v.0.4.3) and quadprog(v.1.5-5)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset ddc13678a823746141fbe78bf127389acd4887b4
## R> packrat::restore()
## This is hpgltools commit: Wed Aug 23 01:03:48 2017 -0400: ddc13678a823746141fbe78bf127389acd4887b4
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
## Saving to 03_differential_expression-v20170810.rda.xz
tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiUk5Bc2VxIG9mIFQuY3J1emkgQ0wxNC9DTEJyOiBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbi4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogZGVmYXVsdAogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IHJlYWRhYmxlCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICAgY29sbGFwc2VkOiBmYWxzZQogICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGU+CiAgYm9keSAubWFpbi1jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxNjAwcHg7CiAgfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMikpCnNldC5zZWVkKDEpCnZlciA8LSAiMjAxNzA4MTAiCnByZXZpb3VzX2ZpbGUgPC0gIjAyX3NhbXBsZV9lc3RpbWF0aW9uLlJtZCIKCnRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpKQoKcm1kX2ZpbGUgPC0gIjAzX2RpZmZlcmVudGlhbF9leHByZXNzaW9uLlJtZCIKYGBgCgoKYGBge3IgcmVuZGVyaW5nLCBpbmNsdWRlPUZBTFNFLCBldmFsPUZBTFNFfQpybWFya2Rvd246OnJlbmRlcihybWRfZmlsZSkKCnJtYXJrZG93bjo6cmVuZGVyKHJtZF9maWxlLCBvdXRwdXRfZm9ybWF0PSJwZGZfZG9jdW1lbnQiKQpgYGAKCltpbmRleC5odG1sXShpbmRleC5odG1sKQpbMDFfYW5ub3RhdGlvbi5odG1sXSgwMV9hbm5vdGF0aW9uLmh0bWwpIApbMDJfc2FtcGxlX2VzdGltYXRpb25zLmh0bWxdKDAyX3NhbXBsZV9lc3RpbWF0aW9ucy5odG1sKQoKSW4gdGhpcyBkb2N1bWVudCwgd2Ugd2lsbCBwZXJmb3JtIGEgc2VyaWVzIG9mIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzCnVzaW5nIHRoZSBkYXRhIHdoaWNoIHN1cnZpdmVkIHNhbXBsZSBlc3RpbWF0aW9uLgoKIyBFeHRyYWN0IHNpZ25pZmljYW50bHkgY2hhbmdlZCBnZW5lcwoKTXkgb3JpZ2luYWwgd29yayBpbiB0aGlzIGNvbnRleHQgd2FzIHRvIHBlcmZvcm0gYWxsIHBvc3NpYmxlIGNvbnRyYXN0cyB1c2luZyB0aGUKZW50aXJlIGRhdGEgc2V0LiBBZnRlciBkaXNjdXNzaW9uIHdpdGggTmFqaWIgYW5kIFNhbnR1emEsIGl0IHdhcyBpbml0aWFsbHkKYWdyZWVkIHRoYXQgd2Ugd291bGQgdXNlIGEgc21hbGxlciBzdWJzZXQgaW4gb3JkZXIgdG8gZXZhbHVhdGUgdGhlIG1ldGhvZHMgZm9yCkRFIGFsb25nIHdpdGggYmF0Y2ggZWZmZWN0cyBldGMuCgpgYGB7ciBERV9ydW59CiMjIGNsX2FsbF9rZXhwdHYxIGNvbWVzIGZyb20gc2FtcGxlX2VzdGltYXRpb25zIHdoZW4gd2UgcmVtb3ZlZCBhbgojIyBvdXRsaWVyIHNhbXBsZSAoaHBnbDA0OTApLgpjbF9hbGxfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChjbF9hbGxfa2V4cHR2MSwgZmlsdGVyPSJjYmNiIikpCmNsX2FsbF9kZV9zdmEgPC0gc20oYWxsX3BhaXJ3aXNlKAogICAgY2xfYWxsX2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiLCBzdXJyb2dhdGVzPTEsCiAgICB3aGljaF92b29tPSJsaW1tYSIsIGVkZ2VyX21ldGhvZD0ibG9uZyIpKQpgYGAKCiMgQ2hvb3NlIGNvbnRyYXN0cyB0byBrZWVwIGFuZCBldmFsdWF0ZQoKSSBhbSBnb2luZyB0byBzcGxpdCB0aGVzZSByZXN1bHRzIGludG8gMiBjYXRlZ29yaWVzOiBjbGJyZW5lciBhbmFseXNlcyBvdmVyCnRpbWUsIGFuZCBjbDE0IG92ZXIgdGltZS4KCmBgYHtyIGNob29zZV9jb250cmFzdHN9CmNsYl90aW1lc19rZWVwZXJzIDwtIGxpc3QoCiAgICAiY2xicl90cnlwX3RvX2E2MCIgPSBjKCJDTEJyLkE2MCIsICJDTEJyLlRyeXAiKSwKIyMgICAgImNsYnJfdHJ5cF90b19hOTYiID0gYygiQ0xCci5BOTYiLCAiQ0xCci5UcnlwIiksCiAgICAiY2xicl9hNjBfdG9fYTk2IiA9IGMoIkNMQnIuQTk2IiwgIkNMQnIuQTYwIiksCiAgICAiY2xicl9hOTZfdG9fdHJ5cCIgPSBjKCJDTEJyLlRyeXAiLCAiQ0xCci5BOTYiKSkKY2wxNF90aW1lc19rZWVwZXJzIDwtIGxpc3QoCiAgICAiY2wxNF90cnlwX3RvX2E2MCIgPSBjKCJDTDE0LkE2MCIsICJDTDE0LlRyeXAiKSwKIyMgICAgImNsMTRfdHJ5cF90b19hOTYiID0gYygiQ0wxNC5BOTYiLCAiQ0wxNC5UcnlwIiksCiAgICAiY2wxNF9hNjBfdG9fYTk2IiA9IGMoIkNMMTQuQTk2IiwgIkNMMTQuQTYwIiksCiAgICAiY2wxNF9hOTZfdG9fdHJ5cCIgPSBjKCJDTDE0LlRyeXAiLCAiQ0wxNC5BOTYiKSkKdGltZXNfa2VlcGVycyA8LSBsaXN0KAogICAgImNsYnJfdHJ5cF90b19hNjAiID0gYygiQ0xCci5BNjAiLCAiQ0xCci5UcnlwIiksCiAgICAiY2xicl9hNjBfdG9fYTk2IiA9IGMoIkNMQnIuQTk2IiwgIkNMQnIuQTYwIiksCiAgICAiY2xicl9hOTZfdG9fdHJ5cCIgPSBjKCJDTEJyLlRyeXAiLCAiQ0xCci5BOTYiKSwKICAgICJjbDE0X3RyeXBfdG9fYTYwIiA9IGMoIkNMMTQuQTYwIiwgIkNMMTQuVHJ5cCIpLAogICAgImNsMTRfYTYwX3RvX2E5NiIgPSBjKCJDTDE0LkE5NiIsICJDTDE0LkE2MCIpLAogICAgImNsMTRfYTk2X3RvX3RyeXAiID0gYygiQ0wxNC5UcnlwIiwgIkNMMTQuQTk2IikpCnN0cmFpbnNfa2VlcGVycyA8LSBsaXN0KAogICAgImE2MF9jbGJyX292ZXJfY2wxNCIgPSBjKCJDTEJyLkE2MCIsICJDTDE0LkE2MCIpLAogICAgImE5Nl9jbGJyX292ZXJfY2wxNCIgPSBjKCJDTEJyLkE5NiIsICJDTDE0LkE5NiIpLAogICAgInRyeXBfY2xicl9vdmVyX2NsMTQiID0gYygiQ0xCci5UcnlwIiwgIkNMMTQuVHJ5cCIpKQpgYGAKCiMgRXh0cmFjdCBzdHJhaW4gY29tcGFyaXNvbnMKCmBgYHtyIHN0cmFpbl9jb21wYXJpc29uX2V4dHJhY3QsIGZpZy5zaG93PSJoaWRlIn0Kc3RyYWluX2NvbXBhcmlzb25zIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogICAgY2xfYWxsX2RlX3N2YSwKICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvc3RyYWluX2NvbXBhcmlzb25zLXYiLCB2ZXIsICIueGxzeCIpLAogICAgcm93bmFtZXM9RkFMU0UsCiAgICBrZWVwZXJzPXN0cmFpbnNfa2VlcGVycykpCgpzdHJhaW5fb25seV9saW1tYSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICAgIGNsX2FsbF9kZV9zdmEsCiAgICBleGNlbD1wYXN0ZTAoImV4Y2VsL3N0cmFpbl9jb21wYXJpc29uX2xpbW1hLXYiLCB2ZXIsICIueGxzeCIpLAogICAga2VlcGVycz1zdHJhaW5zX2tlZXBlcnMsCiAgICByb3duYW1lcz1GQUxTRSwKICAgIGluY2x1ZGVfYmFzaWM9RkFMU0UsCiAgICBpbmNsdWRlX2Rlc2VxPUZBTFNFLAogICAgaW5jbHVkZV9lZGdlcj1GQUxTRSkpCmBgYAoKIyBDTEJyZW5lciB0aW1lIGNvbXBhcmlzb25zCgpgYGB7ciBjbGJyX3RpbWVfY29tcGFyaXNvbl9leHRyYWN0LCBmaWcuc2hvdz0iaGlkZSJ9CmNsYl9jb21wYXJlX3RpbWVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogICAgY2xfYWxsX2RlX3N2YSwKICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvY2xiX2NvbXBhcmVfdGltZXMtdiIsIHZlciwgIi54bHN4IiksCiAgICByb3duYW1lcz1GQUxTRSwKICAgIGtlZXBlcnM9Y2xiX3RpbWVzX2tlZXBlcnMpKQoKY2xiX29ubHlfbGltbWEgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgICBjbF9hbGxfZGVfc3ZhLAogICAgZXhjZWw9cGFzdGUwKCJleGNlbC9jbGJfY29tcGFyZV90aW1lc19saW1tYS12IiwgdmVyLCAiLnhsc3giKSwKICAgIGtlZXBlcnM9Y2xiX3RpbWVzX2tlZXBlcnMsCiAgICByb3duYW1lcz1GQUxTRSwKICAgIGluY2x1ZGVfYmFzaWM9RkFMU0UsCiAgICBpbmNsdWRlX2Rlc2VxPUZBTFNFLAogICAgaW5jbHVkZV9lZGdlcj1GQUxTRSkpCmBgYAoKIyBDTDE0IHRpbWUgY29tcGFyaXNvbnMKCmBgYHtyIGNsMTRfdGltZV9jb21wYXJpc29uX2V4dHJhY3QsIGZpZy5zaG93PSJoaWRlIn0KY2wxNF9jb21wYXJlX3RpbWVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogICAgY2xfYWxsX2RlX3N2YSwKICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvY2wxNF9jb21wYXJlX3RpbWVzLXYiLCB2ZXIsICIueGxzeCIpLAogICAgcm93bmFtZXM9RkFMU0UsCiAgICBrZWVwZXJzPWNsMTRfdGltZXNfa2VlcGVycykpCgpjbDE0X29ubHlfbGltbWEgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgICBjbF9hbGxfZGVfc3ZhLAogICAgZXhjZWw9cGFzdGUwKCJleGNlbC9jbDE0X2NvbXBhcmVfdGltZXNfbGltbWEtdiIsIHZlciwgIi54bHN4IiksCiAgICBrZWVwZXJzPWNsMTRfdGltZXNfa2VlcGVycywKICAgIHJvd25hbWVzPUZBTFNFLAogICAgaW5jbHVkZV9iYXNpYz1GQUxTRSwKICAgIGluY2x1ZGVfZGVzZXE9RkFMU0UsCiAgICBpbmNsdWRlX2VkZ2VyPUZBTFNFKSkKYGBgCgpgYGB7ciBhbGxfc3RyYWluX2NvbWJpbmVkfQphbGxfY29tcGFyZV90aW1lcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICAgIGNsX2FsbF9kZV9zdmEsCiAgICBleGNlbD1wYXN0ZTAoImV4Y2VsL2NvbXBhcmVfdGltZXNfYWxsX2xpbW1hLXYiLCB2ZXIsICIueGxzeCIpLAogICAga2VlcGVycz10aW1lc19rZWVwZXJzLAogICAgaW5jbHVkZV9iYXNpYz1GQUxTRSwKICAgIGluY2x1ZGVfZGVzZXE9RkFMU0UsCiAgICBpbmNsdWRlX2VkZ2VyPUZBTFNFLAogICAgcm93bmFtZXM9RkFMU0UpKQoKYWxsX3RpbWVzX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgYWxsX2NvbXBhcmVfdGltZXMsCiAgICBhY2NvcmRpbmdfdG89ImxpbW1hIiwKICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvYWxsX3RpbWVzX3NpZy12IiwgdmVyLCAiLnhsc3giKSkpCmBgYAoKIyBCb3hwbG90cyBvZiBDTEIvQ0wxNCBnZW5lIGZhbWlsaWVzCgpIbW0gSSB0aGluayB0aGUgZ29hbCBsYWlkIG91dCBieSBOYWppYiBpcyB0byBoYXZlIHNvbWUgcGxvdHMgd2hpY2ggc2hvdyBpbiBhCm1vcmUgY29uY2lzZSBmYXNoaW9uIHRoZSBjaGFuZ2VzIG92ZXIgdGltZSBpbiB0aGVzZSBzcGVjaWZpYyBnZW5lIGZhbWlsaWVzIGFuZApiZSBhYmxlIHRvIGNvbXBhcmUgdGhvc2UgZGlmZmVyZW5jZXMgZnJvbSBDTDE0IHRvIENMQnJlbmVyLgoKSSBtZXNzZWQgdXAgdGhlIHNlbWFudGljIGNvcHkgbnVtYmVyIGZpbHRlciB3aXRoIHRoaXMuCgpgYGB7ciBmYW1pbHlfYm94cGxvdHN9CiMjIEluIHRoaXMgY2FzZSwgSSB3YW50ICdyYW5kb20nIHRvIGJlIGEgc2FtcGxpbmcgb2YgYWxsIGRhdGEKZXh0cmFjdF9mYW1pbGllc19jbGJyIDwtIHNtKHNlbWFudGljX2NvcHludW1iZXJfZXh0cmFjdCgKICAgIGNsYl9jb21wYXJlX3RpbWVzLAogICAgc2VtYW50aWNfY29sdW1uPSJnZW5lZGVzY3JpcHRpb24iKSkKZXh0cmFjdF9mYW1pbGllc19jbDE0IDwtIHNtKHNlbWFudGljX2NvcHludW1iZXJfZXh0cmFjdCgKICAgIGNsMTRfY29tcGFyZV90aW1lcywKICAgIHNlbWFudGljX2NvbHVtbj0iZ2VuZWRlc2NyaXB0aW9uIikpCgpkZ2ZfZGYgPC0gZGF0YS5mcmFtZSgKICAgICJDTEJyLkE2MCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsYnIkZGF0YSRDTEJyLkE5Nl92c19DTEJyLkE2MCRER0YkbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5BNjAiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5BOTZfdnNfQ0wxNC5BNjAkREdGJGxpbW1hX2xvZ2ZjLAogICAgIkNMQnIuQTk2IiA9IGV4dHJhY3RfZmFtaWxpZXNfY2xiciRkYXRhJENMQnIuVHJ5cF92c19DTEJyLkE5NiRER0YkbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5BOTYiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5UcnlwX3ZzX0NMMTQuQTk2JERHRiRsaW1tYV9sb2dmYywKICAgICJDTEJyLlRyeXAiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5BNjBfdnNfQ0xCci5UcnlwJERHRiRsaW1tYV9sb2dmYywKICAgICJDTDE0LlRyeXAiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5BNjBfdnNfQ0wxNC5UcnlwJERHRiRsaW1tYV9sb2dmYwopCm1hc3BfZGYgPC0gZGF0YS5mcmFtZSgKICAgICJDTEJyLkE2MCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsYnIkZGF0YSRDTEJyLkE5Nl92c19DTEJyLkE2MCRNQVNQJGxpbW1hX2xvZ2ZjLAogICAgIkNMMTQuQTYwIiA9IGV4dHJhY3RfZmFtaWxpZXNfY2wxNCRkYXRhJENMMTQuQTk2X3ZzX0NMMTQuQTYwJE1BU1AkbGltbWFfbG9nZmMsCiAgICAiQ0xCci5BOTYiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5UcnlwX3ZzX0NMQnIuQTk2JE1BU1AkbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5BOTYiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5UcnlwX3ZzX0NMMTQuQTk2JE1BU1AkbGltbWFfbG9nZmMsCiAgICAiQ0xCci5UcnlwIiA9IGV4dHJhY3RfZmFtaWxpZXNfY2xiciRkYXRhJENMQnIuQTYwX3ZzX0NMQnIuVHJ5cCRNQVNQJGxpbW1hX2xvZ2ZjLAogICAgIkNMMTQuVHJ5cCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsMTQkZGF0YSRDTDE0LkE2MF92c19DTDE0LlRyeXAkTUFTUCRsaW1tYV9sb2dmYwopCm11Y2luX2RmIDwtIGRhdGEuZnJhbWUoCiAgICAiQ0xCci5BNjAiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5BOTZfdnNfQ0xCci5BNjAkbXVjaW4kbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5BNjAiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5BOTZfdnNfQ0wxNC5BNjAkbXVjaW4kbGltbWFfbG9nZmMsCiAgICAiQ0xCci5BOTYiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5UcnlwX3ZzX0NMQnIuQTk2JG11Y2luJGxpbW1hX2xvZ2ZjLAogICAgIkNMMTQuQTk2IiA9IGV4dHJhY3RfZmFtaWxpZXNfY2wxNCRkYXRhJENMMTQuVHJ5cF92c19DTDE0LkE5NiRtdWNpbiRsaW1tYV9sb2dmYywKICAgICJDTEJyLlRyeXAiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5BNjBfdnNfQ0xCci5UcnlwJG11Y2luJGxpbW1hX2xvZ2ZjLAogICAgIkNMMTQuVHJ5cCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsMTQkZGF0YSRDTDE0LkE2MF92c19DTDE0LlRyeXAkbXVjaW4kbGltbWFfbG9nZmMKKQpzaWFsaWRhc2VfZGYgPC0gZGF0YS5mcmFtZSgKICAgICJDTEJyLkE2MCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsYnIkZGF0YSRDTEJyLkE5Nl92c19DTEJyLkE2MCRzaWFsaWRhc2UkbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5BNjAiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5BOTZfdnNfQ0wxNC5BNjAkc2lhbGlkYXNlJGxpbW1hX2xvZ2ZjLAogICAgIkNMQnIuQTk2IiA9IGV4dHJhY3RfZmFtaWxpZXNfY2xiciRkYXRhJENMQnIuVHJ5cF92c19DTEJyLkE5NiRzaWFsaWRhc2UkbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5BOTYiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5UcnlwX3ZzX0NMMTQuQTk2JHNpYWxpZGFzZSRsaW1tYV9sb2dmYywKICAgICJDTEJyLlRyeXAiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5BNjBfdnNfQ0xCci5UcnlwJHNpYWxpZGFzZSRsaW1tYV9sb2dmYywKICAgICJDTDE0LlRyeXAiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5BNjBfdnNfQ0wxNC5UcnlwJHNpYWxpZGFzZSRsaW1tYV9sb2dmYwopCnJoc19kZiA8LSBkYXRhLmZyYW1lKAogICAgIkNMQnIuQTYwIiA9IGV4dHJhY3RfZmFtaWxpZXNfY2xiciRkYXRhJENMQnIuQTk2X3ZzX0NMQnIuQTYwJFJIUyRsaW1tYV9sb2dmYywKICAgICJDTDE0LkE2MCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsMTQkZGF0YSRDTDE0LkE5Nl92c19DTDE0LkE2MCRSSFMkbGltbWFfbG9nZmMsCiAgICAiQ0xCci5BOTYiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5UcnlwX3ZzX0NMQnIuQTk2JFJIUyRsaW1tYV9sb2dmYywKICAgICJDTDE0LkE5NiIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsMTQkZGF0YSRDTDE0LlRyeXBfdnNfQ0wxNC5BOTYkUkhTJGxpbW1hX2xvZ2ZjLAogICAgIkNMQnIuVHJ5cCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsYnIkZGF0YSRDTEJyLkE2MF92c19DTEJyLlRyeXAkUkhTJGxpbW1hX2xvZ2ZjLAogICAgIkNMMTQuVHJ5cCIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsMTQkZGF0YSRDTDE0LkE2MF92c19DTDE0LlRyeXAkUkhTJGxpbW1hX2xvZ2ZjCikKZ3A2M19kZiA8LSBkYXRhLmZyYW1lKAogICAgIkNMQnIuQTYwIiA9IGV4dHJhY3RfZmFtaWxpZXNfY2xiciRkYXRhJENMQnIuQTk2X3ZzX0NMQnIuQTYwJEdQNjMkbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5BNjAiID0gZXh0cmFjdF9mYW1pbGllc19jbDE0JGRhdGEkQ0wxNC5BOTZfdnNfQ0wxNC5BNjAkR1A2MyRsaW1tYV9sb2dmYywKICAgICJDTEJyLkE5NiIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsYnIkZGF0YSRDTEJyLlRyeXBfdnNfQ0xCci5BOTYkR1A2MyRsaW1tYV9sb2dmYywKICAgICJDTDE0LkE5NiIgPSBleHRyYWN0X2ZhbWlsaWVzX2NsMTQkZGF0YSRDTDE0LlRyeXBfdnNfQ0wxNC5BOTYkR1A2MyRsaW1tYV9sb2dmYywKICAgICJDTEJyLlRyeXAiID0gZXh0cmFjdF9mYW1pbGllc19jbGJyJGRhdGEkQ0xCci5BNjBfdnNfQ0xCci5UcnlwJEdQNjMkbGltbWFfbG9nZmMsCiAgICAiQ0wxNC5UcnlwIiA9IGV4dHJhY3RfZmFtaWxpZXNfY2wxNCRkYXRhJENMMTQuQTYwX3ZzX0NMMTQuVHJ5cCRHUDYzJGxpbW1hX2xvZ2ZjCikKCmRnZl9ib3ggPC0gcGxvdF9ib3hwbG90KGRnZl9kZikKZGdmX2JveApkZ2ZfYmVhbiA8LSBiZWFucGxvdDo6YmVhbnBsb3QoZGdmX2RmLCBtZXRob2Q9ImppdHRlciIpCm1hc3BfYm94IDwtIHBsb3RfYm94cGxvdChtYXNwX2RmKQptYXNwX2JveAptYXNwX2JlYW4gPC0gYmVhbnBsb3Q6OmJlYW5wbG90KG1hc3BfZGYsIG1ldGhvZD0iaml0dGVyIikKbXVjaW5fYm94IDwtIHBsb3RfYm94cGxvdChtdWNpbl9kZikKbXVjaW5fYm94Cm11Y2luX2JlYW4gPC0gYmVhbnBsb3Q6OmJlYW5wbG90KG11Y2luX2RmLCBtZXRob2Q9ImppdHRlciIpCnNpYWxpZGFzZV9ib3ggPC0gcGxvdF9ib3hwbG90KHNpYWxpZGFzZV9kZikKc2lhbGlkYXNlX2JveApzaWFsaWRhc2VfYmVhbiA8LSBiZWFucGxvdDo6YmVhbnBsb3Qoc2lhbGlkYXNlX2RmLCBtZXRob2Q9ImppdHRlciIpCnJoc19ib3ggPC0gcGxvdF9ib3hwbG90KHJoc19kZikKcmhzX2JveApyaHNfYmVhbiA8LSBiZWFucGxvdDo6YmVhbnBsb3QocmhzX2RmLCBtZXRob2Q9ImppdHRlciIpCmdwX2JveCA8LSBwbG90X2JveHBsb3QoZ3A2M19kZikKZ3BfYm94CmdwX2JlYW4gPC0gYmVhbnBsb3Q6OmJlYW5wbG90KGdwNjNfZGYsIG1ldGhvZD0iaml0dGVyIikKCiMjIENvbXBhcmUgREdGIGRpc3RyaWJ1dGlvbnMgYWNyb3NzIHN0cmFpbnMKY29yLnRlc3QoZGdmX2RmW1siQ0xCci5UcnlwIl1dLCBkZ2ZfZGZbWyJDTDE0LlRyeXAiXV0pCnQudGVzdChkZ2ZfZGZbWyJDTEJyLlRyeXAiXV0sIGRnZl9kZltbIkNMMTQuVHJ5cCJdXSkKa3MudGVzdChkZ2ZfZGZbWyJDTEJyLlRyeXAiXV0sIGRnZl9kZltbIkNMMTQuVHJ5cCJdXSkKY29yLnRlc3QoZGdmX2RmW1siQ0xCci5BNjAiXV0sIGRnZl9kZltbIkNMMTQuQTYwIl1dKQp0LnRlc3QoZGdmX2RmW1siQ0xCci5BNjAiXV0sIGRnZl9kZltbIkNMMTQuQTYwIl1dKQprcy50ZXN0KGRnZl9kZltbIkNMQnIuQTYwIl1dLCBkZ2ZfZGZbWyJDTDE0LkE2MCJdXSkKY29yLnRlc3QoZGdmX2RmW1siQ0xCci5BOTYiXV0sIGRnZl9kZltbIkNMMTQuQTk2Il1dKQp0LnRlc3QoZGdmX2RmW1siQ0xCci5BOTYiXV0sIGRnZl9kZltbIkNMMTQuQTk2Il1dKQprcy50ZXN0KGRnZl9kZltbIkNMQnIuQTk2Il1dLCBkZ2ZfZGZbWyJDTDE0LkE5NiJdXSkKCiMjIENvbXBhcmUgTUFTUCBkaXN0cmlidXRpb25zIGFjcm9zcyBzdHJhaW5zCmNvci50ZXN0KG1hc3BfZGZbWyJDTEJyLlRyeXAiXV0sIG1hc3BfZGZbWyJDTDE0LlRyeXAiXV0pCnQudGVzdChtYXNwX2RmW1siQ0xCci5UcnlwIl1dLCBtYXNwX2RmW1siQ0wxNC5UcnlwIl1dKQprcy50ZXN0KG1hc3BfZGZbWyJDTEJyLlRyeXAiXV0sIG1hc3BfZGZbWyJDTDE0LlRyeXAiXV0pCmNvci50ZXN0KG1hc3BfZGZbWyJDTEJyLkE2MCJdXSwgbWFzcF9kZltbIkNMMTQuQTYwIl1dKQp0LnRlc3QobWFzcF9kZltbIkNMQnIuQTYwIl1dLCBtYXNwX2RmW1siQ0wxNC5BNjAiXV0pCmtzLnRlc3QobWFzcF9kZltbIkNMQnIuQTYwIl1dLCBtYXNwX2RmW1siQ0wxNC5BNjAiXV0pCmNvci50ZXN0KG1hc3BfZGZbWyJDTEJyLkE5NiJdXSwgbWFzcF9kZltbIkNMMTQuQTk2Il1dKQp0LnRlc3QobWFzcF9kZltbIkNMQnIuQTk2Il1dLCBtYXNwX2RmW1siQ0wxNC5BOTYiXV0pCmtzLnRlc3QobWFzcF9kZltbIkNMQnIuQTk2Il1dLCBtYXNwX2RmW1siQ0wxNC5BOTYiXV0pCgojIyBDb21wYXJlIE1VQ0lOIGRpc3RyaWJ1dGlvbnMgYWNyb3NzIHN0cmFpbnMKY29yLnRlc3QobXVjaW5fZGZbWyJDTEJyLlRyeXAiXV0sIG11Y2luX2RmW1siQ0wxNC5UcnlwIl1dKQp0LnRlc3QobXVjaW5fZGZbWyJDTEJyLlRyeXAiXV0sIG11Y2luX2RmW1siQ0wxNC5UcnlwIl1dKQprcy50ZXN0KG11Y2luX2RmW1siQ0xCci5UcnlwIl1dLCBtdWNpbl9kZltbIkNMMTQuVHJ5cCJdXSkKY29yLnRlc3QobXVjaW5fZGZbWyJDTEJyLkE2MCJdXSwgbXVjaW5fZGZbWyJDTDE0LkE2MCJdXSkKdC50ZXN0KG11Y2luX2RmW1siQ0xCci5BNjAiXV0sIG11Y2luX2RmW1siQ0wxNC5BNjAiXV0pCmtzLnRlc3QobXVjaW5fZGZbWyJDTEJyLkE2MCJdXSwgbXVjaW5fZGZbWyJDTDE0LkE2MCJdXSkKY29yLnRlc3QobXVjaW5fZGZbWyJDTEJyLkE5NiJdXSwgbXVjaW5fZGZbWyJDTDE0LkE5NiJdXSkKdC50ZXN0KG11Y2luX2RmW1siQ0xCci5BOTYiXV0sIG11Y2luX2RmW1siQ0wxNC5BOTYiXV0pCmtzLnRlc3QobXVjaW5fZGZbWyJDTEJyLkE5NiJdXSwgbXVjaW5fZGZbWyJDTDE0LkE5NiJdXSkKCiMjIENvbXBhcmUgU0lBTElEQVNFIGRpc3RyaWJ1dGlvbnMgYWNyb3NzIHN0cmFpbnMKY29yLnRlc3Qoc2lhbGlkYXNlX2RmW1siQ0xCci5UcnlwIl1dLCBzaWFsaWRhc2VfZGZbWyJDTDE0LlRyeXAiXV0pCnQudGVzdChzaWFsaWRhc2VfZGZbWyJDTEJyLlRyeXAiXV0sIHNpYWxpZGFzZV9kZltbIkNMMTQuVHJ5cCJdXSkKa3MudGVzdChzaWFsaWRhc2VfZGZbWyJDTEJyLlRyeXAiXV0sIHNpYWxpZGFzZV9kZltbIkNMMTQuVHJ5cCJdXSkKY29yLnRlc3Qoc2lhbGlkYXNlX2RmW1siQ0xCci5BNjAiXV0sIHNpYWxpZGFzZV9kZltbIkNMMTQuQTYwIl1dKQp0LnRlc3Qoc2lhbGlkYXNlX2RmW1siQ0xCci5BNjAiXV0sIHNpYWxpZGFzZV9kZltbIkNMMTQuQTYwIl1dKQprcy50ZXN0KHNpYWxpZGFzZV9kZltbIkNMQnIuQTYwIl1dLCBzaWFsaWRhc2VfZGZbWyJDTDE0LkE2MCJdXSkKY29yLnRlc3Qoc2lhbGlkYXNlX2RmW1siQ0xCci5BOTYiXV0sIHNpYWxpZGFzZV9kZltbIkNMMTQuQTk2Il1dKQp0LnRlc3Qoc2lhbGlkYXNlX2RmW1siQ0xCci5BOTYiXV0sIHNpYWxpZGFzZV9kZltbIkNMMTQuQTk2Il1dKQprcy50ZXN0KHNpYWxpZGFzZV9kZltbIkNMQnIuQTk2Il1dLCBzaWFsaWRhc2VfZGZbWyJDTDE0LkE5NiJdXSkKCiMjIENvbXBhcmUgUkhTIGRpc3RyaWJ1dGlvbnMgYWNyb3NzIHN0cmFpbnMKY29yLnRlc3QocmhzX2RmW1siQ0xCci5UcnlwIl1dLCByaHNfZGZbWyJDTDE0LlRyeXAiXV0pCnQudGVzdChyaHNfZGZbWyJDTEJyLlRyeXAiXV0sIHJoc19kZltbIkNMMTQuVHJ5cCJdXSkKa3MudGVzdChyaHNfZGZbWyJDTEJyLlRyeXAiXV0sIHJoc19kZltbIkNMMTQuVHJ5cCJdXSkKY29yLnRlc3QocmhzX2RmW1siQ0xCci5BNjAiXV0sIHJoc19kZltbIkNMMTQuQTYwIl1dKQp0LnRlc3QocmhzX2RmW1siQ0xCci5BNjAiXV0sIHJoc19kZltbIkNMMTQuQTYwIl1dKQprcy50ZXN0KHJoc19kZltbIkNMQnIuQTYwIl1dLCByaHNfZGZbWyJDTDE0LkE2MCJdXSkKY29yLnRlc3QocmhzX2RmW1siQ0xCci5BOTYiXV0sIHJoc19kZltbIkNMMTQuQTk2Il1dKQp0LnRlc3QocmhzX2RmW1siQ0xCci5BOTYiXV0sIHJoc19kZltbIkNMMTQuQTk2Il1dKQprcy50ZXN0KHJoc19kZltbIkNMQnIuQTk2Il1dLCByaHNfZGZbWyJDTDE0LkE5NiJdXSkKCiMjIENvbXBhcmUgR1A2MyBkaXN0cmlidXRpb25zIGFjcm9zcyBzdHJhaW5zCmNvci50ZXN0KGdwNjNfZGZbWyJDTEJyLlRyeXAiXV0sIGdwNjNfZGZbWyJDTDE0LlRyeXAiXV0pCnQudGVzdChncDYzX2RmW1siQ0xCci5UcnlwIl1dLCBncDYzX2RmW1siQ0wxNC5UcnlwIl1dKQprcy50ZXN0KGdwNjNfZGZbWyJDTEJyLlRyeXAiXV0sIGdwNjNfZGZbWyJDTDE0LlRyeXAiXV0pCmNvci50ZXN0KGdwNjNfZGZbWyJDTEJyLkE2MCJdXSwgZ3A2M19kZltbIkNMMTQuQTYwIl1dKQp0LnRlc3QoZ3A2M19kZltbIkNMQnIuQTYwIl1dLCBncDYzX2RmW1siQ0wxNC5BNjAiXV0pCmtzLnRlc3QoZ3A2M19kZltbIkNMQnIuQTYwIl1dLCBncDYzX2RmW1siQ0wxNC5BNjAiXV0pCmNvci50ZXN0KGdwNjNfZGZbWyJDTEJyLkE5NiJdXSwgZ3A2M19kZltbIkNMMTQuQTk2Il1dKQp0LnRlc3QoZ3A2M19kZltbIkNMQnIuQTk2Il1dLCBncDYzX2RmW1siQ0wxNC5BOTYiXV0pCmtzLnRlc3QoZ3A2M19kZltbIkNMQnIuQTk2Il1dLCBncDYzX2RmW1siQ0wxNC5BOTYiXV0pCmBgYAoKIyBTdHJhaW4gc2lnbmlmaWNhbmNlCgpgYGB7ciBzdHJhaW5fc2lnbmlmaWNhbmNlX2V4dHJhY3QsIGZpZy5zaG93PSJoaWRlIiwgaW5jbHVkZT1GQUxTRSwgZXZhbD1GQUxTRX0Kc3RyYWluc19zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHN0cmFpbl9jb21wYXJpc29ucywgYWNjb3JkaW5nX3RvPSJsaW1tYSIsCiAgICBleGNlbD1wYXN0ZTAoImV4Y2VsL3N0cmFpbl9jb21wYXJpc29uc19zaWctdiIsIHZlciwgIi54bHN4IikpKQpgYGAKCiMgQ0xCciBzaWduaWZpY2FuY2UKCmBgYHtyIGNsYnJfc2lnbmlmaWNhbmNlX2V4dHJhY3QsIGZpZy5zaG93PSJoaWRlIn0KY2xicl90aW1lc19zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNsYl9jb21wYXJlX3RpbWVzLCBhY2NvcmRpbmdfdG89ImxpbW1hIiwKICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvY2xiX3RpbWVzX3NpZy12IiwgdmVyLCAiLnhsc3giKSkpCmBgYAojIENMMTQgc2lnbmlmaWNhbmNlCgpgYGB7ciBjbDE0X3NpZ25pZmljYW5jZV9leHRyYWN0LCBmaWcuc2hvdz0iaGlkZSJ9CmNsMTRfdGltZXNfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICBjbDE0X2NvbXBhcmVfdGltZXMsIGFjY29yZGluZ190bz0ibGltbWEiLAogICAgZXhjZWw9cGFzdGUwKCJleGNlbC9jbDE0X3RpbWVzX3NpZy12IiwgdmVyLCAiLnhsc3giKSkpCmBgYAoKIyBTYW5pdHkgY2hlY2sgb24gcm91dGUgdG8gYW4gaW1wcm92ZWQgbm9uLXJwa20gZXhwcmVzc2lvbiB2YWx1ZQoKSSB3YW50IHRvIG1ha2UgMTAwJSBjZXJ0YWluIHRoYXQgd2hlbiBJIHBsb3Qgd2hhdCBJIGNhbGwgdGhlIGNvZWZmaWNpZW50IHNjYXR0ZXIKcGxvdCwgdGhhdCB0aGUgZG90cyBvbiB0aGUgc2NyZWVuIGFyZSBpbiBmYWN0IHJlcHJlc2VudGF0aXZlIG9mIHRoZQpwb3N0LWxpbW1hL2Rlc2VxL2VkZ2VyIHZhbHVlcy4KCkkga2VlcCBhIHNldCBvZiB0YWJsZXMgaW4gbXkgbGltbWEgb3V0cHV0IGNhbGxlZCAnaWRlbnRpdHlfdGFibGVzJyB3aGljaCBpbgp0aGVvcnkgYXJlIHRoZSBwcmUtY29udHJhc3QgdmFsdWVzIGZvciBlYWNoIGdlbmUgYnkgY29uZGl0aW9uLiAgSWYgSSBhbSAxMDAlCmNvcnJlY3QsIHRoZW4gSSBzaG91bGQgYmUgYWJsZSB0byByZWNyZWF0ZSB0aGUgbG9nRkMgZnJvbSB0b3BUYWJsZSgpIGJ5IHRha2lubmcKdHdvIG9mIHRoZXNlIGFuZCBzdWJ0cmFjdGluZyB0aGVtLgoKYGBge3Igc2FuaXR5X2NoZWNrX25vX3Jwa219CnRlc3RfZ2VuZXNfY2xicl90cnlwIDwtIGNsX2FsbF9kZV9zdmFbWyJsaW1tYSJdXVtbImlkZW50aXR5X3RhYmxlcyJdXVtbIkNMQnIuVHJ5cCJdXQp0ZXN0X2dlbmVzX2NsYnJfYTYwIDwtIGNsX2FsbF9kZV9zdmFbWyJsaW1tYSJdXVtbImlkZW50aXR5X3RhYmxlcyJdXVtbIkNMQnIuQTYwIl1dCnRlc3RfZ2VuZXNfY2xicl9jb250cmFzdCA8LSBjbF9hbGxfZGVfc3ZhW1sibGltbWEiXV1bWyJhbGxfdGFibGVzIl1dW1siQ0xCci5UcnlwX3ZzX0NMQnIuQTYwIl1dCgp0ZXN0X2dlbmVzX2NsYnJfdHJ5cFsiVGNDTEIuNTExMjExLjE2MCIsIF0KdGVzdF9nZW5lc19jbGJyX2E2MFsiVGNDTEIuNTExMjExLjE2MCIsIF0KdGVzdF9nZW5lc19jbGJyX2NvbnRyYXN0WyJUY0NMQi41MTEyMTEuMTYwIiwgXQoxMC43NyAtIDExLjY0CmBgYAoKT24gdGhlIG90aGVyIGhhbmQsIEkgYWxzbyB3YW50IHRvIGhhdmUgYSBzdGFuZGFyZCBlcnJvciAvIHZhcmlhbmNlIGVzdGltYXRlIHRvCmNvbWUgYWxvbmcgd2l0aCB0aGlzIGRhdGEuICBJIGhhdmUgdHdvIGxpa2VseSBwbGFjZXMgdG8gYWNxdWlyZSB0aGF0OgoKMS4gIEFzIHBlciBIZWN0b3IncyBlbWFpbCwgdGFrZSB0aGUgbG9nRkMgZnJvbSB0aGUgaWRlbnRpdHkgdGFibGUgYW5kIGRpdmlkZSBpdAogICAgYnkgdGhlIHQgc3RhdGlzdGljIGluIHRoZSBzYW1lIHRhYmxlLiAgVGhpcyBzaG91bGQgcHJvdmlkZSBzdGFuZGFyZCBlcnJvci4KMi4gIGVCYXllcygpIG9yIHBlcmhhcHMgY29udHJhc3QuZml0KCkgSSBhbSBub3Qgc3VyZSB3aGljaCwgZ2VuZXJhdGVzIGEgdGFibGUKICAgIG5hbWVkICdzdGRldi51bnNjYWxlZCcgZm9yIGV2ZXJ5IGdlbmUvY29uZGl0aW9uLiAgVGhpcyBtYXkgYmUgY29sbGVjdGVkLgoKV2l0aCB0aGF0IGluIG1pbmQsIEkgd3JvdGUgYSBsaXR0bGUgZnVuY3Rpb24gZ2V0X3BhaXJ3aXNlX2dlbmVfYWJ1bmRhbmNlcygpIHRoYXQKY29sbGVjdHMgdGhlc2UgaW4gZm91ciB0YWJsZXM6IGV4cHJlc3Npb25fdmFsdWVzLCB0X3ZhbHVlcywgZXJyb3JfdmFsdWVzLCBhbmQKc3RkZXZfdmFsdWVzLgoKYGBge3IgZ2V0X3BhaXJ3aXNlX2dlbmVfYWJ1bmRhbmNlc30KYWJ1bmRhbmNlcyA8LSBnZXRfcGFpcndpc2VfZ2VuZV9hYnVuZGFuY2VzKGNsX2FsbF9kZV9zdmEpCnRtcF9leHByZXNzaW9uIDwtIGFidW5kYW5jZXNbWyJleHByZXNzaW9uX3ZhbHVlcyJdXQp0bXBfYW5ub3RhdGlvbnMgPC0gQmlvYmFzZTo6ZkRhdGEoY2xfYWxsX2tleHB0djFbWyJleHByZXNzaW9uc2V0Il1dKQp0bXBfZXhwcmVzc2lvbiA8LSBtZXJnZSh0bXBfYW5ub3RhdGlvbnMsIHRtcF9leHByZXNzaW9uLCBieT0icm93Lm5hbWVzIikKcm93bmFtZXModG1wX2V4cHJlc3Npb24pIDwtIHRtcF9leHByZXNzaW9uW1siUm93Lm5hbWVzIl1dCnRtcF9leHByZXNzaW9uIDwtIHRtcF9leHByZXNzaW9uWywgLTFdCnRtcF9leHByZXNzaW9uIDwtIHRtcF9leHByZXNzaW9uWywgYygidHhjaHJvbSIsICJ0eHN0cmFuZCIsICJnZW5lZGVzY3JpcHRpb24iLCAid2lkdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNMMTQuQTYwIiwgIkNMMTQuQTk2IiwgIkNMMTQuVHJ5cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xCci5BNjAiLCAiQ0xCci5BOTYiLCAiQ0xCci5UcnlwIildCnRtcF9lcnJvcnMgPC0gYWJ1bmRhbmNlc1tbImFub3RoZXJfZXJyb3IiXV0KdG1wX2Vycm9ycyA8LSB0bXBfZXJyb3JzWywgMTo2XQpjb2xuYW1lcyh0bXBfZXJyb3JzKSA8LSBjKCJDTDE0LkE2MF9zZSIsICJDTDE0LkE5Nl9zZSIsICJDTDE0LlRyeXBfc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJDTEJyLkE2MF9zZSIsICJDTEJyX0E5Nl9zZSIsICJDTDE0LlRyeXBfc2UiKQp0bXBfZXhwcmVzc2lvbiA8LSBtZXJnZSh0bXBfZXhwcmVzc2lvbiwgdG1wX2Vycm9ycywgYnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKHRtcF9leHByZXNzaW9uKSA8LSB0bXBfZXhwcmVzc2lvbltbIlJvdy5uYW1lcyJdXQp0bXBfZXhwcmVzc2lvbiA8LSB0bXBfZXhwcmVzc2lvblssIC0xXQpleHByZXNzaW9uX3dyaXR0ZW4gPC0gd3JpdGVfeGxzKGRhdGE9dG1wX2V4cHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQ9ImV4cHJlc3Npb25fdmFsdWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iVGFibGUgUzMuIEV4cHJlc3Npb24gdmFsdWVzIG1ha2luZyB1cCB0aGUgY29udHJhc3QgbG9nRkNzICh3aXRoIHN0YW5kYXJkIGVycm9yIHZhbHVlcyBvYnRhaW5lZCBieSBkaXZpZGluZyB0aGUgZXhwcmVzc2lvbiBieSB0aGUgdC1zdGF0aXN0aWMuKSIpCiMjZXJyb3Jfd3JpdHRlbiA8LSB3cml0ZV94bHMoZGF0YT10bXBfZXJyb3JzLCBzdGFydF9jb2w9MTYsIHJvd25hbWVzPUZBTFNFLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjdGl0bGU9IkVycm9yIHZhbHVlIG9idGFpbmVkIGJ5IGRpdmlkaW5nIHRoZSBleHByZXNzaW9uIC8gdC1zdGF0aXN0aWMiLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0PSJleHByZXNzaW9uX3ZhbHVlcyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgd2I9ZXhwcmVzc2lvbl93cml0dGVuW1sid29ya2Jvb2siXV0pCm9wZW54bHN4OjpzYXZlV29ya2Jvb2sod2I9ZXhwcmVzc2lvbl93cml0dGVuW1sid29ya2Jvb2siXV0sCiAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1wYXN0ZTAoImV4Y2VsL3dyaXR0ZW5fYWJ1bmRhbmNlX3Rlc3QtdiIsIHZlciwgIi54bHN4IiksCiAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlPVRSVUUpCgojI2NhbmFyaWVzIDwtIGMoIlRjQ0xCLjUxMTUxMS42IiwgIlRjQ0xCLjUxMTUxMS4zIiwgIlRjQ0xCLjUxMTcyNy4xOTAiLCAiVGNDTEIuNDY5Nzg1LjQwIiwKIyMgICAgICAgICAgICAgICJUY0NMQi41MDY1NjMuMTAiLCAiVGNDTEIuNTExMTI3LjEwIiwgIlRjQ0xCLjUwNDAwNS42IiwgIlRjQ0xCLjUwNzYxMS4zMDAiKQpjYW5hcmllcyA8LSBjKCJUY0NMQi41MTE3MjcuMTkwIiwgIlRjQ0xCLjQ2OTc4NS40MCIsCiAgICAgICAgICAgICAgIlRjQ0xCLjUwNjU2My4xMCIsICJUY0NMQi41MTExMjcuMTAiLAogICAgICAgICAgICAgICJUY0NMQi41MDQwMDUuNiIsICJUY0NMQi41MDc2MTEuMzAwIikKIyMgUmVvcmRlciB0aGUgZGF0YSB0byBtYXRjaCB0aGUgZXhpc3RpbmcgZmlndXJlCmNvbmRpdGlvbnMgPC0gYygiQ0xCci5BNjAiLCAiQ0xCci5BOTYiLCAiQ0xCci5UcnlwIiwKICAgICAgICAgICAgICAgICJDTDE0LkE2MCIsICJDTDE0LkE5NiIsICJDTDE0LlRyeXAiKQpleHByZXNzaW9ucyA8LSBhYnVuZGFuY2VzW1siZXhwcmVzc2lvbl92YWx1ZXMiXV1bLCBjb25kaXRpb25zXQpzdGRldnMgPC0gYWJ1bmRhbmNlc1tbInN0ZGV2X3ZhbHVlcyJdXVssIGNvbmRpdGlvbnNdCmVycnMgPC0gYWJ1bmRhbmNlc1tbImVycm9yX3ZhbHVlcyJdXVssIGNvbmRpdGlvbnNdCmFkanBfdmFsdWVzIDwtIGxpc3QoKQpsaWJyYXJ5KGdncGxvdDIpCmZvciAobnVtIGluIDE6bGVuZ3RoKGNhbmFyaWVzKSkgewogICAgY2FuYXJ5IDwtIGNhbmFyaWVzW251bV0KICAgIHBvaW50IDwtIDIgXiBleHByZXNzaW9uc1tjYW5hcnksIF0KICAgICMjc3RkZXYgPC0gMiBeIHN0ZGV2c1tjYW5hcnksIF0KICAgIGVyciA8LSAyIF4gZXJyc1tjYW5hcnksIF0KICAgIG15X2NvbG9ycyA8LSBjKCJibHVlIiwiZ3JlZW4iLCJyZWQiLCJibHVlIiwiZ3JlZW4iLCJyZWQiKQogICAgY2FuYXJ5X2RmIDwtIGRhdGEuZnJhbWUoCiAgICAgICAgImlkIiA9IG5hbWVzKHBvaW50KSwKICAgICAgICAidmFsdWVzIiA9IGFzLm51bWVyaWMocG9pbnQpLAogICAgICAgICJjb2xvcnMiID0gbXlfY29sb3JzLAogICAgICAgICJlcnIiID0gYXMubnVtZXJpYyhlcnIpLAogICAgICAgICJwbHVzX2VyciIgPSBhcy5udW1lcmljKGVycikgKyBhcy5udW1lcmljKHBvaW50KSwKICAgICAgICAibWludXNfZXJyIiA9IGFzLm51bWVyaWMocG9pbnQpIC0gYXMubnVtZXJpYyhlcnIpKQogICAgcHJpbnQoY2FuYXJ5X2RmKQogICAgZnVuX2JhcnBsb3QgPC0gZ2dwbG90Mjo6Z2dwbG90KGRhdGE9Y2FuYXJ5X2RmLCBjb2xvdXI9bXlfY29sb3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlc19zdHJpbmcoeD0iaWQiLCB5PSJ2YWx1ZXMiKSkgKwogICAgICAgIGdncGxvdDI6Omdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSJibGFjayIsIGZpbGw9bXlfY29sb3JzKSArCiAgICAgICAgZ2dwbG90Mjo6dGhlbWVfYncoKSArIGdncGxvdDI6OnlsYWIoIkV4cHJlc3Npb24gVmFsdWUiKSArCiAgICAgICAgZ2dwbG90Mjo6Z2d0aXRsZShjYW5hcnkpICsKICAgICAgICBnZ3Bsb3QyOjpnZW9tX2Vycm9yYmFyKGFlcyh5bWF4PXBsdXNfZXJyLCB5bWluPW1pbnVzX2VyciksIHdpZHRoPTAuMykKICAgIHBkZl9maWxlbmFtZSA8LSBwYXN0ZTAoImltYWdlcy8iLCBudW0sICJfIiwgY2FuYXJ5LCAiX2V4cHJlc3Npb24ucGRmIikKICAgIHBkZihmaWxlPXBkZl9maWxlbmFtZSkKICAgIHByaW50KGZ1bl9iYXJwbG90KQogICAgZGV2Lm9mZigpCiAgICAjIyBOb3cgZXh0cmFjdCB0aGUgYWRqdXN0ZWQgcC12YWx1ZXMgZnJvbSB0aGUgcGFpcndpc2UgY29udHJhc3RzLi4uCiAgICAjIyB0ZXN0X2dlbmVzX2NsYnJfY29udHJhc3QgPC0gY2xfYWxsX2RlX3N2YVtbImxpbW1hIl1dW1siYWxsX3RhYmxlcyJdXVtbIkNMQnIuVHJ5cF92c19DTEJyLkE2MCJdXQogICAgYWRqcHMgPC0gYygpCiAgICB0aGVfY29udHJhc3RzIDwtIGMoIkNMQnIuVHJ5cF92c19DTDE0LlRyeXAiLCAiQ0xCci5BNjBfdnNfQ0wxNC5BNjAiLCAiQ0xCci5BOTZfdnNfQ0wxNC5BOTYiKQogICAgZm9yIChjb250ciBpbiB0aGVfY29udHJhc3RzKSB7CiAgICAgICAgYWRqcCA8LSBjbF9hbGxfZGVfc3ZhW1sibGltbWEiXV1bWyJhbGxfdGFibGVzIl1dW1tjb250cl1dW2NhbmFyeSwgImFkai5QLlZhbCJdCiAgICAgICAgYWRqcHNbW2NvbnRyXV0gPC0gYWRqcAogICAgfQogICAgYWRqcF92YWx1ZXNbW2NhbmFyeV1dIDwtIGFkanBzCn0KIyMgQSBxdWVyeSBmcm9tIFNhbnR1emEsIGdlbmVyYXRlIHAtdmFsdWVzIGJldHdlZW4gc29tZSBvZiB0aGVzZSBiYXJzLgojIyBIb3cgZG8gSSBkbyB0aGF0IHdoZW4gSSBleHRyYWN0ZWQgdGhlIHZhbHVlcyBhbmQgdmFyaWFuY2VzIGZyb20gbGltbWEgd2l0aG91dCB0aGUKIyMgYXNzb2NpYXRlZCByYXcgdmFsdWVzPwojIyBobW0uLi4KYWRqcF92YWx1ZXMKYGBgCgojIFNhbml0eSBjaGVja3MKClRoZSBmb2xsb3dpbmcgYmxvY2sgaXMgYW4gYXR0ZW1wdCB0byBlbnN1cmUgdGhhdCBteSBwcmV2aW91cyBhbmFseXNlcyBzdGlsbCBtYWtlIHNlbnNlLgpJbiBhZGRpdGlvbiwgSSBhbSBsb29raW5nIHRvIGV4dHJhY3QgdGhlIGFidW5kYW5jZXMgb2Ygc29tZSB0cmFuc2NyaXB0cyBmb2xsb3dpbmcgdm9vbSgpIGV0Yy4KCmBgYHtyIGFsbF9zYW1wbGVzX2FidW5kYW5jZSwgZmlnLnNob3c9ImhpZGUifQphYnVuZGFuY2VfZXhwdCA8LSBzbShjcmVhdGVfZXhwdCgKICAgIG1ldGFkYXRhPSJzYW1wbGVfc2hlZXRzL2NsMTRjbGJyX3NhbXBsZXNfY29tYmluZWRfcmV0YWluZWQueGxzeCIsCiAgICBnZW5lX2luZm89YWxsX2dlbmVzLAogICAgZmlsZV9jb2x1bW49ImNsYnJlbmVyZmlsZSIpKQphYnVuZGFuY2VfZXhwdCA8LSBleHB0X3N1YnNldChhYnVuZGFuY2VfZXhwdCwgc3Vic2V0PW91dGxpZXJfc3Vic2V0KQphYnVuZGFuY2Vfd3JpdHRlbiA8LSB3cml0ZV9leHB0KGFidW5kYW5jZV9leHB0LCBleGNlbD0iZXhjZWwvcmV0YWluZWRfc2FtcGxlc193cml0dGVuLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFLCB0cmFuc2Zvcm09ImxvZzIiLCBub3JtPSJxdWFudCIsIGNvbnZlcnQ9InJhdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YSIpCmFidW5kYW5jZV9leHB0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KGFidW5kYW5jZV9leHB0LCBmaWx0ZXI9VFJVRSkpCmFidW5kYW5jZXNfcGFpcndpc2UgPC0gc20oYWxsX3BhaXJ3aXNlKGFidW5kYW5jZV9leHB0LCBtb2RlbF9iYXRjaD0ic3ZhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoX3Zvb209ImxpbW1hIiwgZWRnZXJfbWV0aG9kPSJsb25nIikpCmxpbW1hX3BhaXJ3aXNlX3Jlc3VsdCA8LSBzbShsaW1tYV9wYWlyd2lzZShhYnVuZGFuY2VfZXhwdCwgbW9kZWxfYmF0Y2g9InN2YSIsIHdoaWNoX3Zvb209ImxpbW1hIikpCmRlc2VxX3BhaXJ3aXNlX3Jlc3VsdCA8LSBzbShkZXNlcV9wYWlyd2lzZShhYnVuZGFuY2VfZXhwdCwgbW9kZWxfYmF0Y2g9InN2YSIsIHdoaWNoX3Zvb209ImxpbW1hIikpCmVkZ2VyX3BhaXJ3aXNlX3Jlc3VsdCA8LSBzbShlZGdlcl9wYWlyd2lzZShhYnVuZGFuY2VfZXhwdCwgbW9kZWxfYmF0Y2g9InN2YSIsIHdoaWNoX3Zvb209ImxpbW1hIikpCmFidW5kYW5jZXNfd3JpdHRlbiA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhhYnVuZGFuY2VzX3BhaXJ3aXNlKSkKYWJ1bmRhbmNlc19zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhhYnVuZGFuY2VzX3dyaXR0ZW4pCmFsbF9hYnVuZGFuY2VzIDwtIGdldF9wYWlyd2lzZV9nZW5lX2FidW5kYW5jZXMoYWJ1bmRhbmNlc19wYWlyd2lzZSkKYWxsX2V4cHJlc3Npb24gPC0gYWxsX2FidW5kYW5jZXNbWyJleHByZXNzaW9uX3ZhbHVlcyJdXQphbGxfYW5ub3RhdGlvbnMgPC0gQmlvYmFzZTo6ZkRhdGEoYWJ1bmRhbmNlX2V4cHRbWyJleHByZXNzaW9uc2V0Il1dKQphbGxfZXhwcmVzc2lvbiA8LSBtZXJnZShhbGxfYW5ub3RhdGlvbnMsIGFsbF9leHByZXNzaW9uLCBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoYWxsX2V4cHJlc3Npb24pIDwtIGFsbF9leHByZXNzaW9uW1siUm93Lm5hbWVzIl1dCmFsbF9leHByZXNzaW9uIDwtIGFsbF9leHByZXNzaW9uWywgLTFdCiMjYWxsX2V4cHJlc3Npb24gPC0gYWxsX2V4cHJlc3Npb25bLCBjKCJ0eGNocm9tIiwgInR4c3RyYW5kIiwgImdlbmVkZXNjcmlwdGlvbiIsICJnZW5lc2l6ZSIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDTDE0LkE2MCIsICJDTDE0LkE5NiIsICJDTDE0LlRyeXAiLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xCci5BNjAiLCAiQ0xCci5BOTYiLCAiQ0xCci5UcnlwIildCmFsbF9lcnJvcnMgPC0gYWxsX2FidW5kYW5jZXNbWyJlcnJvcl92YWx1ZXMiXV0KYWxsX2Vycm9ycyA8LSBhbGxfZXJyb3JzWywgMTo2XQojI2NvbG5hbWVzKGFsbF9lcnJvcnMpIDwtIGMoIkNMMTQuQTYwX3NlIiwgIkNMMTQuQTk2X3NlIiwgIkNMMTQuVHJ5cF9zZSIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xCci5BNjBfc2UiLCAiQ0xCcl9BOTZfc2UiLCAiQ0wxNC5UcnlwX3NlIikKIyNhbGxfZXhwcmVzc2lvbiA8LSBtZXJnZShhbGxfZXhwcmVzc2lvbiwgYWxsX2Vycm9ycywgYnk9InJvdy5uYW1lcyIpCiMjcm93bmFtZXMoYWxsX2V4cHJlc3Npb24pIDwtIGFsbF9leHByZXNzaW9uW1siUm93Lm5hbWVzIl1dCiMjYWxsX2V4cHJlc3Npb24gPC0gYWxsX2V4cHJlc3Npb25bLCAtMV0KYWxsX2V4cHJlc3Npb25fd3JpdHRlbiA8LSB3cml0ZV94bHMoZGF0YT1hbGxfZXhwcmVzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldD0iZXhwcmVzc2lvbl92YWx1ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJUYWJsZSBTWFguIEV4cHJlc3Npb24gdmFsdWVzIG1ha2luZyB1cCB0aGUgY29udHJhc3QgbG9nRkNzICh3aXRoIHN0YW5kYXJkIGVycm9yIHZhbHVlcyBvYnRhaW5lZCBieSBkaXZpZGluZyB0aGUgZXhwcmVzc2lvbiBieSB0aGUgdC1zdGF0aXN0aWMuKSIpCiMjZXJyb3Jfd3JpdHRlbiA8LSB3cml0ZV94bHMoZGF0YT10bXBfZXJyb3JzLCBzdGFydF9jb2w9MTYsIHJvd25hbWVzPUZBTFNFLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICMjdGl0bGU9IkVycm9yIHZhbHVlIG9idGFpbmVkIGJ5IGRpdmlkaW5nIHRoZSBleHByZXNzaW9uIC8gdC1zdGF0aXN0aWMiLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0PSJleHByZXNzaW9uX3ZhbHVlcyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgd2I9ZXhwcmVzc2lvbl93cml0dGVuW1sid29ya2Jvb2siXV0pCm9wZW54bHN4OjpzYXZlV29ya2Jvb2sod2I9YWxsX2V4cHJlc3Npb25fd3JpdHRlbltbIndvcmtib29rIl1dLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGU9cGFzdGUwKCJleGNlbC90YWJsZVN4eF9FeHByZXNzaW9uVmFsdWVzV2l0aEVwaXMueGxzeCIpLAogICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZT1UUlVFKQpgYGAKCiMgU2lnbmlmaWNhbmNlIGJhciBwbG90cwoKYGBge3Igc2lnYmFyX3Bsb3RzfQpjbGJyX2JhcnMgPC0gc20oc2lnbmlmaWNhbnRfYmFycGxvdHMoY2xiX2NvbXBhcmVfdGltZXMpKQpjbGJyX2JhcnMkbGltbWEKY2xicl9iYXJzX2Jyb2tlbnAgPC0gc20oc2lnbmlmaWNhbnRfYmFycGxvdHMoY2xiX2NvbXBhcmVfdGltZXMsIGludmVydD1UUlVFKSkKCmNsMTRfYmFycyA8LSBzbShzaWduaWZpY2FudF9iYXJwbG90cyhjbDE0X2NvbXBhcmVfdGltZXMpKQpzdHJhaW5fYmFycyA8LSBzbShzaWduaWZpY2FudF9iYXJwbG90cyhzdHJhaW5fY29tcGFyaXNvbnMpKQpjbDE0X2JhcnNfYnJva2VucCA8LSBzaWduaWZpY2FudF9iYXJwbG90cyhjbDE0X2NvbXBhcmVfdGltZXMsIGludmVydD1UUlVFKQpzdHJhaW5fYmFyc19icm9rZW5wIDwtIHNpZ25pZmljYW50X2JhcnBsb3RzKHN0cmFpbl9jb21wYXJpc29ucywgaW52ZXJ0PVRSVUUpCgpjbGJyX2JhcnMkbGltbWEKY2wxNF9iYXJzJGxpbW1hCnN0cmFpbl9iYXJzJGxpbW1hCgpwZGYoZmlsZT0iaW1hZ2VzL2NsMTRfYmFycGxvdF9pbnZlcnRlZC5wZGYiKQpjbDE0X2JhcnNfYnJva2VucCRsaW1tYQpkZXYub2ZmKCkKcGRmKGZpbGU9ImltYWdlcy9jbGJyX2JhcnBsb3RfaW52ZXJ0ZWQucGRmIikKY2xicl9iYXJzX2Jyb2tlbnAkbGltbWEKZGV2Lm9mZigpCmBgYAoKIyBSZW1vdmUgbXVsdGktZ2VuZSBmYW1pbGllcyBmb3IgZ2VuZSBvbnRvbG9neQoKUmVkbyBHTyBhbmFseXNlcyBleGNsdWRpbmcgbXVsdGlnZW5lIGZhbWlseSBtZW1iZXJzLiBJIGJlbGlldmUgd2UgZGlzY3Vzc2VkIHRoYXQKdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMgd2FzIHRvOgoKMSkgZ2VuZXJhdGUgREUgdGFibGVzIHdpdGggbXVsdGlnZW5lIGZhbWlseSBtZW1iZXJzIGZpbHRlcmVkIG91dAoyKSBSZWRvIEdPL0tFR0cgb24gcmVtYWluZGVyLgoKYGBge3IgcmVtb3ZlX211bHRpZ2VuZXN9CiMjIGNsYnJfdGltZXNfZmlsdGVyZWQgPC0gc2VtYW50aWNfY29weW51bWJlcl9maWx0ZXIoY2xicl90aW1lc19zaWckbGltbWEsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYW50aWNfY29sdW1uPSJnZW5lZGVzY3JpcHRpb24iKQojIyBjbDE0X3RpbWVzX2ZpbHRlcmVkIDwtIHNlbWFudGljX2NvcHludW1iZXJfZmlsdGVyKGNsMTRfdGltZXNfc2lnJGxpbW1hLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljX2NvbHVtbj0iZ2VuZWRlc2NyaXB0aW9uIikKIyMgc3RyYWluc19maWx0ZXJlZCA8LSBzZW1hbnRpY19jb3B5bnVtYmVyX2ZpbHRlcihzdHJhaW5zX3NpZyRsaW1tYSwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hbnRpY19jb2x1bW49ImdlbmVkZXNjcmlwdGlvbiIpCmNsYnJfdGltZXNfZmlsdGVyZWQgPC0gc20oc2VtYW50aWNfY29weW51bWJlcl9maWx0ZXIoY2xiX2NvbXBhcmVfdGltZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYW50aWNfY29sdW1uPSJnZW5lZGVzY3JpcHRpb24iKSkKY2wxNF90aW1lc19maWx0ZXJlZCA8LSBzbShzZW1hbnRpY19jb3B5bnVtYmVyX2ZpbHRlcihjbDE0X2NvbXBhcmVfdGltZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYW50aWNfY29sdW1uPSJnZW5lZGVzY3JpcHRpb24iKSkKc3RyYWluc19maWx0ZXJlZCA8LSBzbShzZW1hbnRpY19jb3B5bnVtYmVyX2ZpbHRlcihzdHJhaW5fY29tcGFyaXNvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYW50aWNfY29sdW1uPSJnZW5lZGVzY3JpcHRpb24iKSkKCmNsYnJfdGltZXNfc2lnZmlsdCA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGNsYnJfdGltZXNfZmlsdGVyZWQsIGFjY29yZGluZ190bz0ibGltbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1wYXN0ZTAoImV4Y2VsL2NsYl90aW1lc19maWx0ZXJlZF9zaWctdiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIsICIueGxzeCIpKSkKY2wxNF90aW1lc19zaWdmaWx0IDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoY2wxNF90aW1lc19maWx0ZXJlZCwgYWNjb3JkaW5nX3RvPSJsaW1tYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvY2wxNF90aW1lc19maWx0ZXJlZF9zaWctdiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIsICIueGxzeCIpKSkKc3RyYWluc19zaWdmaWx0IDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoc3RyYWluc19maWx0ZXJlZCwgYWNjb3JkaW5nX3RvPSJsaW1tYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvc3RyYWluX2NvbXBhcmlzb25zX2ZpbHRlcmVkX3NpZy12IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlciwgIi54bHN4IikpKQoKIyMgTmFqaWIgd2FudHMgdG8ga25vdyBob3cgbWFueSBlbnRyaWVzIGZvciBlYWNoIGZhbWlseSB3ZXJlIHJlbW92ZWQgYnkgdGhlIHNlbWFudGljIGZpbHRlcmluZwojIyBmcm9tIHRoZSBzaWduaWZpY2FuY2UgdGFibGVzLgpzZW1hbnRpY19uYW1lcyA8LSBjKCJtdWNpbiIsInNpYWxpZGFzZSIsIlJIUyIsIk1BU1AiLCJER0YiLCJHUDYzIikKZmluZF9udW1iZXJzIDwtIGZ1bmN0aW9uKGRhdHVtLCBkaXJlY3Rpb249InVwcyIsIHRhYmxlX25hbWU9IkNMQnIuQTYwX3ZzX0NMQnIuVHJ5cCIpIHsKICAgIGZvciAobmFtZSBpbiBzZW1hbnRpY19uYW1lcykgewogICAgICAgIHRhYmxlIDwtIGRhdHVtW1sibGltbWEiXV1bW2RpcmVjdGlvbl1dW1t0YWJsZV9uYW1lXV0KICAgICAgICBzZWFyY2ggPC0gZ3JlcGwocGF0dGVybj1uYW1lLCB4PXRhYmxlW1siZ2VuZWRlc2NyaXB0aW9uIl1dKQogICAgICAgIG51bWJlciA8LSBzdW0oc2VhcmNoKQogICAgICAgIG1lc3NhZ2UocGFzdGUwKCJUaGUgIiwgZGlyZWN0aW9uLCAiIHRhYmxlICIsIHRhYmxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIiB3YXMgcHJ1bmVkIGZvciAiLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICIgYnkgIiwgbnVtYmVyLCAiIGdlbmVzLiIpKQogICAgfQp9CmZpbmRfbnVtYmVycyhjbGJyX3RpbWVzX3NpZykKZmluZF9udW1iZXJzKGNsYnJfdGltZXNfc2lnLCBkaXJlY3Rpb249ImRvd25zIikKZmluZF9udW1iZXJzKGNsYnJfdGltZXNfc2lnLCB0YWJsZV9uYW1lPSJDTEJyLkE5Nl92c19DTEJyLkE2MCIpCmZpbmRfbnVtYmVycyhjbGJyX3RpbWVzX3NpZywgZGlyZWN0aW9uPSJkb3ducyIsIHRhYmxlX25hbWU9IkNMQnIuQTk2X3ZzX0NMQnIuQTYwIikKZmluZF9udW1iZXJzKGNsYnJfdGltZXNfc2lnLCB0YWJsZV9uYW1lPSJDTEJyLlRyeXBfdnNfQ0xCci5BOTYiKQpmaW5kX251bWJlcnMoY2xicl90aW1lc19zaWcsIGRpcmVjdGlvbj0iZG93bnMiLCB0YWJsZV9uYW1lPSJDTEJyLlRyeXBfdnNfQ0xCci5BOTYiKQoKZmluZF9udW1iZXJzKGNsMTRfdGltZXNfc2lnLCB0YWJsZV9uYW1lPSJDTDE0LkE2MF92c19DTDE0LlRyeXAiKQpmaW5kX251bWJlcnMoY2wxNF90aW1lc19zaWcsIGRpcmVjdGlvbj0iZG93bnMiLCB0YWJsZV9uYW1lPSJDTDE0LkE2MF92c19DTDE0LlRyeXAiKQpmaW5kX251bWJlcnMoY2wxNF90aW1lc19zaWcsIHRhYmxlX25hbWU9IkNMMTQuQTk2X3ZzX0NMMTQuQTYwIikKZmluZF9udW1iZXJzKGNsMTRfdGltZXNfc2lnLCBkaXJlY3Rpb249ImRvd25zIiwgdGFibGVfbmFtZT0iQ0wxNC5BOTZfdnNfQ0wxNC5BNjAiKQpmaW5kX251bWJlcnMoY2wxNF90aW1lc19zaWcsIHRhYmxlX25hbWU9IkNMMTQuVHJ5cF92c19DTDE0LkE5NiIpCmZpbmRfbnVtYmVycyhjbDE0X3RpbWVzX3NpZywgZGlyZWN0aW9uPSJkb3ducyIsIHRhYmxlX25hbWU9IkNMMTQuVHJ5cF92c19DTDE0LkE5NiIpCmBgYAoKIyMgTWFueSBtYW55IE1BIHBsb3RzIQoKYGBge3IgbWFueV9tYXN9CmZpbGVuYW1lcyA8LSBjKCJtdWNpbi50eHQiLCAibWFzcC50eHQiLCAiZ3A2My50eHQiLCAidHJhbnNzaWFsaWRhc2UudHh0IiwKICAgICAgICAgICAgICAgInJldHJvdHJhbnNwb3Nvbi50eHQiLCAiZGlzcGVyc2VkLnR4dCIpCmZhbWlseV9jb2xvcnMgPC0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCAicHVycGxlIiwgImJyb3duIiwgInllbGxvdyIpCm5hbWVzKGZhbWlseV9jb2xvcnMpIDwtIGMoIm11Y2luIiwgIk1BU1AiLCAiR1A2MyIsICJ0cmFuc19zaWFsaWRhc2UiLCAicmhzIiwgIkRHRiIpCmZvciAobnVtIGluIDE6bGVuZ3RoKG5hbWVzKGNsYl90aW1lc19rZWVwZXJzKSkpIHsKICAgIGNvbnRyYXN0X25hbWVzIDwtIG5hbWVzKGNsYl90aW1lc19rZWVwZXJzKQogICAgY29udHJhc3QgPC0gY29udHJhc3RfbmFtZXNbW251bV1dCiAgICBmb3IgKGZpbGVfbnVtIGluIDE6bGVuZ3RoKGZpbGVuYW1lcykpIHsKICAgICAgICBjb2xvciA8LSBmYW1pbHlfY29sb3JzW1tmaWxlX251bV1dCiAgICAgICAgZmFtaWxpZXMgPC0gbmFtZXMoZmFtaWx5X2NvbG9ycykKICAgICAgICBmYW1pbHkgPC0gZmFtaWxpZXNbW2ZpbGVfbnVtXV0KICAgICAgICBmaWxlIDwtIGZpbGVuYW1lc1tbZmlsZV9udW1dXQogICAgICAgIGZpbGVuYW1lIDwtIHBhc3RlMCgicmVmZXJlbmNlL2ZhbWlsaWVzLyIsIGZpbGUpCiAgICAgICAgb3V0cHV0IDwtIHBhc3RlMCgiaW1hZ2VzLyIsIGNvbnRyYXN0LCAiXyIsIGZhbWlseSwgIl9tYS12IiwgdmVyLCAiLnBuZyIpCiAgICAgICAgc3ZnX291dHB1dCA8LSBwYXN0ZTAoImltYWdlcy8iLCBjb250cmFzdCwgIl8iLCBmYW1pbHksICJfbWEtdiIsIHZlciwgIi5zdmciKQogICAgICAgIGZhbWlseSA8LSByZWFkLmNzdihmaWxlbmFtZSwgaGVhZGVyPUZBTFNFLCBzZXA9IjoiKQogICAgICAgIGZhbWlseSA8LSBmYW1pbHlbWzFdXQogICAgICAgIGxpbW1hX3Bsb3QgPC0gZXh0cmFjdF9kZV9tYShjbGJfY29tcGFyZV90aW1lcywgdHlwZT0ibGltbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZT1jb250cmFzdCwgZmFtaWx5PWZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWdfY29sb3I9ImxpZ2h0Z3JleSIsIHNpZ19jb2xvcj0iIzQ0NDQ0NCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseV9jb2xvcj1jb2xvciwgbGFiZWxfbnVtYmVycz1GQUxTRSkKICAgICAgICB0aGVfcGxvdCA8LSBsaW1tYV9wbG90JHBsb3QgKyB5bGltKC0xMCwgMTApICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKICAgICAgICBwbmcoZmlsZT1vdXRwdXQpCiAgICAgICAgcGxvdCh0aGVfcGxvdCkKICAgICAgICBkZXYub2ZmKCkKICAgICAgICBzdmcoZmlsZT1zdmdfb3V0cHV0KQogICAgICAgIHBsb3QodGhlX3Bsb3QpCiAgICAgICAgZGV2Lm9mZigpCiAgICB9Cn0KZm9yIChudW0gaW4gMTpsZW5ndGgobmFtZXMoY2wxNF90aW1lc19rZWVwZXJzKSkpIHsKICAgIGNvbnRyYXN0X25hbWVzIDwtIG5hbWVzKGNsMTRfdGltZXNfa2VlcGVycykKICAgIGNvbnRyYXN0IDwtIGNvbnRyYXN0X25hbWVzW1tudW1dXQogICAgZm9yIChmaWxlX251bSBpbiAxOmxlbmd0aChmaWxlbmFtZXMpKSB7CiAgICAgICAgY29sb3IgPC0gZmFtaWx5X2NvbG9yc1tbZmlsZV9udW1dXQogICAgICAgIGZhbWlsaWVzIDwtIG5hbWVzKGZhbWlseV9jb2xvcnMpCiAgICAgICAgZmFtaWx5IDwtIGZhbWlsaWVzW1tmaWxlX251bV1dCiAgICAgICAgZmlsZSA8LSBmaWxlbmFtZXNbW2ZpbGVfbnVtXV0KICAgICAgICBmaWxlbmFtZSA8LSBwYXN0ZTAoInJlZmVyZW5jZS9mYW1pbGllcy8iLCBmaWxlKQogICAgICAgIG91dHB1dCA8LSBwYXN0ZTAoImltYWdlcy8iLCBjb250cmFzdCwgIl8iLCBmYW1pbHksICJfbWEtdiIsIHZlciwgIi5wbmciKQogICAgICAgIHN2Z19vdXRwdXQgPC0gcGFzdGUwKCJpbWFnZXMvIiwgY29udHJhc3QsICJfIiwgZmFtaWx5LCAiX21hLXYiLCB2ZXIsICIuc3ZnIikKICAgICAgICBmYW1pbHkgPC0gcmVhZC5jc3YoZmlsZW5hbWUsIGhlYWRlcj1GQUxTRSwgc2VwPSI6IikKICAgICAgICBmYW1pbHkgPC0gZmFtaWx5W1sxXV0KICAgICAgICBsaW1tYV9wbG90IDwtIGV4dHJhY3RfZGVfbWEoY2wxNF9jb21wYXJlX3RpbWVzLCB0eXBlPSJsaW1tYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlPWNvbnRyYXN0LCBmYW1pbHk9ZmFtaWx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZ19jb2xvcj0ibGlnaHRncmV5Iiwgc2lnX2NvbG9yPSIjNDQ0NDQ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5X2NvbG9yPWNvbG9yLCBsYWJlbF9udW1iZXJzPUZBTFNFKQogICAgICAgIHRoZV9wbG90IDwtIGxpbW1hX3Bsb3QkcGxvdCArIHlsaW0oLTEwLCAxMCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQogICAgICAgIHBuZyhmaWxlPW91dHB1dCkKICAgICAgICBwbG90KHRoZV9wbG90KQogICAgICAgIGRldi5vZmYoKQogICAgICAgIHN2ZyhmaWxlPXN2Z19vdXRwdXQpCiAgICAgICAgcGxvdCh0aGVfcGxvdCkKICAgICAgICBkZXYub2ZmKCkKICAgIH0KfQpgYGAKCltpbmRleC5odG1sXShpbmRleC5odG1sKQpbMDFfYW5ub3RhdGlvbi5odG1sXSgwMV9hbm5vdGF0aW9uLmh0bWwpClswMl9zYW1wbGVfZXN0aW1hdGlvbi5odG1sXSgwMl9zYW1wbGVfZXN0aW1hdGlvbi5odG1sKQoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAo=