package edu.sc.seis.sod.subsetter.eventStation; import org.w3c.dom.Element; import edu.iris.Fissures.Location; import edu.iris.Fissures.IfEvent.EventAccessOperations; import edu.iris.Fissures.IfEvent.Origin; import edu.iris.Fissures.network.StationImpl; import edu.sc.seis.TauP.SphericalCoords; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.fissuresUtil.cache.EventUtil; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.CookieJar; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.status.StringTree; import edu.sc.seis.sod.status.StringTreeLeaf; import edu.sc.seis.sod.subsetter.DistanceRangeSubsetter; import edu.sc.seis.sod.subsetter.origin.MagnitudeRange; public class LinearDistanceMagnitudeRange extends DistanceRangeSubsetter implements EventStationSubsetter { public LinearDistanceMagnitudeRange(Element config) throws ConfigurationException { super(config); Element subElement = SodUtil.getElement(config, "magnitudeRange"); magnitudeRange = (MagnitudeRange)SodUtil.load(subElement, "origin"); } public StringTree accept(CacheEvent eventAccess, StationImpl station, CookieJar cookieJar) { Location stationLoc = station.getLocation(); return new StringTreeLeaf(this, accept(eventAccess, stationLoc.latitude, stationLoc.longitude)); } public boolean accept(EventAccessOperations eventAccess, double stationLat, double stationLon) { Origin origin = EventUtil.extractOrigin(eventAccess); Location originLoc = origin.getLocation(); double actualDistance = SphericalCoords.distance(originLoc.latitude, originLoc.longitude, stationLat, stationLon); if(actualDistance >= getMin().value && actualDistance <= getMax().value) { double resultantMagnitude = magnitudeRange.getMinValue() + (actualDistance - getMin().value) * (double)(magnitudeRange.getMaxValue() - magnitudeRange.getMinValue()) / (getMin().value - getMax().value); for(int i = 0; i < origin.getMagnitudes().length; i++) { if(origin.getMagnitudes()[i].value >= resultantMagnitude) { if(magnitudeRange.getSearchTypes().length == 0) { // don't care about search types return true; } for(int j = 0; j < magnitudeRange.getSearchTypes().length; j++) { if(origin.getMagnitudes()[i].type.equals(magnitudeRange.getSearchTypes())) { return true; } } } } } return false; } private MagnitudeRange magnitudeRange; }// LinearDistanceMagnitudeRange