/* * @seisReadMSeed.java Version 1.1 03/03/2015 * * Copyright (c) 2015 Kansas Geological Survey * 1930 Constant Avenue, Lawrence, Kansas, 66047, U.S.A. * All Rights Reserved. */ package seismic.io; import java.io.BufferedInputStream; import java.io.DataInput; import java.io.DataInputStream; import java.io.EOFException; import java.io.FileInputStream; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import java.io.*; import java.net.*; import java.lang.*; import java.text.*; import java.util.*; import java.awt.*; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; import edu.iris.dmc.timeseries.model.Util; import edu.iris.dmc.seedcodec.Codec; import edu.iris.dmc.seedcodec.CodecException; import edu.iris.dmc.seedcodec.DecompressedData; import edu.iris.dmc.seedcodec.UnsupportedCompressionType; import edu.sc.seis.seisFile.mseed.Blockette; import edu.sc.seis.seisFile.mseed.Blockette100; import edu.sc.seis.seisFile.mseed.Blockette1000; import edu.sc.seis.seisFile.mseed.Btime; import edu.sc.seis.seisFile.mseed.DataRecord; import edu.sc.seis.seisFile.mseed.SeedFormatException; import edu.sc.seis.seisFile.mseed.SeedRecord; import seismic.seisStruct; // Seismic Data Structure /** Class seisReadMSeed *
This Class is designed to open a miniSeed File read & parse * the contents into a seismic data structure. This class uses * software provided by the IRIS (Incorporated Research Institutions * for Seismology). * * @version 1.1 03/03/2015 * @author John R. Victorine */ public class seisReadMSeed { private seisStruct st = null; // Seismic Data Structure /** Constructor seisReadMSeed() *
This is the Constructor for this class. */ public seisReadMSeed() {} /** Method delete() *
This method will set all the global variables to null to force * java to free the allocated memory */ public void delete() { // Global Variables if (st != null); st.delete(); st = null; } /* ====================================================================== * * --------------------- OPEN & CLOSE FILE METHODS ---------------------- * * ====================================================================== */ /** Method Open() *
This class will open the miniseed file. * @param directory = File URL or Directory Path * @param filename = File Name */ public void Open( String directory, String filename ) { if (filename.length() > 0) { String sFile = new String(directory + "/" + filename); try { read(sFile); } catch(Exception e) { e.printStackTrace(); } } } /** Method Open() *
This class will open the miniseed file. * @param sFile = Complete Path to miniseed file */ public void Open( String sFile ) { if (sFile !=null) { try { read(sFile); } catch(Exception e) { e.printStackTrace(); } } } /** Method OpenURL() *
This class will open the miniseed file. * @param sFile = Complete Path to miniseed file */ public void OpenURL( String sFile ) { if (sFile !=null) { try { readURL(sFile); } catch(Exception e) { e.printStackTrace(); } } } /** Method Close() *
This method closes the File. */ public void Close() { delete(); } /* ====================================================================== * * ------------------ IRIS MINISEED READ FILE METHODS ------------------- * * ====================================================================== */ /** Method readURL() *
This method will read the miniseed file
* @param filename = string with the directory and filename appended.
*/
public void readURL(String filename) throws IOException, SeedFormatException
{
int iNew = 0;
int numPts = 0;
URL url = new URL(filename);
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
DataInput dis = new DataInputStream(new BufferedInputStream(uc.getInputStream()));
List This method will read the miniseed file
* @param filename = string with the directory and filename appended.
*/
public void read(String filename) throws IOException, SeedFormatException
{
int iNew = 0;
int numPts = 0;
DataInput dis = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
List This method will count the number of records.
*/
private void Count( List This method will parse the Dat Record
* @param record = Data Record
*/
public int process(int numPts, DataRecord record)
throws UnsupportedCompressionType,
CodecException,
SeedFormatException
{
if (record != null || record.getData() != null)
{
int format = -1;
Blockette1000 b1000 = (Blockette1000) record.getUniqueBlockette(1000);
format = b1000.getEncodingFormat();
byte[] data = record.getData();
Codec codec = new Codec();
float sampleRate = record.getHeader().getSampleRate();
int numberOfSamples = record.getHeader().getNumSamples();
Timestamp startTimestamp = null;
Blockette[] bs = record.getBlockettes(100);
if (bs != null && bs.length > 0)
{
Blockette100 b100 = (Blockette100) bs[0];
sampleRate = b100.getActualSampleRate();
}
DecompressedData dData = codec.decompress(format, data, numberOfSamples, false);
boolean addNewSegment = true;
double durationinInSeconds = ((numberOfSamples - 1) / (double) sampleRate);
SimpleDateFormat dfm = new SimpleDateFormat("yyyy,D,HH:mm:ss.SSSSSS");
dfm.setTimeZone(TimeZone.getTimeZone("CST"));
try
{
long qu = dfm.parse(record.getHeader().getStartTime()).getTime();
startTimestamp = new Timestamp(qu);
}
catch (ParseException e)
{
e.printStackTrace();
}
Timestamp endTime = startTimestamp;
endTime = Util.addSeconds(endTime, durationinInSeconds);
numPts = getData( numPts, startTimestamp, endTime,
dData, sampleRate, numberOfSamples );
}
return (numPts);
}
/** Method getData()
* This method will write the Time, value pair to CSV File.
* @param time = Start Timestep
* @param endTime = End Timestep
* @param data = the Decompressed Data
* @param sampleRate = Sample Rate
* @param numberOfSamples = Number of Samples
* @param index = NOT USED
*/
public int getData( int numPts, Timestamp time, Timestamp endTime,
DecompressedData data,
float sampleRate, int numberOfSamples )
{
int j = numPts;
float samplerate; // Nominal sample rate (Hz)
double[] fdata = new double[numberOfSamples];
Timestamp expectedNextSampleTime;
int sampleCount = 0; // Number of samples in trace segment
long durationInMiliSecond = (long) ((numberOfSamples - 1) / sampleRate) * 1000;
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time.getTime() + durationInMiliSecond);
double d = (numberOfSamples / sampleRate) * 1000;
cal.setTimeInMillis(time.getTime() + (long) d);
Timestamp expectedTime = new Timestamp(cal.getTimeInMillis());
expectedNextSampleTime = expectedTime;
fdata = data.getAsDouble();
long lstart = time.getTime();
long lend = endTime.getTime();
long diff = lend-lstart;
double del = ((double) diff)/(numberOfSamples-1);
for (int i=0; i This method will return the seismic Data Structure
* @return st = seismic data structure
*/
public seisStruct getData() { return (st); }
}
/*
* @version 1.1 03/03/2015
* @author John Victorine
*/