package edu.sc.seis.sod.process.waveform;
import org.w3c.dom.Element;
import edu.iris.Fissures.FissuresException;
import edu.iris.Fissures.IfSeismogramDC.RequestFilter;
import edu.iris.Fissures.network.ChannelImpl;
import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.sod.CookieJar;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.measure.Measurement;
import edu.sc.seis.sod.status.Fail;
import edu.sc.seis.sod.status.Pass;
public abstract class AbstractWaveformMeasure implements WaveformProcess {
protected String name;
public AbstractWaveformMeasure(Element config) {
name = SodUtil.loadText(config, "name", SodUtil.getSimpleName(getClass()));
}
@Override
public WaveformResult accept(CacheEvent event,
ChannelImpl channel,
RequestFilter[] original,
RequestFilter[] available,
LocalSeismogramImpl[] seismograms,
CookieJar cookieJar) throws Exception {
if (seismograms.length != 0) {
Measurement m = calculate(event, channel, original, available, seismograms, cookieJar);
cookieJar.put(m.getName(), m);
return new WaveformResult(seismograms, new Pass(this));
}
return new WaveformResult(seismograms, new Fail(this));
}
public String getName() {
return name;
}
abstract Measurement calculate(CacheEvent event,
ChannelImpl channel,
RequestFilter[] original,
RequestFilter[] available,
LocalSeismogramImpl[] seismograms,
CookieJar cookieJar) throws Exception;
protected static float[] toFloatArrayAsIfContinuous(LocalSeismogramImpl[] seis) throws FissuresException {
int npts = 0;
for (int i = 0; i < seis.length; i++) {
npts += seis[i].getNumPoints();
}
float[] data = new float[npts];
int pos = 0;
for (int i = 0; i < seis.length; i++) {
System.arraycopy(seis[i].get_as_floats(), 0, data, pos, seis[i].getNumPoints());
pos += seis[i].getNumPoints();
}
return data;
}
}