package edu.sc.seis.sod.subsetter.eventStation;
import java.util.List;
import org.w3c.dom.Element;
import edu.iris.Fissures.model.QuantityImpl;
import edu.iris.Fissures.model.UnitImpl;
import edu.iris.Fissures.network.StationImpl;
import edu.sc.seis.fissuresUtil.bag.DistAz;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.fissuresUtil.xml.XMLUtil;
import edu.sc.seis.sod.ConfigurationException;
import edu.sc.seis.sod.CookieJar;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.hibernate.SodDB;
import edu.sc.seis.sod.status.Fail;
import edu.sc.seis.sod.status.Pass;
import edu.sc.seis.sod.status.StringTree;
public class RemoveStationDuplicate implements EventStationSubsetter {
public StringTree accept(CacheEvent event, StationImpl station, CookieJar cookieJar) throws Exception {
List<StationImpl> passStations = SodDB.getSingleton().getSuccessfulStationsForEvent(event);
for (StationImpl stationImpl : passStations) {
if (isDistanceClose(station, stationImpl)) {
return new Fail(this);
}
}
return new Pass(this);
}
public boolean isDistanceClose(StationImpl staA, StationImpl staB) {
DistAz distAz = new DistAz(staA.getLocation(), staB.getLocation());
if (maxDistance.getUnit().isConvertableTo(UnitImpl.DEGREE)) {
return distAz.getDelta() < maxDistance.convertTo(UnitImpl.DEGREE).value;
} else {
// use earth radius of 6371 km
return distAz.getDelta()*6371 < maxDistance.convertTo(UnitImpl.KILOMETER).value;
}
}
public RemoveStationDuplicate(Element config) throws ConfigurationException {
Element el = XMLUtil.getElement(config, "maxDistance");
if (el != null){
setMaxDistance(SodUtil.loadQuantity(el));
}
}
public RemoveStationDuplicate(QuantityImpl maxDistance) throws ConfigurationException {
setMaxDistance(maxDistance);
}
public RemoveStationDuplicate() {
}
protected void setMaxDistance(QuantityImpl maxDistance) throws ConfigurationException {
if ( ! ( maxDistance.getUnit().isConvertableTo(UnitImpl.DEGREE) || maxDistance.getUnit().isConvertableTo(UnitImpl.KILOMETER))) {
throw new ConfigurationException("Units must be convertible to DEGREE or KILOMETER: "+maxDistance.getUnit());
}
this.maxDistance = maxDistance;
}
protected QuantityImpl maxDistance = new QuantityImpl(0.5, UnitImpl.DEGREE);
}