// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> void Picker::process(const Record *record, const DoubleArray &) { // Sampling frequency has not been set yet if ( _stream.fsamp == 0.0 ) { terminate(); return; } // Error occured while feeding a record or already finished? if ( isFinished() ) return; // Process unless the available time window does not include the // requested time window if ( !dataTimeWindow().contains(timeWindow())) return; // data window relative to continuous()->startTime() double relTriggerTime = _trigger - dataTimeWindow().startTime(); double dt1 = relTriggerTime + _config.signalBegin; double dt2 = relTriggerTime + _config.signalEnd; double snr = -1; // Calculate data array indicies of requested time window int i1 = int(dt1*_stream.fsamp); int i2 = int(dt2*_stream.fsamp); // Calculate the initial trigger time int triggerIdx = relTriggerTime*_stream.fsamp; int lowerUncertainty = -1; int upperUncertainty = -1; OPT(Polarity) polarity; if ( !calculatePick(continuousData().size(), continuousData().typedData(), i1, i2, triggerIdx, lowerUncertainty, upperUncertainty, snr, polarity) ) { setStatus(Error, 0.0); return; } Core::Time pickTime = dataTimeWindow().startTime() + Core::TimeSpan(triggerIdx/_stream.fsamp); // Debug: print the time difference between the pick and the initial trigger SEISCOMP_DEBUG("Picker::process repick result: dt=%.3f snr=%.2f", (double)(pickTime - _trigger), snr); if ( snr >= _config.snrMin ) { setStatus(Finished, 100.); Result res; res.record = record; res.snr = snr; res.time = pickTime; res.timeLowerUncertainty = (double)lowerUncertainty / _stream.fsamp; res.timeUpperUncertainty = (double)upperUncertainty / _stream.fsamp; res.timeWindowBegin = (double)(timeWindow().startTime() - pickTime); res.timeWindowEnd = (double)(timeWindow().endTime() - pickTime); res.polarity = polarity; emitPick(res); } else setStatus(LowSNR, snr); }
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> void Picker::writeData() { if ( !_stream.lastRecord ) return; std::ofstream of((_stream.lastRecord->streamID() + "-postpick.data").c_str()); of << "#sampleRate: " << _stream.lastRecord->samplingFrequency() << std::endl; for ( int i = 0; i < continuousData().size(); ++i ) of << i << "\t" << continuousData()[i] << std::endl; of.close(); }
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> const DoubleArray *AmplitudeProcessor::processedData(Component comp) const { if ( comp < VerticalComponent || comp > SecondHorizontalComponent ) return NULL; if ( comp != (Component)_usedComponent ) return NULL; return &continuousData(); }