package edu.sc.seis.sod.process.waveform;
import java.util.List;
import org.w3c.dom.Element;
import edu.iris.Fissures.network.ChannelImpl;
import edu.sc.seis.TauP.Arrival;
import edu.sc.seis.TauP.TauModelException;
import edu.sc.seis.TauP.TauP_SetSac;
import edu.sc.seis.fissuresUtil.bag.TauPUtil;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.fissuresUtil.cache.EventUtil;
import edu.sc.seis.fissuresUtil.display.configuration.DOMHelper;
import edu.sc.seis.seisFile.sac.SacTimeSeries;
public class PhaseHeaderProcess implements SacProcess {
private static final int DEFAULT_T_HEADER = 0;
private static final String DEFAULT_MODEL = "prem";
private static final String DEFAULT_PHASE = "ttp";
public PhaseHeaderProcess(String model, String phaseName, int tHeader, int arrivalIndex) {
this.model = model;
this.phaseName = phaseName;
this.tHeader = tHeader;
this.arrivalIndex = arrivalIndex;
// shift to zero based index, so positive index minus one, neg index stays same
if (this.arrivalIndex > 0) { this.arrivalIndex -= 1; }
}
public PhaseHeaderProcess(Element phaseEl) {
this.model = DOMHelper.extractText(phaseEl, "model", DEFAULT_MODEL);
this.phaseName = DOMHelper.extractText(phaseEl, "phaseName", DEFAULT_PHASE);
String header = DOMHelper.extractText(phaseEl, "tHeader", ""+DEFAULT_T_HEADER);
if (header.equalsIgnoreCase("a")) {
this.tHeader = TauP_SetSac.A_HEADER;
} else {
this.tHeader = DOMHelper.extractInt(phaseEl, "tHeader", DEFAULT_T_HEADER);
}
arrivalIndex = DOMHelper.extractInt(phaseEl, "arrivalIndex", 1);
// shift to zero based index, so positive index minus one, neg index stays same
if (arrivalIndex > 0) { arrivalIndex -= 1; }
}
public void process(SacTimeSeries sac,
CacheEvent event,
ChannelImpl channel) {
try {
List<Arrival> arrivals = TauPUtil.getTauPUtil(model)
.calcTravelTimes(channel.getSite().getLocation(),
EventUtil.extractOrigin(event),
new String[] {phaseName});
if ( arrivalIndex >= 0 && arrivals.size() > arrivalIndex) {
TauP_SetSac.setSacTHeader(sac, tHeader, arrivals.get(arrivalIndex));
} else if ( arrivalIndex < 0 && arrivals.size() > -1*arrivalIndex) {
TauP_SetSac.setSacTHeader(sac, tHeader, arrivals.get(arrivals.size()+arrivalIndex));
}
} catch(TauModelException e) {
logger.warn("Problem setting travel times for " + phaseName
+ " in " + model, e);
}
}
String model;
String phaseName;
int tHeader;
int arrivalIndex = 0;
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(PhaseHeaderProcess.class);
}