package com.isti.traceview.data; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.text.ParseException; import java.util.HashSet; import java.util.Set; import org.apache.log4j.Logger; import com.isti.traceview.data.ims.BlockSet; import com.isti.traceview.data.ims.DAT2; import com.isti.traceview.data.ims.DataType; import com.isti.traceview.data.ims.DataTypeWaveform; import com.isti.traceview.data.ims.IMSFile; import com.isti.traceview.data.ims.IMSFormatException; import com.isti.traceview.data.ims.STA2; import com.isti.traceview.data.ims.WID2; import gov.usgs.anss.cd11.CanadaException; public class SourceFileIMS extends SourceFile { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(SourceFileIMS.class); public SourceFileIMS(File file) { super(file); logger.debug("Created: " + this); } @Override public Set<RawDataProvider> parse(DataModule dataModule) { Set<RawDataProvider> ret = new HashSet<RawDataProvider>(); BufferedRandomAccessFile dis = null; try { dis = new BufferedRandomAccessFile(getFile().getCanonicalPath(), "r"); dis.order(BufferedRandomAccessFile.BIG_ENDIAN); if (getFile().length() > 0) { //long currentOffset = dis.getFilePointer(); IMSFile ims = IMSFile.read(dis, true); for (DataType dataType : ims.getDataTypes()) { if (dataType instanceof DataTypeWaveform) { DataTypeWaveform dtw = (DataTypeWaveform) dataType; for (BlockSet bs : dtw.getBlockSets()) { RawDataProvider channel = dataModule.getOrAddChannel(bs.getWID2().getChannel(), DataModule.getOrAddStation(bs.getWID2().getStation()), "", ""); ret.add(channel); Segment segment = new Segment(this, bs.getStartOffset(), bs.getWID2().getStart(), 1000.0/bs.getWID2().getSampleRate(), bs.getWID2().getNumSamples(), 0); channel.addSegment(segment); } } } } else { logger.error("File " + getFile().getCanonicalPath() + " has null length"); } } catch (FileNotFoundException e) { logger.error("File not found: ", e); } catch (IOException e) { logger.error("IO error: ", e); } catch (IMSFormatException e) { logger.error("Wrong IMS file format: ", e); } catch (ParseException e) { logger.error("Parsing problems: ", e); } catch (CanadaException e) { logger.error("Canada decompression problems: ", e); } finally { try { dis.close(); } catch (IOException e) { logger.error("IOException:", e); } } return ret; } public void load(Segment segment) { //int[] data = null; BufferedRandomAccessFile dis = null; try { dis = new BufferedRandomAccessFile(getFile().getCanonicalPath(), "r"); dis.order(BufferedRandomAccessFile.BIG_ENDIAN); if (getFile().length() > 0) { dis.seek(segment.getStartOffset()); WID2 wid2 = new WID2(segment.getStartOffset()); wid2.read(dis); STA2 sta2 = new STA2(dis.getFilePointer()); sta2.read(dis); DAT2 dat2 = new DAT2(dis.getFilePointer(), wid2); dat2.read(dis); for (int value : dat2.getData()) { segment.addDataPoint(value); } } else { logger.error("File " + getFile().getCanonicalPath() + " has null length"); } } catch (FileNotFoundException e) { logger.error("File not found: ", e); } catch (IOException e) { logger.error("IO error: ", e); } catch (IMSFormatException e) { logger.error("Wrong IMS file format: ", e); } catch (ParseException e) { logger.error("Parsing problems: ", e); } catch (CanadaException e) { logger.error("Canada decompression problems: ", e); } finally { try { dis.close(); } catch (IOException e) { logger.error("IOException:", e); } } } @Override public FormatType getFormatType() { return FormatType.IMS; } }