package edu.sc.seis.sod.process.waveform; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; import edu.iris.Fissures.Location; import edu.iris.Fissures.model.QuantityImpl; import edu.iris.Fissures.model.UnitImpl; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; import edu.iris.dmc.seedcodec.CodecException; import edu.sc.seis.TauP.Arrival; import edu.sc.seis.TauP.SeismicPhase; import edu.sc.seis.fissuresUtil.bag.DistAz; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.fissuresUtil.cache.EventUtil; import edu.sc.seis.fissuresUtil.mockFissures.MockLocation; import edu.sc.seis.fissuresUtil.mockFissures.IfEvent.MockEventAccessOperations; import edu.sc.seis.fissuresUtil.mockFissures.IfNetwork.MockChannel; import edu.sc.seis.fissuresUtil.mockFissures.IfSeismogramDC.MockSeismogram; import edu.sc.seis.fissuresUtil.sac.FissuresToSac; import edu.sc.seis.seisFile.sac.SacTimeSeries; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.status.FissuresFormatter; public class SacWriterTest extends TestCase { public void setUp() throws CodecException { sts = FissuresToSac.getSAC(seis, chan, EventUtil.extractOrigin(ev)); } public void testGenerate() throws ConfigurationException { String[][] templateAndResult = new String[][] { {"${seismogram.name}.sac", seis.getName() + ".sac"}, {"/${event.catalog}", "/" + EventUtil.extractOrigin(ev).getCatalog()}, {"${channel.name}", chan.getName()}}; for(int i = 0; i < templateAndResult.length; i++) { assertEquals(FissuresFormatter.filize(templateAndResult[i][1]), new SacWriter("", templateAndResult[i][0]).generate(ev, chan, seis, 0, 1)); } assertEquals(FissuresFormatter.filize("test/" + seis.getName()), new SacWriter("test/", seis.getName()).generate(ev, chan, seis, 0, 1)); assertEquals(FissuresFormatter.filize("test/" + seis.getName()), new SacWriter("test", seis.getName()).generate(ev, chan, seis, 0, 1)); } public void testApplyProcessorsWithNoProcessors() throws Exception { new SacWriter().applyProcessors(sts, ev, chan); } public void testApplyPhaseHeaderProcessor() throws Exception { ArrayList<SacProcess> processes = new ArrayList<SacProcess>(); processes.add(new SacProcess() { @Override public void process(SacTimeSeries sac, CacheEvent event, ChannelImpl channel) throws Exception { sac.getHeader().setKt0("ttp"); } }); SacWriter sw = new SacWriter(SacWriter.DEFAULT_WORKING_DIR, SacWriter.DEFAULT_FILE_TEMPLATE, SacWriter.DEFAULT_PREFIX, processes, false, false); sw.applyProcessors(sts, ev, chan); assertEquals(sts.getHeader().getKt0(), "ttp"); } public void testSecondArrival() throws Exception { Location staLoc = chan.getStation().getLocation(); Location evtLoc = ev.get_preferred_origin().getLocation(); float evDepth = (float)((QuantityImpl)evtLoc.depth).getValue(UnitImpl.KILOMETER); SeismicPhase sp = new SeismicPhase("P", "prem", evDepth); DistAz distAz = new DistAz(staLoc, evtLoc); double distDeg = distAz.getDelta(); List<Arrival> arrivals = sp.calcTime(distDeg); assertTrue(2 <= arrivals.size()); ArrayList<SacProcess> processes = new ArrayList<SacProcess>(); processes.add(new PhaseHeaderProcess("prem", "P", 1, 2)); SacWriter sw = new SacWriter(SacWriter.DEFAULT_WORKING_DIR, SacWriter.DEFAULT_FILE_TEMPLATE, SacWriter.DEFAULT_PREFIX, processes, false, false); sw.applyProcessors(sts, ev, chan); assertEquals(sts.getHeader().getT1(), (float)arrivals.get(1).getTime()); } public void testGenerateLocations() throws ConfigurationException { SacWriter sw = new SacWriter("${seismogram.name}.sac"); assertTrue(sw.generate(ev, chan, seis, 0, 2)+" endsWith 1.sac", sw.generate(ev, chan, seis, 0, 2).endsWith("1.sac")); assertTrue(sw.generate(ev, chan, seis, 1, 2)+" ends with 2.sac", sw.generate(ev, chan, seis, 1, 2).endsWith("2.sac")); } public void testRemoveExisting() throws FileNotFoundException, IOException, ConfigurationException { SacWriter sw = new SacWriter("", System.getProperty("java.io.tmpdir") + File.separator + "blahblah"); String[] locs = new String[5]; for(int i = 0; i < locs.length; i++) { locs[i] = sw.generate(ev, chan, seis, i, locs.length); new FileOutputStream(locs[i]).close(); assertTrue(new File(locs[i]).exists()); } sw.removeExisting(ev, chan, seis, locs.length); for(int i = 0; i < locs.length; i++) { assertFalse(new File(locs[i]).exists()); } } public void testIndexAppending() throws FileNotFoundException, IOException, ConfigurationException { assertEquals("harar${index}", new SacWriter("", "harar").getTemplate()); assertEquals("$index/harar",new SacWriter("", "$index/harar").getTemplate()); assertEquals("ha${index}rar",new SacWriter("", "ha${index}rar").getTemplate()); } CacheEvent ev = MockEventAccessOperations.createEvent(); ChannelImpl chan = MockChannel.createChannel(MockLocation.create(10.0f, 10.0f)); LocalSeismogramImpl seis = MockSeismogram.createSpike(chan.getId()); SacTimeSeries sts; }