📄 waveclient.java
字号:
}
/** Processes a "getChannels" request message type.
* Returns TN_SUCCESS if the server response provided data, else returns an error code.
*/
private int doGetChannels(TCPConnClient conn, Collection channelList) {
// Prepare the request parameters
TrinetSerial [] fields = new TrinetSerial[0];
int retVal = TN_FAILURE;
try {
// Check validity of message and get its content: either error code or data
TCPMessage responseMessage = processMessage(conn, TN_TCP_GETCHAN_REQ, fields);
switch (responseMessage.getMessageType()) {
case TN_TCP_ERROR_RESP:
retVal = responseMessage.nextFieldValueAsInt();
if (retVal == TN_FAILURE) retVal = TN_NODATA; // TEMPORARY PATCH UNTIL DWS CODES FIXED
break;
case TN_TCP_GETCHAN_RESP:
int numberOfChannels = responseMessage.nextFieldValueAsInt();
for (; numberOfChannels > 0; numberOfChannels--) {
channelList.add(new Channel(responseMessage.nextFieldValueAsBytes()));
}
retVal = TN_SUCCESS;
break;
default:
System.err.println("Error WaveClient.doGetChannels() Unrecognized response message");
}
}
catch (WaveClientException ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (IOException ex) {
System.err.println("Error WaveClient.doGetChannels() Failure parsing response message");
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (Exception ex) {
System.err.println("Error WaveClient.doGetChannels() caught exception.");
ex.printStackTrace();
}
return retVal;
}
/** Processes a "getTimes" request message type.
* Returns TN_SUCCESS if the server response provided data, else returns an error code.
*/
private int doGetTimes(TCPConnClient conn, Channel chan, Collection timeWindowList) {
// Prepare the request parameters
TrinetSerial [] fields = new TrinetSerial[1];
fields[0] = chan;
int retVal = TN_FAILURE;
try {
// Check validity of message and get its content: either error code or data
TCPMessage responseMessage = processMessage(conn, TN_TCP_GETTIMES_REQ, fields);
switch (responseMessage.getMessageType()) {
case TN_TCP_ERROR_RESP:
retVal = responseMessage.nextFieldValueAsInt();
if (retVal == TN_FAILURE) retVal = TN_NODATA; // TEMPORARY PATCH UNTIL DWS CODES FIXED
break;
case TN_TCP_GETTIMES_RESP:
int numberOfWindows = responseMessage.nextFieldValueAsInt();
try {
for (; numberOfWindows > 0; numberOfWindows--) {
timeWindowList.add(new TimeWindow(responseMessage.nextFieldValueAsBytes()));
}
retVal = TN_SUCCESS;
}
catch (IllegalArgumentException ex) {
System.err.println("WaveClient.doGetTimes(): " + ex.toString());
retVal = TN_FAILURE;
}
break;
default:
System.err.println("Error WaveClient.doGetTimes() Unrecognized response message");
}
}
catch (WaveClientException ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (IOException ex) {
System.err.println("Error WaveClient.doGetTimes() Failure parsing response message");
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (Exception ex) {
System.err.println("Error WaveClient.doGetTimes() caught exception.");
ex.printStackTrace();
}
return retVal;
}
/** Checks the input TimeWindow collection for temporal integrity.
* @return false found an invalid TimeWindow
*/
static boolean verifyTimeWindows(Collection timeWindowList) {
boolean retVal = true;
Iterator iter = timeWindowList.iterator();
int offset = 0;
while(iter.hasNext()) {
TimeWindow timeWindow = (TimeWindow) iter.next();
if (! timeWindow.isValid() ) {
retVal = false;
System.err.println("Warning WaveClient.verifyTimeWindows() Invalid time window detected at offset: " + offset);
System.err.println(timeWindow.toString());
break;
}
offset++;
}
return retVal;
}
/** Error threshold seconds allowed between contiguous time series samples. */
static double getEpsilon(double sampleRate) {
return (1 + Waveform.TIME_EPSILON)/sampleRate;
}
/** Merges contiguous TimeWindow data found in the input collection thereby reducing the total number of elements
* used to generate any data requests using this collection.
* Returns the revised collection.
*/
static Collection mergeTimeWindows(Collection timeWindowList, double sampleRate) {
if (timeWindowList.isEmpty()) return timeWindowList;
TreeSet timeWindowSet = new TreeSet(timeWindowList);
Iterator iter = timeWindowSet.iterator();
Outer:
while (iter.hasNext()) { // iterate over window set
TimeWindow timeWindow = (TimeWindow) iter.next(); // get first time window
Inner:
while (iter.hasNext()) { // look for another window, else done.
TimeWindow timeWindowNext = (TimeWindow) iter.next(); // get next time window for comparison
if (timeWindowNext.after(timeWindow)) { // next window temporally follows previous
if (timeWindow.timeGapSeconds(timeWindowNext) < getEpsilon(sampleRate)) { // small gap between
((SimpleTimeRange) timeWindow.getTimeRange()).endTimestamp =
timeWindowNext.getEndTimestamp();// merge next time window into current
iter.remove(); // delete next window
continue Inner; // loop for next window in set
}
else continue Outer; // large gap keep both windows, get next pair
}
else { // Time windows overlap.
Date endTimeNext = timeWindowNext.getEndTimestamp();
if (endTimeNext.after(timeWindow.getEndTimestamp())){ // Partial overlap between windows
((SimpleTimeRange) timeWindow.getTimeRange()).endTimestamp = endTimeNext; // merge next into current window
}
iter.remove(); // delete next, complete or partial overlap
continue Inner; // loop for next window in set
}
}
break Outer; // no more windows in set
}
// Clear out original collection and reload with new set contents
timeWindowList.clear();
iter = timeWindowSet.iterator();
while (iter.hasNext()) {
timeWindowList.add(iter.next());
}
return timeWindowList; // revised collection
}
/** Returns the time gap seconds found between the dataSegmentNext start time and the dataSegmentLast end time.*/
static double timeGapSeconds(DataSegment dataSegmentLast, DataSegment dataSegmentNext, double sampleRate) {
return dataSegmentNext.getStartTimeSecs() - dataSegmentLast.getStartTimeSecs()
- (double) (dataSegmentLast.numberOfSamples - 1)/sampleRate;
}
/** Returns the time gap seconds found between the input TimeWindow and the DataSegment start times.*/
static double timeGapSeconds(TimeWindow timeWindow, DataSegment dataSegment) {
return (double) ( dataSegment.startTimestamp.getTime() - timeWindow.getStartTimestamp().getTime() ) / 1000. ;
}
/** Returns the time of the last sample in the input DataSegment.*/
static Date endTime(DataSegment dataSegment, double sampleRate) {
return new Date( dataSegment.startTimestamp.getTime() +
Math.round( 1000. * (double)(dataSegment.numberOfSamples - 1) / sampleRate ) );
}
/** Checks the time spane of the input data collection, presumably returned by a server response message,
* against that of the input TimeWindow, presumably the requested time range.
* Returns true if the data times span a range equal to or greater than that of the TimeWindow.
*/
static boolean haveRequestedData(TimeWindow timeWindow, Collection dataSegmentList, double sampleRate) {
if (dataSegmentList.isEmpty()) return false;
// Check for time tear between request window start and first data segment start
Iterator iter = dataSegmentList.iterator();
DataSegment dataSegment = (DataSegment) iter.next();
if (dataSegment.startTimestamp.after(timeWindow.getStartTimestamp())) {
if (timeGapSeconds(timeWindow, dataSegment) > getEpsilon(sampleRate)) {
return false; // need more data at begining of window
}
}
// Check for time tear between elements in the data segment list
while (iter.hasNext()) {
DataSegment dataSegmentNext = (DataSegment) iter.next();
if( timeGapSeconds(dataSegment, dataSegmentNext, sampleRate) > getEpsilon(sampleRate) ) return false; // have time tear
dataSegment = dataSegmentNext;
}
// Check for time tear between requested window end time and last data segment end time
Date dataSegmentEndTimestamp = endTime(dataSegment, sampleRate);
return (timeWindow.timeGapSeconds(dataSegmentEndTimestamp) > getEpsilon(sampleRate) ) ? true : false; // need data at end
}
/** Returns a collection of minSEED packets, if any, for the specified input channel descriptors, starting time, and duration.
* Data returned by the server response is truncated at the first time gap if isTruncateAtTimeGap() == true.
* @exception java.lang.IllegalArgumentException Valid Channel/TimeWindow cannot be constructed from the input parameters.
* @exception WaveClientException error occurred during packet processing.
*/
public List getPacketData(String net, String sta, String chn, Date beginTimestamp, int durationSeconds)
throws WaveClientException {
Channel chan = null;
try {
chan = new Channel(net, sta, chn);
}
catch (IllegalArgumentException ex) {
System.err.println("WaveClient.getPacketData(): " + ex.getMessage());
ex.fillInStackTrace();
throw ex;
}
TimeWindow timeWindow = null;
try {
timeWindow = new TimeWindow( beginTimestamp, new Date( beginTimestamp.getTime() + (durationSeconds * 1000) ) );
}
catch (IllegalArgumentException ex) {
System.err.println("WaveClient.getPacketData(): " + ex.getMessage());
ex.fillInStackTrace();
throw ex;
}
return getPacketData(chan, timeWindow);
}
/** Returns a collection of miniSEED packets, if any, for the specified input Channel and TimeWindow data.
* Data returned by the server response is truncated at the first time gap if isTruncateAtTimeGap() == true.
* Returns null if no data was found..
* <b>By default data packet headers are checked for data consistency, for faster response disable verification.</b>
* @see #setWaveformVerify(boolean)
* @see #isVerifyWaveforms()
* @see #getData(Channel, TimeWindow, Waveform)
* @exception java.lang.NullPointerException null input parameter
* @exception WaveClientException error occurred during processing of packet data.
*/
public List getPacketData(Channel chan, TimeWindow timeWindow) throws WaveClientException {
if (chan == null)
throw new NullPointerException("WaveClient.getPacketData(Channel, TimeWindow) null Channel input parameter");
if (timeWindow == null)
throw new NullPointerException("WaveClient.getPacketData(Channel, TimeWindow) null TimeWindow input parameter");
Waveform wave = new Waveform();
int status = getData(chan, timeWindow, wave);
if (status < TN_SUCCESS) {
if(status == TN_NODATA) return null;
else throw new WaveClientException("getPacketData() getData() error code: " + getStatusMessage(status));
}
return wave.getMiniSEEDPackets();
}
/** Retrieves from the server hosts the time-series data for the channel and time specified in the input Waveform instance.
* A WFSegment collection constructed from the retrieved MiniSEED packet data is assigned to the input wavefrom object.
* Time-series data returned is truncated at the first time gap if isTruncateAtTimeGap() == true.
* Returns TN_SUCCESS if data was found, else TN_NODATA or other TRINET error code.
* <b>By default data packet headers are checked for data consistency, for faster response disable verification.</b>
* @see #getJasiWaveformDataSeries(org.trinet.jasi.Waveform jasiWaveform)
* @see #setWaveformVerify(boolean)
* @see #isVerifyWaveforms()
* @see #getData(Channel, TimeWindow, Waveform)
* @see org.trinet.jasi.seed.SeedReader#getWFSegments(Collection)
* @exception java.lang.NullPointerException input Waveform null or has null data member
* @exception java.lang.IllegalArgumentException input Waveform channel or time data violate constraints
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -