⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waveclient.java

📁 一个用java写的地震分析软件(无源码)-used to write a seismic analysis software (without source)
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
    }

/** 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 + -