/*
* #%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.groupcomparison;
import com.google.common.collect.Iterables;
import org.gitools.analysis.groupcomparison.dimensiongroups.DimensionGroup;
import org.gitools.analysis.groupcomparison.format.math33Preview.CombinatoricsUtils;
import org.gitools.analysis.stats.test.MannWhitneyWilcoxonTest;
import org.gitools.analysis.stats.test.results.GroupComparisonResult;
import org.gitools.api.matrix.AbstractMatrixFunction;
import org.gitools.api.matrix.IMatrixDimension;
import org.gitools.api.matrix.IMatrixLayer;
import org.gitools.api.matrix.IMatrixPosition;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import static com.google.common.base.Predicates.notNull;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
public class GroupComparisonFunction extends AbstractMatrixFunction<Map<String, GroupComparisonResult>, String> {
private MannWhitneyWilcoxonTest test;
private IMatrixLayer<Double> valueLayer;
private IMatrixDimension sourceDimension;
private DimensionGroup[] groups;
private NullConversion nullConversion;
public GroupComparisonFunction(MannWhitneyWilcoxonTest test,
IMatrixDimension sourceDimension,
IMatrixLayer<Double> valueLayer,
NullConversion nullConversion,
DimensionGroup... groups) {
this.test = test;
this.sourceDimension = sourceDimension;
this.valueLayer = valueLayer;
this.groups = groups;
this.nullConversion = nullConversion;
}
public GroupComparisonFunction() {
}
@Override
public Map<String, GroupComparisonResult> apply(String identifier, IMatrixPosition position) {
// Filter according to Predicate (groupFilter), transform according to nullConversion,
// and finally remove nulls.
Iterator<int[]> combIterator = CombinatoricsUtils.combinationsIterator(groups.length, 2);
// LinkedHashMap to guarantee order in result heatmap
Map<String, GroupComparisonResult> resultHashMap = new LinkedHashMap<>();
while (combIterator.hasNext()) {
int[] groupIndices = combIterator.next();
DimensionGroup dimensionGroup1 = groups[groupIndices[0]];
DimensionGroup dimensionGroup2 = groups[groupIndices[1]];
Iterable<Double> group1 =
filter(
transform(
position.iterate(valueLayer, sourceDimension).filter(dimensionGroup1.getPredicate()), nullConversion),
notNull());
Iterable<Double> group2 =
filter(
transform(
position.iterate(valueLayer, sourceDimension).filter(dimensionGroup2.getPredicate()), nullConversion),
notNull());
GroupComparisonResult result = null;
if (Iterables.size(group1) < 3 || Iterables.size(group2) < 3) {
result = test.getNullResult(Iterables.size(group1) + Iterables.size(group2),
Iterables.size(group1),
Iterables.size(group2));
} else {
result = test.processTest(group1, group2);
}
resultHashMap.put(
dimensionGroup1.getName() + " VS " + dimensionGroup2.getName(),
result);
}
return resultHashMap;
}
}