package com.isti.traceview.data; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import org.apache.log4j.Logger; import edu.sc.seis.seisFile.segd.ChannelSet; import edu.sc.seis.seisFile.segd.ScanType; import edu.sc.seis.seisFile.segd.SegdRecord; import edu.sc.seis.seisFile.segd.Trace; public class SourceFileSEGD extends SourceFile implements Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(SourceFileSEGD.class); private final int NORM_AMPLITUDE =100000; public SourceFileSEGD(File file) { super(file); logger.info("Created: " + this); } @Override public FormatType getFormatType() { return FormatType.SEGD; } @Override public Set<RawDataProvider> parse(DataModule dataModule) { Set<RawDataProvider> ret = new HashSet<RawDataProvider>(); try { SegdRecord segd = new SegdRecord(getFile()); segd.readHeaders(); for(ScanType st: segd.getScanTypes()){ for(ChannelSet cs:st.getChannelSets()){ for(Trace trace: cs.getTraces()){ RawDataProvider channel = dataModule.getOrAddChannel("Z", //Channel DataModule.getOrAddStation(new Double(trace.getReceiverLineNumber()).toString()), //Station ID new Integer(segd.getManufacturerCode()).toString(), //Network ID new Double(trace.getReceiverPointNumber()).toString()); //Location ret.add(channel); Segment segment = new Segment(this, trace.getDataOffset(), trace.getTimeRange().getStartTime(), segd.getBaseScanInterval(), trace.getSamplesNumber(), 0); channel.addSegment(segment); } } } } catch (IOException e) { logger.error("IO error: ", e); } return ret; } @Override public void load(Segment segment) { logger.info("Loading: " + this); int[] data = null; try { float[] traceData = Trace.getData(getFile(), segment.getStartOffset(), segment.getSampleCount()); float maxDataValue = Float.MIN_VALUE; float minDataValue = Float.MAX_VALUE; for(float val:traceData){ if(val>maxDataValue){ maxDataValue = val; } if(val<minDataValue){ minDataValue = val; } } double normCoeff = NORM_AMPLITUDE/(maxDataValue - minDataValue); data = new int[traceData.length]; int i = 0; for (float val: traceData) { data[i++]=new Double(normCoeff*val).intValue(); } } catch (IOException e) { logger.error("IOException:", e); //throw new RuntimeException(e); System.exit(0); } for (int value: data) { segment.addDataPoint(value); } } public String toString() { return "SourceFileSEGD: file " + (getFile() == null ? "absent" : getFile().getName()) + ";"; } }