package org.openlca.core.results; import java.util.List; import org.openlca.core.model.descriptors.FlowDescriptor; import org.openlca.core.model.descriptors.ImpactCategoryDescriptor; import org.openlca.core.model.descriptors.ProcessDescriptor; import org.openlca.core.results.Contributions.Function; /** * Calculates the contributions of single process results grouped by a given * grouping set. */ public class GroupingContribution { private ContributionResultProvider<?> result; private List<ProcessGrouping> groupings; public GroupingContribution(ContributionResultProvider<?> result, List<ProcessGrouping> groupings) { this.result = result; this.groupings = groupings; } /** Calculates contributions to an inventory flow. */ public ContributionSet<ProcessGrouping> calculate(final FlowDescriptor flow) { if (result == null || groupings == null) return ContributionSet.empty(); double total = result.getTotalFlowResult(flow).value; return Contributions.calculate(groupings, total, new Function<ProcessGrouping>() { @Override public double value(ProcessGrouping grouping) { double amount = 0; for (ProcessDescriptor p : grouping.processes) amount += result.getSingleFlowResult(p, flow).value; return amount; } }); } /** Calculates contributions to an impact assessment method. */ public ContributionSet<ProcessGrouping> calculate( final ImpactCategoryDescriptor impact) { if (result == null || groupings == null) return ContributionSet.empty(); double total = result.getTotalImpactResult(impact).value; return Contributions.calculate(groupings, total, new Function<ProcessGrouping>() { @Override public double value(ProcessGrouping grouping) { double amount = 0; for (ProcessDescriptor p : grouping.processes) amount += result.getSingleImpactResult(p, impact).value; return amount; } }); } }