#include <ToolFK.h>
Public Slots | |
| virtual void | start () |
| void | stop () |
| virtual void | test () |
Public Member Functions | |
| virtual bool | initStations (SubSignalPool *subPool) |
| virtual void | setParameters (int &argc, char **argv) |
| ToolFK (QWidget *parent) | |
| virtual void | waitFinished () |
| ~ToolFK () | |
Protected Slots | |
| void | finish () |
| void | gridChanged () |
| void | kmaxChanged () |
| void | parametersChanged () |
| void | setComputedKmax () |
| void | setTemporaryKmax () |
Protected Member Functions | |
| bool | checkParameters (FKParameters *param) const |
| virtual AbstractParameters * | parameters (AbstractParameters *param=0) const |
| void | setDefaultGridParameters () |
| virtual void | setDefaultGridSize (double kmax) |
| virtual void | setDefaultGridStep (double kmin) |
| virtual void | setParameters (const AbstractParameters *param) |
| void | startLoop (FKLoop *loop, FKParameters *param, const QString &message=QString::null) |
| virtual const char * | toolName () |
| virtual void | updateAllFields () |
Protected Attributes | |
| QTime | _chrono |
| ToolFKd * | _d |
| bool | _exportAllFKGrids |
| KmaxSolver * | _kmaxSolver |
| QTimer | _kmaxTimer |
| bool | _kmaxTouched |
| bool | _kminTouched |
| FKLoop * | _loop |
| FKParameters * | _param |
| ToolFK::ToolFK | ( | QWidget * | parent | ) |
References _d, _exportAllFKGrids, _kmaxSolver, _kmaxTouched, _kminTouched, _loop, gridChanged(), kmaxChanged(), GeopsyGui::ToolBase::loadLogParameters(), parametersChanged(), GeopsyGui::ToolBase::setWindowTitle(), start(), stop(), test(), and TRACE.
:
ToolArrayBase(parent, 1)
{
TRACE;
setWindowIcon(QIcon(":/images/fk-22x22.png"));
setObjectName("ToolFK");
QVBoxLayout * baseLayout=new QVBoxLayout(this);
_d=new ToolFKd(this);
baseLayout->addWidget(_d);
_exportAllFKGrids=false;
setWindowTitle("FK toolbox");
connect(_d->startBut, SIGNAL(clicked()), this, SLOT(start()) );
connect(_d->stopBut, SIGNAL(clicked()), this, SLOT(stop()) );
connect(_d->testBut, SIGNAL(clicked()), this, SLOT(test()) );
connect(_d->loadParam, SIGNAL(clicked()), this, SLOT(loadLogParameters()) );
connect(_d->freqSamp, SIGNAL(sampleCountChanged()), _d, SLOT(numFreqChanged()) );
connect(_d->winParam, SIGNAL(parametersChanged()), this, SLOT(parametersChanged()) );
connect(_d->timeLimits, SIGNAL(parametersChanged()), this, SLOT(parametersChanged()) );
connect(_d->testFrequency, SIGNAL(valueChanged( const QString& )), this, SLOT(parametersChanged()) );
connect(_d->freqBandwidth, SIGNAL(valueChanged( const QString& )), this, SLOT(parametersChanged()) );
connect(_d->kminEdit, SIGNAL(valueChanged(const QString& )), this, SLOT(gridChanged()));
connect(_d->kmaxEdit, SIGNAL(valueChanged(const QString& )), this, SLOT(kmaxChanged()));
connect(_d->vminEdit, SIGNAL(valueChanged(const QString& )), this, SLOT(gridChanged()));
_kmaxSolver=0;
_kmaxTouched=false;
_kminTouched=false;
_loop=0;
}
| ToolFK::~ToolFK | ( | ) |
References _kmaxSolver, ArrayCore::KmaxSolver::terminate(), and TRACE.
{
TRACE;
if(_kmaxSolver) {
_kmaxSolver->terminate();
delete _kmaxSolver;
}
}
| bool ToolFK::checkParameters | ( | FKParameters * | param | ) | const [protected] |
References ArrayCore::ArrayParameters::frequencyBandWidth(), ArrayCore::FKParameters::maximumWaveNumber(), ArrayCore::FKParameters::minimumWaveNumber(), MSG_ID, and QGpCoreTools::tr().
Referenced by parameters().
{
if(param->frequencyBandWidth()<=0) {
Message::warning(MSG_ID,tr("FK parameters"),tr("Band width cannot be null or negative."), true);
return false;
}
if(param->minimumWaveNumber()>param->maximumWaveNumber()) {
Message::warning(MSG_ID,tr("FK parameters"),tr("kmin must be less than kmax."), true);
return false;
}
if(param->minimumWaveNumber()<=0.0) {
Message::warning(MSG_ID,tr("FK parameters"),tr("kmin cannot be null or negative."), true);
return false;
}
if(param->minimumWaveNumber()*3600<param->maximumWaveNumber()) {
Message::warning(MSG_ID,tr("FK parameters"),tr("kmin cannot be more than 3600 times smaller than kmax. "
"If kmin*3600==kmax, the approximate size of a FK map is 100 Mb."), true);
return false;
}
return true;
}
| void ToolFK::finish | ( | ) | [protected, slot] |
References _chrono, _d, ToolArrayBase::_log, _loop, _param, ArrayCore::ArrayParameters::outputFile(), ToolFKd::setRunning(), QGpCoreTools::tr(), GeopsyGui::ToolBase::unlockSubPool(), and ToolArrayBase::writeProcessLogs().
Referenced by ToolLinearFKPassive::finishPositive(), ToolHRFK::start(), and start().
{
QTime timeElapsed(0,0);
_log += tr("Process run in %1\n").arg(timeElapsed.addMSecs(_chrono.elapsed()).toString("hh:mm:ss"));
_log += tr("Process ended at %1\n").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
delete _loop;
_loop=0;
writeProcessLogs(_param->outputFile());
unlockSubPool();
_param=0;
_d->setRunning(false);
}
| void ToolFK::gridChanged | ( | ) | [protected, slot] |
References _d, _fkBrowser, parameters(), and TRACE.
Referenced by kmaxChanged(), setDefaultGridSize(), and ToolFK().
{
TRACE;
if(_fkBrowser && _d->testBut->isChecked()) {
FKParameters * param=static_cast<FKParameters *>(parameters());
if(param) {
_fkBrowser->setGrid(param);
delete param;
}
}
}
| bool ToolFK::initStations | ( | SubSignalPool * | subPool | ) | [virtual] |
Reimplemented from GeopsyGui::ToolBase.
Reimplemented in ToolLinearFKPassive.
References ToolArrayBase::_array, _d, GeopsyGui::ToolBase::_subPool, ToolArrayBase::initStations(), ArrayCore::ArrayStations::setRelativeCoordinates(), TRACE, and GeopsyGui::ToolBase::updateSubPool().
Referenced by ToolLinearFKPassive::initStations().
{
TRACE;
if(!ToolArrayBase::initStations(subPool, _d->winParam)) return false;
_d->timeLimits->setPicks(_subPool);
_array.setRelativeCoordinates();
emit updateSubPool();
return true;
}
| void ToolFK::kmaxChanged | ( | ) | [protected, slot] |
References _kmaxSolver, _kmaxTouched, gridChanged(), MSG_ID, QGpCoreTools::tr(), and TRACE.
Referenced by ToolFK().
{
TRACE;
if(_kmaxSolver) {
if(Message::question(MSG_ID, tr("Changing grid size"),
tr("The grid size is currently been computed, do you want to "
"stop this computation and set your own value?"),
Message::yes(), Message::no())==Message::Answer0) {
_kmaxTouched=true;
}
}
gridChanged();
}
| AbstractParameters * ToolFK::parameters | ( | AbstractParameters * | param = 0 | ) | const [protected, virtual] |
Reimplemented from GeopsyGui::ToolBase.
Reimplemented in ToolHRFK.
References _d, checkParameters(), ToolFKd::getParameters(), and TRACE.
Referenced by gridChanged(), parametersChanged(), ToolLinearFKPassive::start(), and start().
{
TRACE;
if(!param) {
param=new FKParameters;
}
_d->getParameters(*static_cast<FKParameters *>(param));
if(!checkParameters(static_cast<FKParameters *>(param))) {
delete param;
return 0;
} else {
return param;
}
}
| void ToolFK::parametersChanged | ( | ) | [protected, slot] |
References _d, _fkBrowser, and parameters().
Referenced by ToolHRFK::test(), test(), ToolFK(), and ToolHRFK::ToolHRFK().
{
if(_fkBrowser && _d->testBut->isChecked()) {
FKParameters * param=static_cast<FKParameters *>(parameters());
if(param) _fkBrowser->setParameters(_d->testFrequency->value(), param);
}
}
| void ToolFK::setComputedKmax | ( | ) | [protected, slot] |
References _kmaxSolver, _kmaxTimer, _kmaxTouched, ArrayCore::KmaxSolver::kmax(), setDefaultGridSize(), and TRACE.
Referenced by setDefaultGridParameters().
{
TRACE;
// Upon termination, _kmaxSolver might be replaced by another solver
// and this function called by an old event still in the stack
// Make sure that it still refers to the current solver.
KmaxSolver * solver=qobject_cast<KmaxSolver *>(sender());
if(solver && _kmaxSolver==solver) {
if(!_kmaxTouched) {
bool ok;
double kmax=_kmaxSolver->kmax(ok);
if(ok) {
setDefaultGridSize(kmax);
}
}
_kmaxTimer.stop();
_kmaxSolver->deleteLater();
_kmaxSolver=0;
}
}
| void ToolFK::setDefaultGridParameters | ( | ) | [protected] |
References ToolArrayBase::_array, _kmaxSolver, _kmaxTimer, _kmaxTouched, _kminTouched, ArrayCore::KminSolver::calculate(), ArrayCore::KmaxSolver::calculate(), QGpCoreTools::endl(), ArrayCore::ArrayStations::relativeCoordinates(), setComputedKmax(), setDefaultGridStep(), setTemporaryKmax(), ArrayCore::KmaxSolver::terminate(), QGpCoreTools::tr(), and TRACE.
Referenced by updateAllFields().
{
TRACE;
if(_kmaxSolver) {
_kmaxSolver->terminate();
_kmaxSolver->deleteLater();
_kmaxSolver=0;
}
QVector<Point2D> stations;
for(int i=0;i<_array.count();i++) {
stations.append(Point2D(_array.relativeCoordinates(i)));
}
// Estimate kmin and kmax from station coordinates
KminSolver kminSolver(stations);
bool ok=true;
double kmin=kminSolver.calculate(ok);
if(!_kmaxTouched) {
if (ok && kmin>0.0) {
_kmaxSolver=new KmaxSolver(stations, kmin);
connect(&_kmaxTimer, SIGNAL(timeout()), this, SLOT(setTemporaryKmax()));
connect(_kmaxSolver, SIGNAL(finished()), this, SLOT(setComputedKmax()));
_kmaxSolver->calculate();
_kmaxTimer.start(1000);
} else {
App::stream() << tr("Error computing kmin for station coordinates") << endl;
return;
}
}
if(!_kminTouched) {
setDefaultGridStep(kmin);
}
}
| void ToolFK::setDefaultGridSize | ( | double | kmax | ) | [protected, virtual] |
References _d, gridChanged(), and TRACE.
Referenced by setComputedKmax(), and setTemporaryKmax().
{
TRACE;
_d->kmaxEdit->blockSignals(true);
kmax*=2.0;
// Check if enough precision to represent these numbers, at least 3 significant digits
if(kmax<pow(10.0, -_d->kmaxEdit->decimals())) {
_d->kmaxEdit->setDecimals(3-floor(log10(kmax)));
}
// Set value
_d->kmaxEdit->setValue(kmax);
_d->kmaxEdit->blockSignals(false);
gridChanged();
}
| void ToolFK::setDefaultGridStep | ( | double | kmin | ) | [protected, virtual] |
Reimplemented in ToolHRFK.
Referenced by setDefaultGridParameters().
| void ToolFK::setParameters | ( | int & | argc, |
| char ** | argv | ||
| ) | [virtual] |
By default loads parameters values from current settings. If you redefine this function do not forget to call this version before doing anything else.
Reimplemented from GeopsyGui::ToolBase.
References _d, _exportAllFKGrids, GeopsyGui::ToolBase::loadLogParameters(), ToolFKd::setOutputFileChecked(), and TRACE.
{
TRACE;
ToolBase::setParameters(argc, argv);
int i, j=1;
for(i=1; i<argc; i++) {
QByteArray arg=argv[i];
if(arg[0]=='-') {
if(arg=="-param") {
CoreApplication::checkOptionArg(i, argc, argv);
loadLogParameters(argv[i] );
} else if(arg=="-export-grids") {
_exportAllFKGrids=true;
} else if(arg=="-f") {
_d->setOutputFileChecked(true);
} else {
argv[j++]=argv[i];
}
} else {
argv[j++]=argv[i];
}
}
if(j < argc) {
argv[j]=0;
argc=j;
}
}
| void ToolFK::setParameters | ( | const AbstractParameters * | param | ) | [protected, virtual] |
Reimplemented from GeopsyGui::ToolBase.
Reimplemented in ToolHRFK.
References _d, ToolFKd::setParameters(), and TRACE.
{
TRACE;
_d->setParameters(*static_cast<const FKParameters *>(param));
}
| void ToolFK::setTemporaryKmax | ( | ) | [protected, slot] |
References _d, _kmaxSolver, _kmaxTimer, _kmaxTouched, ToolFKd::getParameters(), ArrayCore::KmaxSolver::kmax(), QGpCoreTools::SamplingParameters::maximum(), setDefaultGridSize(), ArrayCore::KmaxSolver::terminate(), and TRACE.
Referenced by setDefaultGridParameters().
{
TRACE;
if(_kmaxTouched) {
_kmaxTimer.stop();
_kmaxSolver->terminate();
_kmaxSolver->deleteLater();
_kmaxSolver=0;
}
if(_kmaxSolver) {
bool ok;
double kmax=_kmaxSolver->kmax(ok);
if(ok) {
// TODO: implement the maximum allowed K in KmaxSolver
SamplingParameters param;
_d->freqSamp->getParameters(param);
double maxK=2.0*M_PI*param.maximum()/_d->vminEdit->value();
if(kmax>=maxK) {
kmax=maxK;
_kmaxTimer.stop();
_kmaxSolver->terminate();
_kmaxSolver->deleteLater();
_kmaxSolver=0;
}
setDefaultGridSize(kmax);
}
}
}
| void ToolFK::start | ( | ) | [virtual, slot] |
Reimplemented from GeopsyGui::ToolBase.
Reimplemented in ToolHRFK, and ToolLinearFKPassive.
References ToolArrayBase::_array, _d, _exportAllFKGrids, ToolArrayBase::_log, finish(), ToolFKd::outputFile(), parameters(), ToolArrayBase::resetLogs(), FKLoop::setArray(), ArrayCore::FKParameters::setExportAllFKGrids(), FKLoop::setLog(), ArrayCore::ArrayParameters::setOutputFile(), FKLoop::setParameters(), startLoop(), GeopsyGui::ToolBase::subPoolLocked(), and TRACE.
Referenced by ToolFK().
{
TRACE;
if(subPoolLocked()) return;
resetLogs();
// Get parameters from dialog box
FKParameters * param=static_cast<FKParameters *>(parameters());
if(!param) return;
param->setOutputFile(_d->outputFile());
param->setExportAllFKGrids(_exportAllFKGrids);
// Prepare loop
FKLoop *loop=new FKLoop;
loop->setArray(&_array);
loop->setLog(&_log);
if( !loop->setParameters(param) ) {
delete loop;
return ;
}
connect(loop, SIGNAL(finished()), this, SLOT(finish()));
startLoop(loop, param);
}
| void ToolFK::startLoop | ( | FKLoop * | loop, |
| FKParameters * | param, | ||
| const QString & | message = QString::null |
||
| ) | [protected] |
message is displayed at the top while running. If empty, 'Runnning...' is displayed.
References _chrono, _d, ToolArrayBase::_log, _loop, _param, QGpCoreTools::SamplingParameters::count(), ArrayCore::ArrayParameters::frequencySampling(), GeopsyGui::ToolBase::lockSubPool(), ArrayCore::ArrayParameters::outputFile(), ToolFKd::setRunning(), QGpCoreTools::ParallelLoop::start(), QGpCoreTools::tr(), and ToolArrayBase::writeParameterLogs().
Referenced by ToolLinearFKPassive::start(), ToolHRFK::start(), and start().
{
_d->detailedStatus->setLoop(loop);
_loop=loop;
_param=param;
// Start main loop
lockSubPool(); // Prevent any change on the orignal signals
_d->setRunning(true, message);
writeParameterLogs(_param->outputFile());
_log += tr("Process started at %1\n").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
_chrono.start();
_loop->start(0, _param->frequencySampling().count());
}
| void ToolFK::stop | ( | ) | [slot] |
| void ToolFK::test | ( | ) | [virtual, slot] |
Reimplemented in ToolHRFK.
References ToolArrayBase::_array, GeopsyGui::ToolBase::_childrenList, _fkBrowser, GeopsyCore::geopsyCore, geopsyGui, parametersChanged(), ToolArrayBase::setTimeWindowLayer(), GeopsyCore::GeopsyCoreEngine::showMessage(), GeopsyGui::ToolBase::timeWindowLayer(), QGpCoreTools::tr(), and TRACE.
Referenced by ToolFK().
{
TRACE;
if(!_fkBrowser) {
_childrenList[0]=new FKTimeWindows;
_fkBrowser->setObjectName("FKBrowser");
_fkBrowser->setArray(_array);
_fkBrowser->setTimeWindowLayer(timeWindowLayer());
setTimeWindowLayer(_fkBrowser->timeWindowList());
geopsyGui->addWindow(_fkBrowser);
}
geopsyGui->showWindow(_fkBrowser);
QApplication::processEvents();
parametersChanged();
geopsyCore->showMessage(tr("Signals are ready"));
}
| const char * ToolFK::toolName | ( | ) | [protected, virtual] |
Implements ToolArrayBase.
Reimplemented in ToolHRFK, and ToolLinearFKPassive.
{
return "FK Array analysis";
}
| void ToolFK::updateAllFields | ( | ) | [protected, virtual] |
Reimplemented from GeopsyGui::ToolBase.
References _d, ToolFKd::numFreqChanged(), ToolFKd::on_freqScroll_valueChanged(), setDefaultGridParameters(), and TRACE.
{
TRACE;
_d->winParam->updateAllFields();
_d->timeLimits->updateAllFields();
_d->numFreqChanged();
_d->on_freqScroll_valueChanged(0);
// After restoring last values from registry
setDefaultGridParameters();
}
| void ToolFK::waitFinished | ( | ) | [virtual] |
Reimplemented from GeopsyGui::ToolBase.
References _loop, TRACE, and QGpCoreTools::ParallelLoop::waitFinished().
{
TRACE;
if(_loop) {
_loop->waitFinished();
}
}
QTime ToolFK::_chrono [protected] |
Referenced by finish(), and startLoop().
ToolFKd* ToolFK::_d [protected] |
Referenced by finish(), ToolLinearFKPassive::finishPositive(), gridChanged(), initStations(), parameters(), parametersChanged(), setDefaultGridSize(), setDefaultGridStep(), ToolHRFK::setParameters(), setParameters(), setTemporaryKmax(), ToolLinearFKPassive::start(), ToolHRFK::start(), start(), startLoop(), ToolFK(), ToolHRFK::ToolHRFK(), and updateAllFields().
bool ToolFK::_exportAllFKGrids [protected] |
Referenced by setParameters(), ToolHRFK::start(), start(), and ToolFK().
KmaxSolver* ToolFK::_kmaxSolver [protected] |
Referenced by kmaxChanged(), setComputedKmax(), setDefaultGridParameters(), setTemporaryKmax(), ToolFK(), and ~ToolFK().
QTimer ToolFK::_kmaxTimer [protected] |
Referenced by setComputedKmax(), setDefaultGridParameters(), and setTemporaryKmax().
bool ToolFK::_kmaxTouched [protected] |
Referenced by kmaxChanged(), setComputedKmax(), setDefaultGridParameters(), setTemporaryKmax(), and ToolFK().
bool ToolFK::_kminTouched [protected] |
Referenced by setDefaultGridParameters(), and ToolFK().
FKLoop* ToolFK::_loop [protected] |
Referenced by finish(), ToolLinearFKPassive::finishPositive(), startLoop(), stop(), ToolFK(), and waitFinished().
FKParameters* ToolFK::_param [protected] |
Referenced by finish(), ToolLinearFKPassive::finishPositive(), and startLoop().