package org.opensha2.eq.model; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static org.opensha2.eq.model.SourceType.INTERFACE; import org.opensha2.geo.Location; import org.opensha2.geo.Locations; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Container class for groups of related {@link InterfaceSource}s. * * @author Peter Powers * @see InterfaceSource */ public class InterfaceSourceSet extends AbstractSourceSet<InterfaceSource> { /* * TODO sourceMap should replace sources once all sources have associated ID's */ private final List<InterfaceSource> sources; private final Map<Integer, FaultSource> sourceMap; private InterfaceSourceSet(String name, int id, double weight, GmmSet gmmSet, List<InterfaceSource> sources) { super(name, id, weight, gmmSet); this.sources = sources; /* TODO refactor to builder */ ImmutableMap.Builder<Integer, FaultSource> b = ImmutableMap.builder(); for (FaultSource source : sources) { b.put(source.id, source); } sourceMap = b.build(); } /** * Return the source associated with the supplied id. * @param id of source to retrieve */ public Source source(int id) { return sourceMap.get(id); } @Override public Iterator<InterfaceSource> iterator() { return sources.iterator(); } @Override public int size() { return sources.size(); } @Override public SourceType type() { return INTERFACE; } @Override public Predicate<InterfaceSource> distanceFilter(final Location loc, final double distance) { return new Predicate<InterfaceSource>() { private Predicate<Location> filter = Locations.distanceFilter(loc, distance); @Override public boolean apply(InterfaceSource source) { return filter.apply(source.trace.first()) || filter.apply(source.trace.last()) || filter.apply(source.lowerTrace.first()) || filter.apply(source.lowerTrace.last()); } @Override public String toString() { return "InterfaceSourceSet.DistanceFilter[ " + filter.toString() + " ]"; } }; } /* Single use builder. */ static class Builder extends FaultSourceSet.Builder { static final String ID = "InterfaceSourceSet.Builder"; final List<InterfaceSource> sources = Lists.newArrayList(); Builder source(InterfaceSource source) { sources.add(checkNotNull(source, "InterfaceSource is null")); return this; } InterfaceSourceSet buildSubductionSet() { validateState(ID); checkState(sources.size() > 0, "%s source list is empty", id); return new InterfaceSourceSet(name, id, weight, gmmSet, sources); } } }