/* * #%L * gitools-core * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.analysis.stats.test.factory; import org.gitools.analysis.ToolConfig; import org.gitools.analysis.stats.test.EnrichmentTest; import java.util.HashMap; import java.util.Map; public abstract class TestFactory { public static final String TEST_NAME_PROPERTY = "test-name"; public static final String ZSCORE_TEST = "zscore"; public static final String BINOMIAL_TEST = "binomial"; public static final String FISHER_EXACT_TEST = "fisher-exact"; private static final String HYPERGEOMETRIC_TEST = "hypergeometric"; private static final String CHI_SQUARE_TEST = "chi-square"; private static final String MANN_WHITNEY_WILCOXON = "mannWhitneyWilcoxon"; private static final String ONE_WAY_ANOVA = "oneWayAnova"; private static enum TestEnum { zscore, binomial, hypergeometric, fisherExact, chiSquare, mannWhitneyWilcoxon, oneWayAnova } private static final Map<String, TestEnum> testNameMap = new HashMap<>(); static { testNameMap.put(ZSCORE_TEST, TestEnum.zscore); testNameMap.put(BINOMIAL_TEST, TestEnum.binomial); testNameMap.put(FISHER_EXACT_TEST, TestEnum.fisherExact); testNameMap.put(HYPERGEOMETRIC_TEST, TestEnum.hypergeometric); testNameMap.put(CHI_SQUARE_TEST, TestEnum.chiSquare); testNameMap.put(MANN_WHITNEY_WILCOXON, TestEnum.mannWhitneyWilcoxon); testNameMap.put(ONE_WAY_ANOVA, TestEnum.oneWayAnova); } private static enum TestConfigEnum { zscoreMean, zscoreMedian, binomial, binomialExact, binomialNormal, binomialPoisson, hypergeometric, fisherExact, chiSquare, mannWhitneyWilcoxon, oneWayAnova } private static final Map<String, TestConfigEnum> testAliases = new HashMap<>(); static { testAliases.put("zscore", TestConfigEnum.zscoreMean); testAliases.put("zscore-mean", TestConfigEnum.zscoreMean); testAliases.put("zscore-median", TestConfigEnum.zscoreMedian); testAliases.put("binomial", TestConfigEnum.binomialExact); testAliases.put("binomial-exact", TestConfigEnum.binomialExact); testAliases.put("binomial-normal", TestConfigEnum.binomialNormal); testAliases.put("binomial-poisson", TestConfigEnum.binomialPoisson); testAliases.put("fisher", TestConfigEnum.fisherExact); testAliases.put("hyper-geom", TestConfigEnum.hypergeometric); testAliases.put("hyper-geometric", TestConfigEnum.hypergeometric); testAliases.put("hypergeometric", TestConfigEnum.hypergeometric); testAliases.put("chi-square", TestConfigEnum.chiSquare); testAliases.put("mannWhitneyWilcoxon", TestConfigEnum.mannWhitneyWilcoxon); testAliases.put("oneWayAnova", TestConfigEnum.oneWayAnova); } public static TestFactory createFactory(ToolConfig config) { final String testName = config.get(TEST_NAME_PROPERTY); TestEnum selectedTest = testNameMap.get(testName); if (selectedTest == null) { throw new IllegalArgumentException("Unknown test " + testName); } TestFactory testFactory = null; switch (selectedTest) { case zscore: testFactory = new ZscoreTestFactory(config); break; case binomial: testFactory = new BinomialTestFactory(config); break; case fisherExact: testFactory = new FisherTestFactory(config); break; case hypergeometric: throw new IllegalArgumentException("Test not implemented yet: " + testName); //break; case chiSquare: throw new IllegalArgumentException("Test not implemented yet: " + testName); //break; case mannWhitneyWilcoxon: testFactory = new MannWhitneyWilcoxonTestFactory(config); break; case oneWayAnova: testFactory = new OneWayAnovaTestFactory(config); break; } return testFactory; } public static ToolConfig createToolConfig(String toolName, String configName) { TestConfigEnum selectedTest = testAliases.get(configName); if (selectedTest == null) { throw new IllegalArgumentException("Unknown test " + configName); } ToolConfig config = new ToolConfig(toolName); switch (selectedTest) { case zscoreMean: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.ZSCORE_TEST); config.put(ZscoreTestFactory.NUM_SAMPLES_PROPERTY, String.valueOf(ZscoreTestFactory.DEFAULT_NUM_SAMPLES)); config.put(ZscoreTestFactory.ESTIMATOR_PROPERTY, ZscoreTestFactory.MEAN_ESTIMATOR); break; case zscoreMedian: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.ZSCORE_TEST); config.put(ZscoreTestFactory.NUM_SAMPLES_PROPERTY, String.valueOf(ZscoreTestFactory.DEFAULT_NUM_SAMPLES)); config.put(ZscoreTestFactory.ESTIMATOR_PROPERTY, ZscoreTestFactory.MEDIAN_ESTIMATOR); break; case binomial: case binomialExact: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.BINOMIAL_TEST); config.put(BinomialTestFactory.APROXIMATION_PROPERTY, BinomialTestFactory.EXACT_APROX); break; case binomialNormal: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.BINOMIAL_TEST); config.put(BinomialTestFactory.APROXIMATION_PROPERTY, BinomialTestFactory.NORMAL_APROX); break; case binomialPoisson: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.BINOMIAL_TEST); config.put(BinomialTestFactory.APROXIMATION_PROPERTY, BinomialTestFactory.POISSON_APROX); break; case hypergeometric: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.HYPERGEOMETRIC_TEST); break; case fisherExact: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.FISHER_EXACT_TEST); break; case chiSquare: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.CHI_SQUARE_TEST); break; case mannWhitneyWilcoxon: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.MANN_WHITNEY_WILCOXON); break; case oneWayAnova: config.put(TestFactory.TEST_NAME_PROPERTY, TestFactory.ONE_WAY_ANOVA); break; } return config; } private final ToolConfig toolConfig; TestFactory(ToolConfig config) { this.toolConfig = config; } public ToolConfig getTestConfig() { return toolConfig; } public abstract EnrichmentTest create(); }