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.FAULT;
import org.opensha2.geo.Location;
import org.opensha2.geo.Locations;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
/**
* Container class for related {@link FaultSource}s.
*
* @author Peter Powers
* @see FaultSource
*/
public class FaultSourceSet extends AbstractSourceSet<FaultSource> {
/*
* TODO sourceMap should replace sources once all sources have associated ID's
*/
private final List<FaultSource> sources;
private final ListMultimap<Integer, FaultSource> sourceMap;
private FaultSourceSet(
String name,
int id,
double weight,
List<FaultSource> sources,
GmmSet gmmSet) {
super(name, id, weight, gmmSet);
this.sources = sources;
/*
* TODO refactor to builder; multi map to handle dip variants with same id
*/
ImmutableListMultimap.Builder<Integer, FaultSource> b = ImmutableListMultimap.builder();
for (FaultSource source : sources) {
b.put(source.id, source);
}
sourceMap = b.build();
}
/**
* Return those sources associated with the supplied id.
* @param id of sources to retrieve
*/
public List<FaultSource> sources(int id) {
return sourceMap.get(id);
}
@Override
public Iterator<FaultSource> iterator() {
return sources.iterator();
}
@Override
public int size() {
return sources.size();
}
@Override
public SourceType type() {
return FAULT;
}
@Override
public Predicate<FaultSource> distanceFilter(Location loc, double distance) {
return new DistanceFilter(loc, distance);
}
/* Not inlined for use by cluster sources */
static class DistanceFilter implements Predicate<FaultSource> {
private final Predicate<Location> filter;
DistanceFilter(Location loc, double distance) {
filter = Locations.distanceFilter(loc, distance);
}
@Override
public boolean apply(FaultSource source) {
return filter.apply(source.trace.first()) || filter.apply(source.trace.last());
}
@Override
public String toString() {
return "FaultSourceSet.DistanceFilter[ " + filter.toString() + " ]";
}
}
/* Single use builder. */
static class Builder extends AbstractSourceSet.Builder {
static final String ID = "FaultSourceSet.Builder";
final List<FaultSource> sources = Lists.newArrayList();
Builder source(FaultSource source) {
sources.add(checkNotNull(source, "FaultSource is null"));
return this;
}
@Override
void validateState(String buildId) {
super.validateState(buildId);
}
FaultSourceSet buildFaultSet() {
validateState(ID);
// this is here because calls up from interface
// will fail in this.validateState()
checkState(sources.size() > 0, "%s source list is empty", ID);
return new FaultSourceSet(name, id, weight, sources, gmmSet);
}
}
}