package edu.sc.seis.sod.process.waveform; import java.io.File; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; 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.fissuresUtil.sac.FissuresToSac; import edu.sc.seis.fissuresUtil.xml.SeismogramFileTypes; import edu.sc.seis.seisFile.sac.SacTimeSeries; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.SodUtil; public class SacWriter extends AbstractSeismogramWriter { public static final String DEFAULT_FILE_TEMPLATE = DEFAULT_FILE_TEMPLATE_WO_EXT+".sac"; public SacWriter(Element el) throws ConfigurationException { this(extractWorkingDir(el), extractFileTemplate(el, DEFAULT_FILE_TEMPLATE), extractPrefix(el), extractProcessors(el), DOMHelper.hasElement(el, "storeSeismogramsInDB"), DOMHelper.hasElement(el, "littleEndian")); } private static List<SacProcess> extractProcessors(Element el) { NodeList nl = DOMHelper.getElements(el, "phaseTimeHeader"); ArrayList<SacProcess> out = new ArrayList<SacProcess>(); for(int i = 0; i < nl.getLength(); i++) { out.add( new PhaseHeaderProcess((Element)nl.item(i))); } Element sacScript = SodUtil.getElement(el, "sacHeaderScript"); if (sacScript != null) { out.add( new SacHeaderScript(sacScript)); } return out; } public SacWriter() throws ConfigurationException { this(DEFAULT_FILE_TEMPLATE); } public SacWriter(String workingDir) throws ConfigurationException { this(workingDir, DEFAULT_FILE_TEMPLATE); } public SacWriter(String workingDir, String fileTemplate) throws ConfigurationException { this(workingDir, fileTemplate, DEFAULT_PREFIX, new ArrayList<SacProcess>(), false, false); } public SacWriter(List<SacProcess> processes) throws ConfigurationException { this(DEFAULT_WORKING_DIR, DEFAULT_FILE_TEMPLATE, DEFAULT_PREFIX, processes, false, false); } public SacWriter(String workingDir, String fileTemplate, String prefix, List<SacProcess> processes, boolean storeSeismogramsInDB, boolean littleEndian) throws ConfigurationException { super(workingDir, fileTemplate, prefix, storeSeismogramsInDB); this.processors = processes; this.littleEndian=littleEndian; } public void write(String location, LocalSeismogramImpl seis, ChannelImpl chan, CacheEvent ev) throws Exception { SacTimeSeries writer = FissuresToSac.getSAC(seis, chan, EventUtil.extractOrigin(ev)); applyProcessors(writer, ev, chan); if (littleEndian) { writer.getHeader().setLittleEndian(); } File f = new File(location); writer.write(f); AbstractSeismogramWriter.addBytesWritten(f.length()); } public void applyProcessors(SacTimeSeries writer, CacheEvent ev, ChannelImpl chan) throws Exception { for (SacProcess processor : processors) { processor.process(writer, ev, chan); } } public SeismogramFileTypes getFileType() { return SeismogramFileTypes.SAC; } boolean littleEndian; private List<SacProcess> processors = new ArrayList<SacProcess>(); }