package com.isti.traceview.data; import static edu.sc.seis.seisFile.sac.SacConstants.FALSE; import static edu.sc.seis.seisFile.sac.SacConstants.ITIME; import static edu.sc.seis.seisFile.sac.SacConstants.TRUE; import static edu.sc.seis.seisFile.sac.SacConstants.IAMPH; import static edu.sc.seis.seisFile.sac.SacConstants.IRLIM; import static edu.sc.seis.seisFile.sac.SacConstants.IXY; import static edu.sc.seis.seisFile.sac.SacConstants.IUNKN; import java.io.DataOutputStream; import java.io.IOException; import java.text.DecimalFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import edu.sc.seis.seisFile.sac.SacHeader; import edu.sc.seis.seisFile.sac.SacTimeSeries; public class SacTimeSeriesASCII extends SacTimeSeries { public static final DecimalFormat floatFormat = new DecimalFormat("######0.0000000"); // G15.7 public static final DecimalFormat intFormat = new DecimalFormat("##########"); // I10 public SacTimeSeriesASCII() { super(); } public SacTimeSeriesASCII(SacHeader header, float[] data) { super(header, data); } public void writeHeader(DataOutputStream dos) throws IOException { // 1 writeFmt(dos, getHeader().getDelta()); writeFmt(dos, getHeader().getDepmin()); writeFmt(dos, getHeader().getDepmax()); writeFmt(dos, getHeader().getScale()); writeFmt(dos, getHeader().getOdelta()); dos.writeBytes("\n"); // 2 writeFmt(dos, getHeader().getB()); writeFmt(dos, getHeader().getE()); writeFmt(dos, getHeader().getO()); writeFmt(dos, getHeader().getA()); writeFmt(dos, getHeader().getFmt()); dos.writeBytes("\n"); // 3 writeFmt(dos, getHeader().getT0()); writeFmt(dos, getHeader().getT1()); writeFmt(dos, getHeader().getT2()); writeFmt(dos, getHeader().getT3()); writeFmt(dos, getHeader().getT4()); dos.writeBytes("\n"); // 4 writeFmt(dos, getHeader().getT5()); writeFmt(dos, getHeader().getT6()); writeFmt(dos, getHeader().getT7()); writeFmt(dos, getHeader().getT8()); writeFmt(dos, getHeader().getT9()); dos.writeBytes("\n"); // 5 writeFmt(dos, getHeader().getF()); writeFmt(dos, getHeader().getResp0()); writeFmt(dos, getHeader().getResp1()); writeFmt(dos, getHeader().getResp2()); writeFmt(dos, getHeader().getResp3()); dos.writeBytes("\n"); // 6 writeFmt(dos, getHeader().getResp4()); writeFmt(dos, getHeader().getResp5()); writeFmt(dos, getHeader().getResp6()); writeFmt(dos, getHeader().getResp7()); writeFmt(dos, getHeader().getResp8()); dos.writeBytes("\n"); // 7 writeFmt(dos, getHeader().getResp9()); writeFmt(dos, getHeader().getStla()); writeFmt(dos, getHeader().getStlo()); writeFmt(dos, getHeader().getStel()); writeFmt(dos, getHeader().getStdp()); dos.writeBytes("\n"); // 8 writeFmt(dos, getHeader().getEvla()); writeFmt(dos, getHeader().getEvlo()); writeFmt(dos, getHeader().getEvel()); writeFmt(dos, getHeader().getEvdp()); writeFmt(dos, getHeader().getMag()); dos.writeBytes("\n"); // 9 writeFmt(dos, getHeader().getUser0()); writeFmt(dos, getHeader().getUser1()); writeFmt(dos, getHeader().getUser2()); writeFmt(dos, getHeader().getUser3()); writeFmt(dos, getHeader().getUser4()); dos.writeBytes("\n"); // 10 writeFmt(dos, getHeader().getUser5()); writeFmt(dos, getHeader().getUser6()); writeFmt(dos, getHeader().getUser7()); writeFmt(dos, getHeader().getUser8()); writeFmt(dos, getHeader().getUser9()); dos.writeBytes("\n"); // 11 writeFmt(dos, getHeader().getDist()); writeFmt(dos, getHeader().getAz()); writeFmt(dos, getHeader().getBaz()); writeFmt(dos, getHeader().getGcarc()); writeFmt(dos, getHeader().getSb()); dos.writeBytes("\n"); // 12 writeFmt(dos, getHeader().getSdelta()); writeFmt(dos, getHeader().getDepmen()); writeFmt(dos, getHeader().getCmpaz()); writeFmt(dos, getHeader().getCmpinc()); writeFmt(dos, getHeader().getXminimum()); dos.writeBytes("\n"); // 13 writeFmt(dos, getHeader().getXmaximum()); writeFmt(dos, getHeader().getYminimum()); writeFmt(dos, getHeader().getYmaximum()); writeFmt(dos, getHeader().getUnused6()); writeFmt(dos, getHeader().getUnused7()); dos.writeBytes("\n"); // 14 writeFmt(dos, getHeader().getUnused8()); writeFmt(dos, getHeader().getUnused9()); writeFmt(dos, getHeader().getUnused10()); writeFmt(dos, getHeader().getUnused11()); writeFmt(dos, getHeader().getUnused12()); dos.writeBytes("\n"); // 15 writeFmt(dos, getHeader().getNzyear()); writeFmt(dos, getHeader().getNzjday()); writeFmt(dos, getHeader().getNzhour()); writeFmt(dos, getHeader().getNzmin()); writeFmt(dos, getHeader().getNzsec()); dos.writeBytes("\n"); // 16 writeFmt(dos, getHeader().getNzmsec()); writeFmt(dos, getHeader().getNvhdr()); writeFmt(dos, getHeader().getNorid()); writeFmt(dos, getHeader().getNevid()); writeFmt(dos, getHeader().getNpts()); dos.writeBytes("\n"); // 17 writeFmt(dos, getHeader().getNsnpts()); writeFmt(dos, getHeader().getNwfid()); writeFmt(dos, getHeader().getNxsize()); writeFmt(dos, getHeader().getNysize()); writeFmt(dos, getHeader().getUnused15()); dos.writeBytes("\n"); // 18 writeFmt(dos, getHeader().getIftype()); writeFmt(dos, getHeader().getIdep()); writeFmt(dos, getHeader().getIztype()); writeFmt(dos, getHeader().getUnused16()); writeFmt(dos, getHeader().getIinst()); dos.writeBytes("\n"); // 19 writeFmt(dos, getHeader().getIstreg()); writeFmt(dos, getHeader().getIevreg()); writeFmt(dos, getHeader().getIevtyp()); writeFmt(dos, getHeader().getIqual()); writeFmt(dos, getHeader().getIsynth()); dos.writeBytes("\n"); // 20 writeFmt(dos, getHeader().getImagtyp()); writeFmt(dos, getHeader().getImagsrc()); writeFmt(dos, getHeader().getUnused19()); writeFmt(dos, getHeader().getUnused20()); writeFmt(dos, getHeader().getUnused21()); dos.writeBytes("\n"); // 21 writeFmt(dos, getHeader().getUnused22()); writeFmt(dos, getHeader().getUnused23()); writeFmt(dos, getHeader().getUnused24()); writeFmt(dos, getHeader().getUnused25()); writeFmt(dos, getHeader().getUnused26()); dos.writeBytes("\n"); // 22 writeFmt(dos, getHeader().getLeven()); writeFmt(dos, getHeader().getLpspol()); writeFmt(dos, getHeader().getLovrok()); writeFmt(dos, getHeader().getLcalda()); writeFmt(dos, getHeader().getUnused27()); dos.writeBytes("\n"); // 23 writeFmt(dos, getHeader().getKstnm(), 8); writeFmt(dos, getHeader().getKevnm(), 16); dos.writeBytes("\n"); // 24 writeFmt(dos, getHeader().getKhole(), 8); writeFmt(dos, getHeader().getKo(), 8); writeFmt(dos, getHeader().getKa(), 8); dos.writeBytes("\n"); // 25 writeFmt(dos, getHeader().getKt0(), 8); writeFmt(dos, getHeader().getKt1(), 8); writeFmt(dos, getHeader().getKt2(), 8); dos.writeBytes("\n"); // 26 writeFmt(dos, getHeader().getKt3(), 8); writeFmt(dos, getHeader().getKt4(), 8); writeFmt(dos, getHeader().getKt5(), 8); dos.writeBytes("\n"); // 27 writeFmt(dos, getHeader().getKt6(), 8); writeFmt(dos, getHeader().getKt7(), 8); writeFmt(dos, getHeader().getKt8(), 8); dos.writeBytes("\n"); // 28 writeFmt(dos, getHeader().getKt9(), 8); writeFmt(dos, getHeader().getKf(), 8); writeFmt(dos, getHeader().getKuser0(), 8); dos.writeBytes("\n"); // 29 writeFmt(dos, getHeader().getKuser1(), 8); writeFmt(dos, getHeader().getKuser2(), 8); writeFmt(dos, getHeader().getKcmpnm(), 8); dos.writeBytes("\n"); // 30 writeFmt(dos, getHeader().getKnetwk(), 8); writeFmt(dos, getHeader().getKdatrd(), 8); writeFmt(dos, getHeader().getKinst(), 8); dos.writeBytes("\n"); } public void writeData(DataOutputStream dos) throws IOException { for (int i = 0; i < getHeader().getNpts(); i++) { writeFmt(dos, getY()[i]); if (((i + 1) % 5 == 0) && (i != 0)) { dos.writeBytes("\n"); } } dos.writeBytes("\n"); if (getHeader().getLeven() == FALSE || getHeader().getIftype() == IRLIM || getHeader().getIftype() == IAMPH) { for (int i = 0; i < getHeader().getNpts(); i++) { writeFmt(dos, getX()[i]); if (((i + 1) % 5 == 0) && (i != 0)) { dos.writeBytes("\n"); } } } dos.writeBytes("\n"); } public static void writeFmt(DataOutputStream dos, float f) throws IOException { dos.writeBytes(String.format("%15.7G", f)); } public static void writeFmt(DataOutputStream dos, int i) throws IOException { dos.writeBytes(String.format("%10d", i)); } public static void writeFmt(DataOutputStream dos, String s, int length) throws IOException { String format = "%" + length + "s"; dos.writeBytes(String.format(format, s)); } public static SacTimeSeriesASCII getSAC(Channel channel, Date begin, float[]ydata) { SacTimeSeriesASCII sac = initSAC(channel, begin, ydata); sac.getHeader().setIftype(ITIME); sac.getHeader().setLeven(TRUE); return sac; } /*** * Creates a SacTimeSeries object from a LocalSeismogram. Headers in the SAC object are filled * in as much as possible, with the notable exception of event information and station location * and channel orientation. * * @return a <code>SacTimeSeries</code> with data and headers filled */ public static SacTimeSeriesASCII getSAC(Channel channel, Date begin, float[] xdata, float[]ydata){ SacTimeSeriesASCII sac = initSAC(channel, begin, ydata); sac.setX(xdata); sac.getHeader().setB(xdata[0]); sac.getHeader().setE(xdata[xdata.length-1]); sac.getHeader().setIftype(IXY); sac.getHeader().setLeven(FALSE); return sac; } private static SacTimeSeriesASCII initSAC(Channel channel, Date begin, float[] ydata){ SacHeader sac = new SacHeader(); float max = Float.MIN_VALUE; float min = Float.MAX_VALUE; float sum = 0.0f; for(float y: ydata){ if (y> max) max=y; if (y<min) min = y; sum +=y; } sac.setNpts(ydata.length); float f = new Double(channel.getSampleRate()).floatValue()/1000.0f; sac.setB(0); sac.setE(sac.getNpts() * f); sac.setDelta(f); sac.setIdep(IUNKN); sac.setDepmin(min); sac.setDepmax(max); sac.setDepmen(sum/ydata.length); GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); cal.setTime(begin); sac.setNzyear(cal.get(Calendar.YEAR)); sac.setNzjday(cal.get(Calendar.DAY_OF_YEAR)); sac.setNzhour(cal.get(Calendar.HOUR_OF_DAY)); sac.setNzmin(cal.get(Calendar.MINUTE)); sac.setNzsec(cal.get(Calendar.SECOND)); sac.setNzmsec(cal.get(Calendar.MILLISECOND)); sac.setKnetwk(channel.getNetworkName()); sac.setKstnm(channel.getStation().getName()); sac.setKcmpnm(channel.getChannelName()); sac.setKhole(channel.getLocationName()); sac.setKinst(channel.getLocationName()); return new SacTimeSeriesASCII(sac, ydata); } }