/** * Returns for the given stream ID the corresponding WaveformStreamID object. * * @param: streamID, a string specifying the <network>.<station>.<location>.<channel> * @return: a WaveformStreamID object **/ DataModel::WaveformStreamID getWaveformID(const std::string &streamID) { std::string s = streamID; std::string::size_type dot; DataModel::WaveformStreamID waveformID; if((dot = s.find('.')) != std::string::npos) { waveformID.setNetworkCode(std::string(s, 0, dot)); s = std::string(s, dot + 1, std::string::npos); if((dot = s.find('.')) != std::string::npos) { waveformID.setStationCode(std::string(s, 0, dot)); s = std::string(s, dot + 1, std::string::npos); if((dot = s.find('.')) != std::string::npos) { waveformID.setLocationCode(std::string(s, 0, dot)); waveformID.setChannelCode(std::string(s, dot + 1, std::string::npos)); } } } return waveformID; }
bool CalculateAmplitudes::process() { //_ui.btnOK->setEnabled(false); _processors.clear(); _ui.table->setRowCount(0); Core::TimeWindow acTimeWindow; if ( !_origin || (_recomputeAmplitudes && !_thread) ) return false; if ( _amplitudeTypes.empty() ) return false; _timeWindow = Core::TimeWindow(); /* TypeSet wantedAmpTypes; wantedAmpTypes.insert("MLv"); wantedAmpTypes.insert("mb"); wantedAmpTypes.insert("mB"); wantedAmpTypes.insert("Mwp"); try { vector<string> amps = SCApp->configGetStrings("amplitudes"); wantedAmpTypes.clear(); wantedAmpTypes.insert(amps.begin(), amps.end()); } catch (...) {} */ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); if ( _thread ) _thread->connect(); typedef pair<PickCPtr, double> PickStreamEntry; // Typedef a pickmap that maps a streamcode to a pick typedef map<string, PickStreamEntry> PickStreamMap; // This map is needed to find the earliest P pick of // a certain stream PickStreamMap pickStreamMap; for ( size_t i = 0; i < _origin->arrivalCount(); ++i ) { Arrival *ar = _origin->arrival(i); double weight = 1.; try { weight = ar->weight(); } catch (Seiscomp::Core::ValueException) {} if ( Util::getShortPhaseName(ar->phase().code()) != 'P' || weight < 0.5 ) { continue; } Pick *pick = Pick::Find(ar->pickID()); if ( !pick ) { // cerr << " - Skipping arrival " << i << " -> no pick found" << endl; continue; } double dist = -1; try { dist = ar->distance(); } catch ( Core::ValueError &e ) { try { Client::StationLocation loc; double azi1, azi2; loc = Client::Inventory::Instance()->stationLocation(pick->waveformID().networkCode(), pick->waveformID().stationCode(), pick->time().value()); Math::Geo::delazi(loc.latitude, loc.longitude, _origin->latitude(), _origin->longitude(), &dist, &azi1, &azi2); } catch ( Core::GeneralException &e ) {} } DataModel::WaveformStreamID wfid = pick->waveformID(); // Strip the component code because every AmplitudeProcessor // will use its own component to pick the amplitude on wfid.setChannelCode(wfid.channelCode().substr(0,2)); string streamID = waveformIDToStdString(wfid); PickStreamEntry &e = pickStreamMap[streamID]; // When there is already a pick registered for this stream which has // been picked earlier, ignore the current pick if ( e.first && e.first->time().value() < pick->time().value() ) continue; e.first = pick; e.second = dist; } for ( PickStreamMap::iterator it = pickStreamMap.begin(); it != pickStreamMap.end(); ++it ) { PickCPtr pick = it->second.first; double dist = it->second.second; _ui.comboFilterType->clear(); _ui.comboFilterType->addItem("- Any -"); for ( TypeSet::iterator ita = _amplitudeTypes.begin(); ita != _amplitudeTypes.end(); ++ita ) _ui.comboFilterType->addItem(ita->c_str()); if ( _recomputeAmplitudes ) { for ( TypeSet::iterator ita = _amplitudeTypes.begin(); ita != _amplitudeTypes.end(); ++ita ) addProcessor(*ita, pick.get(), dist); } else { string streamID = waveformIDToStdString(pick->waveformID()); TypeSet usedTypes; if ( !_amplitudes.empty() ) { iterator_range itp; itp = _amplitudes.equal_range(pick->publicID()); for ( iterator it = itp.first; it != itp.second; ) { AmplitudePtr amp = it->second.first; // The amplitude type is not one of the wanted types if ( _amplitudeTypes.find(amp->type()) == _amplitudeTypes.end() ) { ++it; continue; } // Already has an amplitude of this type processed if ( usedTypes.find(amp->type()) != usedTypes.end() ) { ++it; continue; } usedTypes.insert(amp->type()); int row = addProcessingRow(waveformIDToStdString(amp->waveformID()), amp->type()); setMessage(row, "read from cache"); setValue(row, amp->amplitude().value()); ++it; } } bool foundAmplitudes = false; if ( _externalAmplitudeCache ) { iterator_range itp; itp = _externalAmplitudeCache->equal_range(pick->publicID()); for ( iterator ita = itp.first; ita != itp.second; ++ita ) { AmplitudePtr amp = ita->second.first; // The amplitude type is not one of the wanted types if ( _amplitudeTypes.find(amp->type()) == _amplitudeTypes.end() ) continue; // Already has an amplitude of this type processed if ( usedTypes.find(amp->type()) != usedTypes.end() ) { checkPriority(ita->second); continue; } usedTypes.insert(amp->type()); int row = addProcessingRow(waveformIDToStdString(amp->waveformID()), amp->type()); setMessage(row, "read from cache"); setValue(row, amp->amplitude().value()); _amplitudes.insert(PickAmplitudeMap::value_type(ita->first, ita->second)); } } if ( _query && !foundAmplitudes ) { DatabaseIterator it = _query->getAmplitudesForPick(pick->publicID()); for ( ; *it; ++it ) { AmplitudePtr amp = Amplitude::Cast(*it); if ( !amp ) continue; foundAmplitudes = true; // The amplitude type is not one of the wanted types if ( _amplitudeTypes.find(amp->type()) == _amplitudeTypes.end() ) continue; // Already has an amplitude of this type processed if ( usedTypes.find(amp->type()) != usedTypes.end() ) { checkPriority(AmplitudeEntry(amp, false)); continue; } usedTypes.insert(amp->type()); int row = addProcessingRow(waveformIDToStdString(amp->waveformID()), amp->type()); setMessage(row, "read from database"); setValue(row, amp->amplitude().value()); _amplitudes.insert(PickAmplitudeMap::value_type(pick->publicID(), AmplitudeEntry(amp, false))); } } if ( !foundAmplitudes ) { EventParameters *ep = EventParameters::Cast(PublicObject::Find("EventParameters")); if ( ep ) { for ( size_t i = 0; i < ep->amplitudeCount(); ++i ) { Amplitude *amp = ep->amplitude(i); if ( amp->pickID() != pick->publicID() ) continue; // The amplitude type is not one of the wanted types if ( _amplitudeTypes.find(amp->type()) == _amplitudeTypes.end() ) continue; // Already has an amplitude of this type processed if ( usedTypes.find(amp->type()) != usedTypes.end() ) { checkPriority(AmplitudeEntry(amp, false)); continue; } usedTypes.insert(amp->type()); int row = addProcessingRow(waveformIDToStdString(amp->waveformID()), amp->type()); setMessage(row, "read from memory"); setValue(row, amp->amplitude().value()); _amplitudes.insert(PickAmplitudeMap::value_type(pick->publicID(), AmplitudeEntry(amp, false))); } } } TypeSet remainingTypes; set_difference(_amplitudeTypes.begin(), _amplitudeTypes.end(), usedTypes.begin(), usedTypes.end(), inserter(remainingTypes, remainingTypes.begin())); for ( TypeSet::iterator ita = remainingTypes.begin(); ita != remainingTypes.end(); ++ita ) { if ( _thread ) addProcessor(*ita, pick.get(), dist); else { int row = addProcessingRow(streamID, *ita); setError(row, "missing"); } } } } _ui.table->resizeColumnsToContents(); _ui.table->resizeRowsToContents(); if ( _thread && _timeWindow ) { _thread->setTimeWindow(_timeWindow); _thread->start(); } //else // _ui.btnOK->setEnabled(true); QApplication::restoreOverrideCursor(); return true; }