# HG changeset patch # User iuc # Date 1656488205 0 # Node ID f4d0bd4b4d6d62901804a7e07d19dff52c7f5247 planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/aldex2 commit b99f09cf03f075a6881d192b0f1233233289fa60 diff -r 000000000000 -r f4d0bd4b4d6d aldex2.R --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aldex2.R Wed Jun 29 07:36:45 2022 +0000 @@ -0,0 +1,150 @@ +#!/usr/bin/env Rscript + +suppressPackageStartupMessages(library("ALDEx2")) +suppressPackageStartupMessages(library("data.table")) +suppressPackageStartupMessages(library("qgraph")) +suppressPackageStartupMessages(library("optparse")) + +option_list <- list( + make_option(c("--aldex_test"), action = "store", dest = "aldex_test", default = NULL, help = "Indicates which analysis to perform"), + make_option(c("--analysis_type"), action = "store", dest = "analysis_type", help = "Indicates which analysis to perform"), + make_option(c("--cutoff_effect"), action = "store", dest = "cutoff_effect", type = "integer", default = NULL, help = "Effect size cutoff for plotting"), + make_option(c("--cutoff_pval"), action = "store", dest = "cutoff_pval", type = "double", default = NULL, help = "Benjamini-Hochberg fdr cutoff"), + make_option(c("--denom"), action = "store", dest = "denom", help = "Indicates which features to retain as the denominator for the Geometric Mean calculation"), + make_option(c("--effect"), action = "store", dest = "effect", default = "false", help = "Calculate abundances and effect sizes"), + make_option(c("--feature_name"), action = "store", dest = "feature_name", default = NULL, help = "Name of the feature from the input data to be plotted"), + make_option(c("--group_names"), action = "store", dest = "group_names", help = "Group names vector"), + make_option(c("--group_nums"), action = "store", dest = "group_nums", default = NULL, help = "Group number for continuous numeric vector"), + make_option(c("--hist_plot"), action = "store", dest = "hist_plot", default = "false", help = "Indicates whether to plot a histogram of p-values for the first Dirichlet Monte Carlo instance"), + make_option(c("--include_sample_summary"), action = "store", dest = "include_sample_summary", default = "false", help = "Include median clr values for each sample"), + make_option(c("--iterate"), action = "store", dest = "iterate", default = "false", help = "Indicates whether to iteratively perform a test"), + make_option(c("--num_cols"), action = "store", dest = "num_cols", help = "Number of columns in group vector"), + make_option(c("--num_cols_in_groups"), action = "store", dest = "num_cols_in_groups", default = NULL, help = "Number of columns in each group dewfining the continuous numeric vector"), + make_option(c("--num_mc_samples"), action = "store", dest = "num_mc_samples", type = "integer", help = "Number of Monte Carlo samples"), + make_option(c("--output"), action = "store", dest = "output", help = "output file"), + make_option(c("--paired_test"), action = "store", dest = "paired_test", default = "false", help = "Indicates whether to do paired-sample tests"), + make_option(c("--plot_test"), action = "store", dest = "plot_test", default = NULL, help = "The method of calculating significance"), + make_option(c("--plot_type"), action = "store", dest = "plot_type", default = NULL, help = "The type of plot to be produced"), + make_option(c("--reads"), action = "store", dest = "reads", help = "Input reads table"), + make_option(c("--xlab"), action = "store", dest = "xlab", default = NULL, help = "x lable for the plot"), + make_option(c("--ylab"), action = "store", dest = "ylab", default = NULL, help = "y lable for the plot") +) + +parser <- OptionParser(usage = "%prog [options] file", option_list = option_list) +args <- parse_args(parser, positional_arguments = TRUE) +opt <- args$options + +get_boolean_value <- function(val) { + if (val == "true") { + return(TRUE) + } else { + return(FALSE) + } +} + +# Read the input reads file into a data frame. +reads_df <- read.table(file = opt$reads, header = TRUE, sep = "\t", row.names = 1, dec = ".", as.is = FALSE) + +# Split the group_names and num_cols into lists of strings. +group_names_str <- as.character(opt$group_names) +group_names_list <- strsplit(group_names_str, ",")[[1]] +num_cols_str <- as.character(opt$num_cols) +num_cols_list <- strsplit(num_cols_str, ",")[[1]] +# Construct conditions vector. +conditions_vector <- c() +for (i in seq_along(num_cols_list)) { + num_cols <- as.integer(num_cols_list[i]) + group_name <- group_names_list[i] + for (j in 1:num_cols) { + conditions_vector <- cbind(conditions_vector, group_name) + } +} +# The conditions_vector is now a matrix, +# so coerce it back to a vector. +conditions_vector <- as.vector(conditions_vector) + +# Convert boolean values to boolean. +effect <- get_boolean_value(opt$effect) +include_sample_summary <- get_boolean_value(opt$include_sample_summary) +iterate <- get_boolean_value(opt$iterate) + +if (opt$analysis_type == "aldex") { + aldex_obj <- aldex(reads = reads_df, + conditions_vector, + mc.samples = opt$num_mc_samples, + test = opt$aldex_test, + effect = effect, + include.sample.summary = include_sample_summary, + denom = opt$denom, + iterate = iterate) +} else { + # Generate Monte Carlo samples of the Dirichlet distribution for each sample. Convert each + # instance using a log-ratio transform. This is the input for all further analyses. + aldex_clr_obj <- aldex.clr(reads_df, conditions_vector, mc.samples = opt$num_mc_samples, denom = opt$denom) + + if (opt$analysis_type == "aldex_corr") { + if (!is.null(opt$cont_var)) { + # Read the input cont_var vector. + cont_var <- as.numeric(read.table(file = opt$cont_var, header = FALSE, sep = "\t")) + } + + # Split the group_names and num_cols into lists of strings. + group_nums_str <- as.character(opt$group_nums) + group_nums_list <- strsplit(group_nums_str, ",")[[1]] + num_cols_in_groups_str <- as.character(opt$num_cols_in_groups) + num_cols_in_groups_list <- strsplit(num_cols_in_groups_str, ",")[[1]] + # Construct continuous numeric vector. + cont_var_vector <- c() + for (i in seq_along(num_cols_in_groups_list)) { + num_cols_in_group <- as.integer(num_cols_in_groups_list[i]) + group_num <- group_nums_list[i] + for (j in 1:num_cols_in_group) { + cont_var_vector <- cbind(cont_var_vector, group_num) + } + } + # The cont_var_vector is now a matrix, + # so coerce it back to a vector. + cont_var_vector <- as.numeric(as.vector(cont_var_vector)) + + aldex_obj <- aldex.corr(aldex_clr_obj, cont.var = cont_var_vector) + } else if (opt$analysis_type == "aldex_effect") { + aldex_obj <- aldex.effect(aldex_clr_obj, include_sample_summary) + } else if (opt$analysis_type == "aldex_expected_distance") { + dist <- aldex.expectedDistance(aldex_clr_obj) + png(filename = opt$output) + qgraph(dist, layout = "spring", vsize = 1) + dev.off() + } else if (opt$analysis_type == "aldex_kw") { + aldex_obj <- aldex.kw(aldex_clr_obj) + } else if (opt$analysis_type == "aldex_plot") { + aldex_obj <- aldex(reads = reads_df, + conditions_vector, + mc.samples = opt$num_mc_samples, + test = opt$aldex_test, + effect = effect, + include.sample.summary = include_sample_summary, + denom = opt$denom, + iterate = iterate) + png(filename = opt$output) + aldex.plot(x = aldex_obj, + type = opt$plot_type, + test = opt$plot_test, + cutoff.pval = opt$cutoff_pval, + cutoff.effect = opt$cutoff_effect, + xlab = opt$xlab, + ylab = opt$ylab) + dev.off() + } else if (opt$analysis_type == "aldex_plot_feature") { + png(filename = opt$output) + aldex.plotFeature(aldex_clr_obj, opt$feature_name) + dev.off() + } else if (opt$analysis_type == "aldex_ttest") { + paired_test <- get_boolean_value(opt$paired_test) + hist_plot <- get_boolean_value(opt$hist_plot) + aldex_obj <- aldex.ttest(aldex_clr_obj, paired.test = paired_test, hist.plot = hist_plot) + } +} +if ((opt$analysis_type != "aldex_expected_distance") && (opt$analysis_type != "aldex_plot") && (opt$analysis_type != "aldex_plot_feature")) { + # Output the ALDEx object. + write.table(aldex_obj, file = opt$output, append = FALSE, sep = "\t", dec = ".", row.names = FALSE, col.names = TRUE) +} diff -r 000000000000 -r f4d0bd4b4d6d aldex2.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aldex2.xml Wed Jun 29 07:36:45 2022 +0000 @@ -0,0 +1,471 @@ + + differential abundance analysis + + macros.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + analysis_type_cond['analysis_type'] == 'aldex' + + + analysis_type_cond['analysis_type'] == 'aldex_corr' + + + analysis_type_cond['analysis_type'] == 'aldex_effect' + + + analysis_type_cond['analysis_type'] == 'aldex_expected_distance' + + + analysis_type_cond['analysis_type'] == 'aldex_kw' + + + analysis_type_cond['analysis_type'] == 'aldex_plot' + + + analysis_type_cond['analysis_type'] == 'aldex_plot_feature' + + + analysis_type_cond['analysis_type'] == 'aldex_ttest' + + + analysis_type_cond['analysis_type'] == 'aldex_ttest' and analysis_type_cond['hist_plot'] == 'true' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +**What it does** + +Performs a differential abundance analysis for the comparison of two or more conditions (e.g., single-organism +and meta-RNA-seq high-throughput sequencing assays, or of selected and unselected values from in-vitro sequence +selections). This tool generates Monte Carlo samples of the Dirichlet distribution for each sample, converts +each instance using a log-ratio transform, then returns test results for two sample (Welch’s t, Wilcoxon) or +multi-sample (glm, Kruskal-Wallace) tests. The tool also estimates effect size for two sample analyses. + +**Options** + + * **Reads table file** - a tabular file with unique names for all rows and columns. Rows should contain genes and columns should contain sequencing read counts (i.e., sample vectors). Rows with 0 reads in each sample are deleted prior to analysis. + * **Define the comparison groups describing the reads data structure** - Specify a group label and the number of sequencing read count columns associated with it. The total number of columns must be equal to the number of numeric columns in the selected Reads table file. + * **Number of Monte Carlo samples to use** - the number of Monte Carlo samples to use when estimating the underlying distributions. Since we are estimating central tendencies, 128 is usually sufficient. + * **Select features to retain as the denominator for the Geometric Mean calculation** - indicates which features to retain as the denominator for the Geometric Mean calculation. + * **Select the analysis to be performed** + + * **Compute an ALDEx2 object (aldex)** - performs log-ratio transformation and statistical testing. Specifically, this function: (a) generates Monte Carlo samples of the Dirichlet distribution for each sample, (b) converts each instance using a log-ratio transform, then (c) retcalculates the expected values for the correlation between each feature and a contin- uous variable, using data returned returned by aldex.clr and a vector of the continuous variable. Returns results of Pearson, Spearman and Kendall tests.urns test results for two sample (Welch’s t, Wilcoxon) or multi-sample (glm, Kruskal-Wallace) tests. This function also estimates effect size for two sample analyses. + + * **Select the tests to be performed** - select the tests to be performed when crearing the ALDEx2 object. + * **Calculate abundances and effect sizes** - applies only if the selected test is Welch’s t and Wilcox tests, or if tests are performed iteratively. + * **Include median clr values for each sample** - specify whether to include median clr values for each sample (applies only if abundances and effect sizes are calculated). + * **Perform tests iteratively** - Specify whether to iteratively perform a test. For example, this will use the results from an initial Welch’s t and Wilcox test routine to seed the reference (i.e., denominator of Geometric Mean calculation) for a second Welch’s t and Wilcox test routine. + + * **Calculate correlation with a continuous variable (aldex.corr)** - calculates the expected values for the correlation between each feature and a continuous variable using data returned by aldex.clr and a vector of the continuous variable. Returns results of Pearson, Spearman and Kendall tests. + * **Calculate effect sizes and differences between conditions (aldex.effect)** - calculates (1) the median clr abundances per sample, per condition, (2) the median differences in abundance between 2 conditions and (3) the median effect size and proportion of effect that overlaps 0. + * **Calculate the expected values of distances between samples (aldex.expectedDistance)** - calculates the expected value of distances between samples using the median value of distances derived from N Monte-Carlo replicates. + * **Calculate the Kruskal-Wallis test and glm ANOVA statistics (aldex.kw)** - calculates the expected values of the Kruskal-Wallis test and a glm ANOVA. + * **Plot an ALDEx2 object (aldex.plot)** - generate an MW-plot or an MA-plot of the given ALDEx2 object. + * **Show dispersion of the expected values returned by aldex.effect (aldex.plotFeature)** - generates density plots showing the dispersion of the expected values given in the output from aldex.effect. The expected values are shown in the plots. This is a diagnostic visualization to help determine if the expected values are trustworthy. + * **Calculate Welch’s t-test and Wilcoxon test statistics (aldex.ttest)** - calculate the expected values of the Wilcoxon Rank Sum test and Welch's t-test on the data returned by aldex.clr + + * **Calculate paired tests** - specify whether to calculate effect size for paired samples (applies only if abundances and effect sizes are calculated and the selected test is Welch’s t and Wilcox tests). + * **Plot a histogram of p-values for the first Dirichlet Monte Carlo instance** - specify whether to plot a histogram of p-values for the first Dirichlet Monte Carlo instance. + + + + diff -r 000000000000 -r f4d0bd4b4d6d macros.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros.xml Wed Jun 29 07:36:45 2022 +0000 @@ -0,0 +1,52 @@ + + 1.26.0 + 0 + 21.01 + + + aldex2 + + + + + bioconductor-aldex2 + r-data.table + r-optparse + r-qgraph + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.1371/journal.pone.0067019 + 10.1186/2049-2618-2-15 + 10.1080/10618600.2015.1131161 + + + + diff -r 000000000000 -r f4d0bd4b4d6d test-data/reads.tabular --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/reads.tabular Wed Jun 29 07:36:45 2022 +0000 @@ -0,0 +1,201 @@ + 1_ANS 1_BNS 1_CNS 1_DNS 2_ANS 2_CNS 2_DNS 1_AS 1_BS 1_CS 1_DS 2_AS 2_CS 2_DS +A:D:A:D 347 271 396 317 391 260 620 8 1 1 2 0 1 3 +A:D:A:E 436 361 461 241 410 387 788 83 6 8 12 0 3 2 +A:E:A:D 476 288 378 215 412 430 591 997 3747 662 421 37 75 6353 +A:E:A:E 513 307 424 381 499 447 709 10547 12033 5394 15998 293 1816 33 +A:D:C:D 178 165 195 185 124 158 409 0 0 0 0 0 0 1 +A:D:C:E 222 138 152 74 202 179 426 0 0 1 0 0 0 0 +A:E:C:D 181 114 142 254 193 149 670 15 18 67 36 35 13 140 +A:E:C:E 238 177 204 163 242 255 561 25 48 145 46 81 30 7 +A:D:D:D 192 140 236 207 181 182 720 0 1 0 1 0 0 1 +A:D:D:E 185 118 217 189 208 179 276 0 0 0 1 1 1 0 +A:E:D:D 206 108 279 173 213 223 446 12 30 18 18 25 9 113 +A:E:D:E 224 154 190 168 187 204 375 22 35 60 21 35 20 4 +A:D:E:D 200 101 179 107 177 155 553 0 0 0 0 0 0 1 +A:D:E:E 242 192 204 107 173 147 361 0 0 1 0 1 1 1 +A:E:E:D 266 144 258 133 287 227 630 24 28 42 4 35 26 9 +A:E:E:E 290 140 168 219 210 213 293 44 44 35 56 48 51 3 +A:D:F:D 124 91 194 117 187 143 289 0 0 0 0 0 1 0 +A:D:F:E 185 118 253 126 169 160 295 0 3 0 0 0 1 0 +A:E:F:D 234 128 200 120 172 173 260 1 4 0 0 1 1 2 +A:E:F:E 206 168 255 88 237 182 291 0 238 2 1 0 2 1 +A:D:G:D 526 318 434 359 533 431 1347 110 9 33 15 12 8 38 +A:D:G:E 425 499 450 319 673 506 1368 132 24 37 35 16 24 10 +A:E:G:D 832 465 483 377 663 574 1495 31648 37532 53271 22702 33241 24257 98629 +A:E:G:E 718 577 657 910 677 691 1745 56735 77600 72115 68594 58439 60094 4265 +A:D:H:D 144 95 115 90 161 114 486 0 1 0 0 0 0 1 +A:D:H:E 179 130 171 93 163 186 436 0 0 0 0 0 0 0 +A:E:H:D 224 214 167 146 239 250 426 0 0 0 1 1 3 0 +A:E:H:E 251 165 186 198 190 185 467 0 2 87 0 0 3 0 +A:D:I:D 172 90 113 102 187 170 733 0 0 0 1 0 0 2 +A:D:I:E 243 130 208 165 178 208 309 1 0 0 0 1 0 1 +A:E:I:D 295 161 255 176 226 154 347 0 0 0 0 4 15 2 +A:E:I:E 238 162 216 284 281 215 487 16 0 3 108 6 1 2 +A:D:K:D 117 109 142 161 184 110 140 0 0 0 0 0 0 1 +A:D:K:E 159 116 144 76 103 99 546 1 0 0 0 1 0 1 +A:E:K:D 152 146 142 82 175 151 267 1 1 0 0 0 2 1 +A:E:K:E 199 115 180 150 142 151 377 116 0 21 5 0 0 2 +A:D:L:D 491 334 460 393 579 475 1428 0 2 0 0 2 1 0 +A:D:L:E 495 352 431 401 544 506 1433 1 0 0 1 1 0 0 +A:E:L:D 668 467 607 528 635 656 1152 10 363 1 0 12 6 3 +A:E:L:E 677 464 520 656 738 622 1500 3 77 93 3 5 12 6 +A:D:M:D 73 125 117 55 91 97 167 1 0 0 0 1 0 0 +A:D:M:E 88 68 111 51 101 99 128 1 0 0 18 0 0 0 +A:E:M:D 78 94 93 39 143 114 213 9 0 46 2 1 0 0 +A:E:M:E 103 75 106 65 104 114 116 9 8 10 6719 0 0 2 +A:D:N:D 87 83 115 46 83 84 174 0 0 0 0 0 0 0 +A:D:N:E 124 83 76 74 129 121 359 0 0 1 0 0 0 0 +A:E:N:D 112 118 187 140 150 129 227 0 0 0 1 0 1 1 +A:E:N:E 101 85 108 65 157 132 254 0 1 0 1 1 0 2 +A:D:P:D 324 261 200 239 295 293 982 0 0 0 0 12 1 1 +A:D:P:E 291 192 290 176 355 300 701 269 0 0 0 2 0 0 +A:E:P:D 415 267 343 211 376 341 461 0 4 2 14 2 0 2 +A:E:P:E 393 257 471 215 352 352 935 142 2 2 3 0 0 2 +A:D:Q:D 180 160 186 121 208 174 259 0 1 0 0 0 1 0 +A:D:Q:E 151 122 274 131 177 182 437 0 0 0 0 0 0 0 +A:E:Q:D 217 223 252 205 193 210 383 7 0 6 1 1 1 200 +A:E:Q:E 210 157 267 143 191 194 400 0 1 1 0 0 2 1 +A:D:R:D 587 404 532 511 606 539 1088 0 1 0 1 1 0 2 +A:D:R:E 613 444 640 501 488 656 2654 0 0 2 0 1 81 0 +A:E:R:D 688 502 588 444 581 605 1316 82 16 294 14 31 27 16 +A:E:R:E 743 501 559 510 636 737 1916 57 44 50 52 47 83 6 +A:D:S:D 425 303 405 369 507 420 953 1 1 0 0 0 0 1 +A:D:S:E 441 411 542 344 551 478 1498 1 0 3 0 0 0 1 +A:E:S:D 601 331 517 327 579 493 1333 16 13 124 157 25 16 122 +A:E:S:E 570 427 671 399 515 585 894 28 53 132 40 43 29 9 +A:D:T:D 205 164 168 170 175 204 495 0 0 0 0 0 0 0 +A:D:T:E 190 138 191 133 175 147 266 0 0 0 0 0 0 0 +A:E:T:D 221 175 233 174 212 198 396 2 4 1 1 1 7 8 +A:E:T:E 260 143 368 243 357 280 740 15 13 3 33 0 3 7 +A:D:V:D 427 265 435 447 415 366 969 2 1 0 0 0 2 1 +A:D:V:E 378 320 366 325 526 360 1143 0 0 1 2 2 0 1 +A:E:V:D 501 333 482 493 485 434 1205 36 42 94 18 49 15 65 +A:E:V:E 573 343 552 426 537 484 914 63 51 93 72 61 54 2835 +A:D:W:D 108 85 111 113 90 79 186 0 0 0 0 0 0 1 +A:D:W:E 88 85 87 51 110 92 260 3 0 0 0 0 0 0 +A:E:W:D 129 122 101 140 142 133 332 49 66 139 9 73 50 15 +A:E:W:E 149 144 111 99 115 191 134 254 65 83 52 106 119 0 +A:D:Y:D 136 91 159 93 93 102 385 0 0 0 0 0 0 1 +A:D:Y:E 113 79 142 83 146 123 671 0 0 0 0 0 0 2 +A:E:Y:D 165 108 171 99 153 124 533 0 0 0 0 5 0 1 +A:E:Y:E 222 148 246 139 164 137 449 0 2 2 2 3 2 0 +C:D:A:D 217 117 164 91 189 126 170 1 1 0 0 2 0 1 +C:D:A:E 164 138 169 80 165 184 293 0 0 8 0 0 0 1 +C:E:A:D 212 146 210 86 200 187 307 0 1 0 0 0 0 11 +C:E:A:E 180 124 152 89 252 191 397 2 5 5 11 4 1 0 +C:D:C:D 75 67 76 43 63 88 114 0 0 0 0 0 0 0 +C:D:C:E 78 49 52 66 80 88 130 0 0 1 0 0 0 0 +C:E:C:D 90 53 87 99 84 56 200 0 0 0 0 0 0 0 +C:E:C:E 78 91 82 57 114 90 141 0 0 0 0 0 0 0 +C:D:D:D 89 54 83 48 128 107 211 0 0 0 0 0 0 0 +C:D:D:E 83 46 64 32 67 56 92 0 0 0 0 0 0 0 +C:E:D:D 76 71 120 104 81 90 114 0 0 7 0 0 0 0 +C:E:D:E 72 79 86 63 152 99 148 0 0 0 0 0 0 0 +C:D:E:D 110 40 93 39 79 75 96 0 0 0 0 0 0 1 +C:D:E:E 98 64 66 26 89 99 62 0 0 0 0 0 0 0 +C:E:E:D 103 78 100 57 75 86 172 0 0 0 0 0 0 0 +C:E:E:E 88 90 82 109 98 84 143 0 0 0 0 0 0 0 +C:D:F:D 63 40 73 109 101 71 96 0 0 0 0 0 1 0 +C:D:F:E 80 50 33 21 85 57 90 0 0 0 0 0 0 0 +C:E:F:D 80 44 61 37 68 80 87 0 0 0 0 1 0 0 +C:E:F:E 86 70 178 38 111 80 90 0 0 0 0 0 0 1 +C:D:G:D 288 145 276 83 257 228 293 2 1 20 2 3 3 6 +C:D:G:E 185 151 218 108 236 181 445 4 0 32 2 1 0 3 +C:E:G:D 262 178 370 301 235 264 517 11 3 8 4 3 5 8 +C:E:G:E 303 222 305 205 280 195 536 4 2 11 7 0 4 6 +C:D:H:D 44 37 42 27 60 81 107 0 0 0 0 0 0 0 +C:D:H:E 72 64 87 56 118 94 316 0 0 1 0 1 0 1 +C:E:H:D 36 49 52 28 74 61 115 0 0 0 0 0 0 0 +C:E:H:E 85 60 126 70 207 92 191 0 0 0 0 0 0 0 +C:D:I:D 72 51 90 53 69 38 62 0 0 0 0 0 0 1 +C:D:I:E 97 84 63 23 102 70 89 0 0 0 0 0 0 0 +C:E:I:D 91 59 89 66 86 72 88 0 0 0 0 1 0 0 +C:E:I:E 123 61 103 58 97 98 354 0 0 0 0 0 0 0 +C:D:K:D 65 30 28 43 42 74 40 0 0 0 0 0 0 0 +C:D:K:E 55 24 65 77 71 79 169 0 0 0 0 0 0 0 +C:E:K:D 71 33 75 33 39 75 274 0 0 0 0 0 0 0 +C:E:K:E 59 49 52 50 103 89 154 0 0 0 0 0 0 0 +C:D:L:D 245 169 223 222 270 202 805 1 0 0 0 0 0 1 +C:D:L:E 263 173 185 168 267 190 455 0 0 0 0 0 0 1 +C:E:L:D 263 236 228 163 242 248 541 0 0 1 0 0 1 0 +C:E:L:E 301 240 389 293 380 303 568 0 0 0 0 0 0 1 +C:D:M:D 66 42 25 31 25 27 200 0 0 73 0 0 0 0 +C:D:M:E 46 22 51 14 39 41 31 0 0 1 1 0 0 1 +C:E:M:D 32 24 38 39 36 35 81 0 0 0 0 0 0 0 +C:E:M:E 40 35 33 17 48 30 43 0 1 1 1 0 1 0 +C:D:N:D 39 40 58 21 45 47 122 0 0 0 0 0 0 0 +C:D:N:E 40 27 20 15 44 38 164 0 0 0 0 0 0 0 +C:E:N:D 48 24 48 42 42 63 192 0 0 0 0 0 0 0 +C:E:N:E 70 37 48 27 117 61 123 0 0 0 0 1 1 0 +C:D:P:D 118 67 158 51 108 106 147 0 0 0 0 0 0 0 +C:D:P:E 140 60 152 46 148 142 278 0 0 0 0 2 0 0 +C:E:P:D 124 111 248 125 161 122 503 0 0 0 0 0 0 1 +C:E:P:E 190 110 132 64 137 170 214 1 0 0 0 0 0 0 +C:D:Q:D 97 46 110 25 75 51 58 0 0 0 0 0 0 0 +C:D:Q:E 89 53 64 53 70 111 97 0 0 0 0 0 0 1 +C:E:Q:D 97 60 73 76 76 121 81 0 0 9 0 0 0 0 +C:E:Q:E 97 69 113 117 113 84 471 0 0 0 0 0 0 0 +C:D:R:D 282 216 234 113 198 219 252 0 0 1 0 0 0 1 +C:D:R:E 235 140 184 141 330 239 425 0 0 1 0 0 0 0 +C:E:R:D 281 211 280 99 308 294 492 0 0 0 0 0 0 0 +C:E:R:E 308 224 373 296 440 297 554 0 0 0 0 0 0 0 +C:D:S:D 171 130 158 148 188 143 309 0 0 0 0 0 0 0 +C:D:S:E 227 112 296 127 229 184 336 0 0 2 0 264 0 1 +C:E:S:D 271 146 194 136 221 191 558 0 0 0 0 1 0 0 +C:E:S:E 201 167 182 153 258 204 369 0 1 0 1 0 0 0 +C:D:T:D 72 63 55 27 71 62 85 0 0 0 0 0 0 0 +C:D:T:E 81 44 74 63 93 133 74 0 0 0 0 0 0 0 +C:E:T:D 81 81 121 33 89 92 268 0 1 0 0 0 0 0 +C:E:T:E 95 82 60 45 90 114 94 0 0 0 0 0 0 0 +C:D:V:D 202 89 231 180 182 204 261 0 0 0 0 0 2 1 +C:D:V:E 243 118 214 122 172 199 492 1 1 1 0 0 0 1 +C:E:V:D 202 197 224 203 270 192 380 0 0 0 0 0 0 0 +C:E:V:E 206 122 169 161 225 221 745 0 0 1 0 0 0 1 +C:D:W:D 40 29 49 12 40 57 46 0 0 0 0 0 0 0 +C:D:W:E 48 45 23 56 76 37 56 0 0 0 0 0 0 0 +C:E:W:D 74 67 64 53 57 60 82 0 0 0 0 0 0 0 +C:E:W:E 44 42 65 41 86 56 49 0 0 0 0 0 0 0 +C:D:Y:D 65 33 42 54 50 43 77 0 0 0 0 0 0 0 +C:D:Y:E 50 44 95 25 41 43 80 0 0 0 0 0 0 0 +C:E:Y:D 72 81 45 36 41 42 82 0 0 0 0 0 0 0 +C:E:Y:E 78 38 36 45 74 62 107 0 0 0 0 0 0 0 +D:D:A:D 237 132 174 78 214 184 457 1 0 0 0 1 0 2 +D:D:A:E 295 164 234 133 298 223 899 0 2 2 0 3 1 0 +D:E:A:D 269 133 327 179 284 247 258 0 5 4 0 96 1 44 +D:E:A:E 274 194 363 301 403 307 422 15 20 9 51 11 10 3 +D:D:C:D 93 60 62 56 93 133 165 0 0 0 0 0 0 0 +D:D:C:E 109 52 35 42 127 109 234 0 0 0 0 1 0 0 +D:E:C:D 82 64 67 85 110 127 371 0 0 0 0 0 0 0 +D:E:C:E 97 86 117 55 133 124 423 0 0 0 0 1 0 1 +D:D:D:D 96 81 82 47 96 122 174 0 0 0 0 0 1 2 +D:D:D:E 111 59 162 49 163 114 237 0 0 0 0 0 1 1 +D:E:D:D 137 105 94 58 190 136 175 0 1 0 0 0 0 3 +D:E:D:E 133 43 180 62 144 110 158 1 0 0 0 0 0 0 +D:D:E:D 143 64 159 53 138 97 165 0 0 0 0 1 0 1 +D:D:E:E 114 99 170 133 131 147 208 0 1 0 0 0 0 0 +D:E:E:D 122 81 105 102 158 120 144 0 0 0 0 0 0 0 +D:E:E:E 142 84 117 108 157 106 296 0 0 2 0 0 0 1 +D:D:F:D 117 100 113 45 119 108 325 0 0 0 0 0 0 0 +D:D:F:E 124 88 79 24 152 132 127 0 0 0 0 0 0 0 +D:E:F:D 134 64 90 49 138 103 425 0 0 0 0 0 0 0 +D:E:F:E 93 75 135 47 147 115 146 0 0 0 1 0 0 0 +D:D:G:D 286 257 308 212 304 292 589 4 2 6 2 4 2 7 +D:D:G:E 327 178 317 146 299 260 843 2 2 9 3 1 4 4 +D:E:G:D 341 220 300 290 395 347 801 19 13 16 15 14 17 80 +D:E:G:E 374 238 335 225 519 407 659 36 37 37 68 21 19 6 +D:D:H:D 94 63 65 49 97 80 464 0 0 0 0 1 0 0 +D:D:H:E 105 101 174 49 119 144 405 0 0 1 0 0 0 0 +D:E:H:D 140 114 115 41 185 131 340 0 0 0 0 0 0 0 +D:E:H:E 120 84 152 123 147 125 232 0 0 0 0 1 0 1 +D:D:I:D 114 91 101 125 116 114 209 0 0 0 0 0 1 0 +D:D:I:E 151 76 81 129 163 100 281 0 0 0 0 1 0 0 +D:E:I:D 123 70 107 69 120 118 168 0 1 0 0 0 0 0 +D:E:I:E 119 85 175 101 154 145 147 0 0 0 0 0 0 1 +D:D:K:D 87 53 79 41 73 83 86 0 0 0 0 0 0 0 +D:D:K:E 78 65 66 97 92 58 111 0 0 0 0 0 0 0 +D:E:K:D 112 50 110 39 91 67 123 0 1 0 0 1 0 0 +D:E:K:E 106 38 105 35 99 99 157 0 0 0 0 0 0 0 +D:D:L:D 319 201 289 327 325 298 534 0 1 0 0 0 0 0 +D:D:L:E 321 242 372 247 345 383 1109 0 0 0 0 1 0 0 +D:E:L:D 377 254 387 339 415 361 1077 0 0 1 0 0 0 1 +D:E:L:E 343 244 450 250 476 331 1120 0 1 0 1 4 0 3