package edu.sc.seis.sod.subsetter.channel;
import java.io.FileNotFoundException;
import org.w3c.dom.Element;
import edu.iris.Fissures.IfNetwork.ChannelId;
import edu.iris.Fissures.IfNetwork.ChannelNotFound;
import edu.iris.Fissures.IfNetwork.FilterType;
import edu.iris.Fissures.IfNetwork.Instrumentation;
import edu.iris.Fissures.network.ChannelIdUtil;
import edu.iris.Fissures.network.ChannelImpl;
import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler;
import edu.sc.seis.fissuresUtil.sac.FissuresToSac;
import edu.sc.seis.fissuresUtil.sac.InvalidResponse;
import edu.sc.seis.sod.ConfigurationException;
import edu.sc.seis.sod.source.network.NetworkSource;
import edu.sc.seis.sod.status.Fail;
import edu.sc.seis.sod.status.Pass;
import edu.sc.seis.sod.status.StringTree;
import edu.sc.seis.sod.subsetter.VelocityFileElementParser;
import edu.sc.seis.sod.velocity.PrintlineVelocitizer;
/**
* @author crotwell Created on Jul 19, 2005
*/
public class SacPoleZeroWriter implements ChannelSubsetter {
public SacPoleZeroWriter(Element config) throws ConfigurationException {
VelocityFileElementParser parser = new VelocityFileElementParser(config,
DEFAULT_DIRECTORY,
DEFAULT_TEMPLATE);
template = parser.getTemplate();
velocitizer = new PrintlineVelocitizer(new String[] {template});
}
public StringTree accept(ChannelImpl chan, NetworkSource network)
throws Exception {
Instrumentation inst;
try {
inst = network.getInstrumentation(chan);
} catch(ChannelNotFound e) {
return new Fail(this, "No instrumentation");
} catch(InvalidResponse e) {
logger.warn("Invalid instrumentation: ", e);
return new Fail(this, "Invalid instrumentation: "+e.getMessage());
}
if(inst.the_response.stages[0].filters[0].discriminator().value() != FilterType._POLEZERO) {
String filter;
if (inst.the_response.stages[0].filters[0].discriminator().value() == FilterType.COEFFICIENT.value()) {
filter = "COEFFICIENT";
} else if (inst.the_response.stages[0].filters[0].discriminator().value() == FilterType.LIST.value()) {
filter = "LIST";
} else {
filter = "UNKNOWN: "+inst.the_response.stages[0].filters[0].discriminator().value();
}
return new Fail(this, "first (sensor) stage is not a PoleZero filter: "+filter);
}
String response = FissuresToSac.getPoleZero(inst.the_response)
.toString();
try {
velocitizer.evaluate(template, response, chan);
} catch(FileNotFoundException fe) {
GlobalExceptionHandler.handle("Error while writing response file for "
+ ChannelIdUtil.toString(chan.get_id()),
fe);
return new Fail(this, "Error while writing response file", fe);
}
return new Pass(this);
}
public static final String DEFAULT_DIRECTORY = "polezero/";
public static final String DEFAULT_TEMPLATE = "${channel.codes}.${channel.getStart('yyyy_DDD_HH_mm_ss')}.sacpz";
private String template;
private PrintlineVelocitizer velocitizer;
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SacPoleZeroWriter.class);
}