From 579658b83bd55511c10ac54ada35f064bd4e897a Mon Sep 17 00:00:00 2001 From: kuanshi Date: Thu, 27 Oct 2022 14:12:53 -0700 Subject: [PATCH 01/22] kz - minor patch of masking period 0 for PGA for NGA West selection --- EVENTS/peerNGA/NSHMPTarget.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EVENTS/peerNGA/NSHMPTarget.cpp b/EVENTS/peerNGA/NSHMPTarget.cpp index 2321bf76..27190b7e 100644 --- a/EVENTS/peerNGA/NSHMPTarget.cpp +++ b/EVENTS/peerNGA/NSHMPTarget.cpp @@ -116,7 +116,8 @@ QList> NSHMPTarget::getUHS(QJsonObject& json) const for (auto hazardCurve: hazardCurves) { auto imt = hazardCurve.toObject()["metadata"].toObject()["imt"].toObject()["value"].toString(); - double period = 0; + // double period = 0; + double period = 0.01; // KZ: default period at 0.01 second for PGA as 0 second in NGA West's log-log interpolation is non-sense... if (imt.startsWith("SA")) period = imt.remove("SA").replace('P', '.').toDouble(); From 9dc5843c5b3a08831f5a3753fa3ee50ddee5c1a0 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Sat, 24 Dec 2022 18:09:08 -0800 Subject: [PATCH 02/22] sy - updating example input --- Examples/eeuq-0006/src/input.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/eeuq-0006/src/input.json b/Examples/eeuq-0006/src/input.json index fd3c63fe..628ab9d4 100644 --- a/Examples/eeuq-0006/src/input.json +++ b/Examples/eeuq-0006/src/input.json @@ -25,7 +25,7 @@ } }, "UQ": { - "Application": "SimCenterUQ", + "Application": "SimCenter-UQ", "ApplicationData": { } } From a588f3b4923e0d6302adc9d60bb4a47b31dd3a56 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Sat, 24 Dec 2022 18:09:41 -0800 Subject: [PATCH 03/22] sy - adding uniform IM EVT option for GP surrogate --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 293 +++++++++++++++++++++++++++ EVENTS/peerNGA/NoSpectrumUniform.h | 43 ++++ EVENTS/peerNGA/PEER_NGA_Records.cpp | 40 +++- EVENTS/peerNGA/PEER_NGA_Records.h | 4 + EarthquakeEvents.pri | 2 + 5 files changed, 378 insertions(+), 4 deletions(-) create mode 100644 EVENTS/peerNGA/NoSpectrumUniform.cpp create mode 100644 EVENTS/peerNGA/NoSpectrumUniform.h diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp new file mode 100644 index 00000000..929e0e85 --- /dev/null +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -0,0 +1,293 @@ +#include "NoSpectrumUniform.h" +#include "SimCenterPreferences.h" +#include +#include +#include +#include +#include +#include + +NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : AbstractTargetWidget(parent) +{ + auto layout = new QGridLayout(this); + + auto positiveDoubleValidator = new QDoubleValidator(); + positiveDoubleValidator->setBottom(0.0); + + numSampPerBin = new QLineEdit("4"); + theSCIMWidget_grid = new SimCenterIntensityMeasureWidget(); + theSCIMWidget_grid->addGridField(); + + layout->addWidget(new QLabel("# samples per bin"), 0, 0); + layout->addWidget(numSampPerBin, 0, 1); + layout->addWidget(theSCIMWidget_grid, 1, 0,1,-1); + layout->setColumnStretch(2,1); +} + + +QJsonObject NoSpectrumUniform::serialize() const +{ + QJsonObject json; + json["numSampPerBin"] = numSampPerBin->text(); + theSCIMWidget_grid->outputToJSON(json); + return json; +} + +void NoSpectrumUniform::deserialize(const QJsonObject &json) +{ + QJsonObject* myNonRefJson = const_cast(&json); + + numSampPerBin->setText(json["numSampPerBin"].toString()); + theSCIMWidget_grid->inputFromJSON(*myNonRefJson); +} + +QList> NoSpectrumUniform::spectrum() const +{ + QList> targetSectrum; +// QList periods; +// // Use a 0.05 s interval (0.05s ~ 10s) +// for (int i = 0; i < 200; ++i) +// periods << 0.05 * i + 0.05; + +// // Compute ASCE7-10 two-period spectrum +// auto Sds = sdsEditBox->text().toDouble(); +// auto Sd1 = sd1EditBox->text().toDouble(); +// auto Tl = tlEditBox->text().toDouble(); +// auto Ts = Sd1 / Sds; +// auto T0 = 0.2 * Ts; +// for (int i = 0; i != periods.size()-1; ++i) +// { +// if (periods[i] <= T0) +// targetSectrum.append({periods[i], Sds*(0.4+0.6*periods[i]/T0)}); +// else if (periods[i] <= Ts) +// targetSectrum.append({periods[i], Sds}); +// else if (periods[i] <= Tl) +// targetSectrum.append({periods[i], Sd1/periods[i]}); +// else +// targetSectrum.append({periods[i], Sd1*Tl/periods[i]/periods[i]}); +// } + + return targetSectrum; +} + + +void NoSpectrumUniform::writeConfigJSON(QJsonObject myJson) { + + +} + +void NoSpectrumUniform::getUniformRSN(void) { + + + // write json + QJsonObject configJSON; + this->writeConfigJSON(configJSON); + + QString templateDir("templatedir"); + QDir destinationDirectory(configJSON.value("runDir").toString()); + QString templateDirectory = destinationDirectory.absoluteFilePath(templateDir); + destinationDirectory.mkpath(templateDirectory); + QString inputFile = templateDirectory + QDir::separator() + tr("scInput.json"); + + qDebug() << "INPUT FILE: " << inputFile; + QFile file(inputFile); + if (!file.open(QFile::WriteOnly | QFile::Text)) { + return; + } + /* REMOVING CRAP + QJsonObject json; + if (this->outputToJSON(json) == false) { + //this->errorMessage("WorkflowApp - failed in outputToJson"); + return; + } + */ + + QJsonDocument doc(configJSON); + file.write(doc.toJson()); + file.close(); + qDebug() << "JSON: " << configJSON; + + // run myScript + QString tempDirectory = templateDirectory; + QString inputFilePath = inputFile; + + // qDebug() << "RUNTYPE" << runType; + //QString runType("runningLocal"); + //qDebug() << "RUNTYPE" << runType; + QString appDir = SimCenterPreferences::getInstance()->getAppDir(); + //QString appName = QCoreApplication::applicationName(); + +// //TODO: recognize if it is PBE or EE-UQ -> probably smarter to do it inside the python file +// QString pySCRIPT; + QDir scriptDir(appDir); +// //scriptDir.cd("applications"); +// //scriptDir.cd("Workflow"); +// //pySCRIPT = scriptDir.absoluteFilePath("qWHALE.py"); // invoke qWHALE to run GP surrogate prediction +// pySCRIPT = "Path/To/GMselector"; +// QFileInfo check_script(pySCRIPT); +// if (!check_script.exists() || !check_script.isFile()) { +// //emit sendErrorMessage(QString("NO SCRIPT FILE: ") + pySCRIPT); +// emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); +// return; +// } + + QString registryFile = scriptDir.absoluteFilePath("WorkflowApplications.json"); + QFileInfo check_registry(registryFile); + if (!check_registry.exists() || !check_registry.isFile()) { + //emit sendErrorMessage(QString("NO REGISTRY FILE: ") + registryFile); + emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + return; + } + +// qDebug() << "SCRIPT: " << pySCRIPT; + qDebug() << "REGISTRY: " << registryFile; + + QStringList files; + //files << "dakota.in" << "dakota.out" << "dakotaTab.out" << "dakota.err"; + //qDebug() << "files: " << files; + files << "RSN.out"; + // + // now invoke dakota, done via a python script in tool app dircetory + // + proc = new QProcess(this); + proc->setProcessChannelMode(QProcess::SeparateChannels); + qDebug() << "setProcessChannelMode"; + auto procEnv = QProcessEnvironment::systemEnvironment(); + QString pathEnv = procEnv.value("PATH"); + qDebug() << "pathEnv: " << pathEnv; + QString pythonPathEnv = procEnv.value("PYTHONPATH"); + qDebug() << "pythonPathEnv: " << pythonPathEnv; + QString python = QString("python"); + qDebug() << "python: " << python; + QString exportPath("export PATH="); + qDebug() << "exportPath: " << exportPath; + bool colonYes = false; + SimCenterPreferences *preferences = SimCenterPreferences::getInstance(); + python = preferences->getPython(); + qDebug() << "python2: " << python; + + QFileInfo pythonFile(python); + if (pythonFile.exists()) { + QString pythonPath = pythonFile.absolutePath(); + colonYes=true; + exportPath += pythonPath; + pathEnv = pythonPath + ';' + pathEnv; + } else { + //emit sendErrorMessage("NO VALID PYTHON - Read the Manual & Check your Preferences"); + emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + return; + } + +// exportPath += "$PATH"; +// procEnv.insert("PATH", pathEnv); +// procEnv.insert("PYTHONPATH", pythonPathEnv); +// proc->setProcessEnvironment(procEnv); + + QStringList args; + args << inputFile << registryFile; + +#ifdef Q_OS_WIN + python = QString("\"") + python + QString("\""); + + qDebug() << python; + qDebug() << args; + + proc->start(python,args); + + bool failed = false; + if (!proc->waitForStarted(-1)) + { + qDebug() << "Failed to start the workflow!!! exit code returned: " << proc->exitCode(); + qDebug() << proc->errorString().split('\n'); + //this->statusMessage("Failed to start the workflow!!!"); + failed = true; + } + + if(!proc->waitForFinished(-1)) + { + qDebug() << "Failed to finish running the workflow!!! exit code returned: " << proc->exitCode(); + qDebug() << proc->errorString(); + //this->statusMessage("Failed to finish running the workflow!!!"); + failed = true; + } + + + if(0 != proc->exitCode()) + { + qDebug() << "Failed to run the workflow!!! exit code returned: " << proc->exitCode(); + qDebug() << proc->errorString(); + //this->statusMessage("Failed to run the workflow!!!"); + failed = true; + } + + if(failed) + { + qDebug().noquote() << proc->readAllStandardOutput(); + qDebug().noquote() << proc->readAllStandardError(); + emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + return; + } + +#else + + // check for bashrc or bash profile + QDir homeDir(QDir::homePath()); + QString sourceBash(""); + if (homeDir.exists(".bash_profile")) { + sourceBash = QString("source $HOME/.bash_profile; "); + } else if (homeDir.exists(".bashrc")) { + sourceBash = QString("source $HOME/.bashrc; "); + } else if (homeDir.exists(".zprofile")) { + sourceBash = QString("source $HOME/.zprofile; "); + } else if (homeDir.exists(".zshrc")) { + sourceBash = QString("source $HOME/.zshrc; "); + } else + + + qDebug() << QString("No .bash_profile, .bashrc, .zprofile or .zshrc file found. This may not find Dakota or OpenSees"); + + // note the above not working under linux because bash_profile not being called so no env variables!! + QString command; + + command = "\"" + python + QString("\" \"" ) + + inputFile + QString("\" \"") + registryFile + QString("\""); + + qDebug() << "PYTHON COMMAND" << command; + + proc->start("bash", QStringList() << "-c" << command); + proc->waitForStarted(); + + bool failed = false; + if(!proc->waitForFinished(-1)) + { + qDebug() << "Failed to finish running the workflow!!! exit code returned: " << proc->exitCode(); + qDebug() << proc->errorString(); + // this->statusMessage("Failed to finish running the workflow!!!"); + failed = true; + } + + + if(0 != proc->exitCode()) + { + qDebug() << "Failed to run the workflow!!! exit code returned: " << proc->exitCode(); + qDebug() << proc->errorString(); + // this->statusMessage("Failed to run the workflow!!!"); + failed = true; + } + + if(failed) + { + qDebug().noquote() << proc->readAllStandardOutput(); + qDebug().noquote() << proc->readAllStandardError(); + emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + return; + } + +#endif + + // return + emit runComplete(true, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + qDebug() << "runComplete with success."; +} + + diff --git a/EVENTS/peerNGA/NoSpectrumUniform.h b/EVENTS/peerNGA/NoSpectrumUniform.h new file mode 100644 index 00000000..9cf521b0 --- /dev/null +++ b/EVENTS/peerNGA/NoSpectrumUniform.h @@ -0,0 +1,43 @@ +#ifndef NoSpectrumUniform_H +#define NoSpectrumUniform_H + +#include +#include +#include +#include "AbstractTargetWidget.h" +#include "SimCenterIntensityMeasureWidget.h" + +class NoSpectrumUniform : public AbstractTargetWidget +{ + Q_OBJECT +public: + explicit NoSpectrumUniform(QWidget *parent = nullptr); + void writeConfigJSON(QJsonObject myJson); + void getUniformRSN(void); +signals: + void runComplete(bool, QString, QString); + +private: +// QLineEdit* sdsEditBox; +// QLineEdit* sd1EditBox; +// QLineEdit* tlEditBox; + + QLineEdit* numSampPerBin; + SimCenterIntensityMeasureWidget *theSCIMWidget_grid; + QProcess * proc; + +public: + QJsonObject serialize() const override; + void deserialize(const QJsonObject &json) override; + + + // AbstractTargetWidget interface +public: + QList > spectrum() const override; +// double sds(); +// double sd1(); +// double tl(); + +}; + +#endif // NoSpectrumUniform_H diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index 7f9c06fd..63ae589b 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -17,6 +17,7 @@ #include #include #include "ASCE710Target.h" +#include "NoSpectrumUniform.h" #include "UserSpectrumWidget.h" #include "USGSTargetWidget.h" #include "NSHMPTarget.h" @@ -50,16 +51,17 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) targetSpectrumLayout->setColumnMinimumWidth(1, 100); targetSpectrumLayout->setColumnMinimumWidth(2, 30); - targetSpectrumLayout->addWidget(new QLabel("Type"), 0, 0); + targetSpectrumLayout->addWidget(new QLabel("Type "), 0, 0); spectrumTypeComboBox = new QComboBox(); - targetSpectrumLayout->addWidget(spectrumTypeComboBox, 0, 1); + targetSpectrumLayout->addWidget(spectrumTypeComboBox, 0, 1, Qt::AlignLeft); spectrumTypeComboBox->addItem("Design Spectrum (ASCE 7-10)"); spectrumTypeComboBox->addItem("User Specified"); spectrumTypeComboBox->addItem("Design Spectrum (USGS Web Service)"); spectrumTypeComboBox->addItem("Uniform Hazard Spectrum (USGS NSHMP)"); spectrumTypeComboBox->addItem("Conditional Mean Spectrum (USGS Disagg.)"); spectrumTypeComboBox->addItem("Spectrum from Hazard Surrogate"); + spectrumTypeComboBox->addItem("No Spectrum - Uniform IMs"); targetSpectrumDetails = new QStackedWidget(this); targetSpectrumLayout->addWidget(targetSpectrumDetails, 1, 0, 1, 3); @@ -75,8 +77,10 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) targetSpectrumDetails->addWidget(nshmpDeagg); spectrumSurrogate = new SpectrumFromRegionalSurrogate(this); targetSpectrumDetails->addWidget(spectrumSurrogate); + auto noSpect = new NoSpectrumUniform(this); + targetSpectrumDetails->addWidget(noSpect); - auto recordSelectionGroup = new QGroupBox("Record Selection"); + recordSelectionGroup = new QGroupBox("Record Selection"); recordSelectionLayout = new QGridLayout(recordSelectionGroup); recordSelectionLayout->addWidget(new QLabel("Number of Records"), 0, 0); nRecordsEditBox = new QLineEdit("16"); @@ -156,6 +160,7 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) // recordSelectionGroup->setMaximumHeight(200); //#else targetSpectrumLayout->setRowStretch(2,1); + targetSpectrumLayout->setColumnStretch(2,1); recordSelectionLayout->setRowStretch(7, 1); //#endif @@ -211,6 +216,7 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) // add stuff to enter Output Directory QLabel *labelOD = new QLabel("Output Directory"); outdirLE = new QLineEdit; + outdirLE->setPlaceholderText("(Opional) Default:" + groundMotionsFolder.path()); QPushButton *chooseOutputDirectoryButton = new QPushButton(); chooseOutputDirectoryButton->setText(tr("Choose")); connect(chooseOutputDirectoryButton,SIGNAL(clicked()),this,SLOT(chooseOutputDirectory())); @@ -377,7 +383,20 @@ void PEER_NGA_Records::setupConnections() connect(spectrumTypeComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index){ targetSpectrumDetails->setCurrentIndex(index); - + if(spectrumTypeComboBox->currentText().contains("No Spectrum")) { + double newHeight = targetSpectrumDetails->height(); + double newWidth = targetSpectrumDetails->width(); + newWidth += recordSelectionGroup->width(); + + recordSelectionGroup->setVisible(false); + //targetSpectrumDetails->resize(newHeight, newWidth); + targetSpectrumDetails->setMinimumWidth(newWidth); + //widget->resize(165, widget->height()); + + } else { + recordSelectionGroup->setVisible(true); + targetSpectrumDetails->setMinimumWidth(10); // some random number + } return; }); @@ -523,6 +542,19 @@ void PEER_NGA_Records::selectRecords() distanceRange, vs30Range,durationRange,groundMotionsComponentsBox->currentIndex()+1,suiteAverageBox->currentIndex(),faultTypeBox->currentIndex()+1,pulseBox->currentIndex()+1); } + else if(targetSpectrumDetails->currentIndex() == 6) // no spectrum (uniform + { + auto unifrom_widget = reinterpret_cast(targetSpectrumDetails->currentWidget()); + + progressBar->setHidden("False"); + selectRecordsButton->setEnabled(false); + selectRecordsButton->setDown(true); + + updateStatus("Retrieving ground motion RSN ..."); + auto RSN = unifrom_widget->spectrum(); + + // TO ADD + } else { auto userTargetWidget = reinterpret_cast(targetSpectrumDetails->currentWidget()); diff --git a/EVENTS/peerNGA/PEER_NGA_Records.h b/EVENTS/peerNGA/PEER_NGA_Records.h index 3a782e3b..bb990356 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.h +++ b/EVENTS/peerNGA/PEER_NGA_Records.h @@ -69,6 +69,10 @@ public slots: void switchUserDefined(QString dirName, QString fileName); private: + + // widget groups + QGroupBox *recordSelectionGroup; + QGridLayout *targetSpectrumLayout; PeerNgaWest2Client peerClient; QPushButton* selectRecordsButton; QLineEdit* nRecordsEditBox; diff --git a/EarthquakeEvents.pri b/EarthquakeEvents.pri index d57a2ee9..10ecaa1e 100644 --- a/EarthquakeEvents.pri +++ b/EarthquakeEvents.pri @@ -18,6 +18,7 @@ SOURCES += \ $$PWD/EVENTS/StochasticMotionInput/src/VlachosEtAlModel.cpp \ $$PWD/EVENTS/StochasticMotionInput/src/DabaghiDerKiureghianPulse.cpp \ $$PWD/EVENTS/peerNGA/ASCE710Target.cpp \ + $$PWD/EVENTS/peerNGA/NoSpectrumUniform.cpp \ $$PWD/EVENTS/peerNGA/NSHMPDeagg.cpp \ $$PWD/EVENTS/peerNGA/NSHMPTarget.cpp \ $$PWD/EVENTS/peerNGA/PeerLoginDialog.cpp \ @@ -40,6 +41,7 @@ HEADERS += \ $$PWD/EVENTS/StochasticMotionInput/include/VlachosEtAlModel.h \ $$PWD/EVENTS/StochasticMotionInput/include/DabaghiDerKiureghianPulse.h \ $$PWD/EVENTS/peerNGA/ASCE710Target.h \ + $$PWD/EVENTS/peerNGA/NoSpectrumUniform.h \ $$PWD/EVENTS/peerNGA/AbstractJsonSerializable.h \ $$PWD/EVENTS/peerNGA/AbstractTargetWidget.h \ $$PWD/EVENTS/peerNGA/NSHMPDeagg.h \ From b7edb08609382c17b8a3198e69d7eee42e7e6bb8 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Mon, 26 Dec 2022 14:57:28 -0800 Subject: [PATCH 04/22] sy - connecting UI and PEER --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 44 +++++++++------------------ EVENTS/peerNGA/NoSpectrumUniform.h | 3 ++ EVENTS/peerNGA/PEER_NGA_Records.cpp | 3 +- EVENTS/peerNGA/PeerNgaWest2Client.cpp | 15 ++++----- 4 files changed, 27 insertions(+), 38 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 929e0e85..09b5cd79 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -21,6 +21,7 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : AbstractTargetWidget(par layout->addWidget(new QLabel("# samples per bin"), 0, 0); layout->addWidget(numSampPerBin, 0, 1); layout->addWidget(theSCIMWidget_grid, 1, 0,1,-1); + layout->setColumnStretch(2,1); } @@ -44,35 +45,25 @@ void NoSpectrumUniform::deserialize(const QJsonObject &json) QList> NoSpectrumUniform::spectrum() const { QList> targetSectrum; -// QList periods; -// // Use a 0.05 s interval (0.05s ~ 10s) -// for (int i = 0; i < 200; ++i) -// periods << 0.05 * i + 0.05; - -// // Compute ASCE7-10 two-period spectrum -// auto Sds = sdsEditBox->text().toDouble(); -// auto Sd1 = sd1EditBox->text().toDouble(); -// auto Tl = tlEditBox->text().toDouble(); -// auto Ts = Sd1 / Sds; -// auto T0 = 0.2 * Ts; -// for (int i = 0; i != periods.size()-1; ++i) -// { -// if (periods[i] <= T0) -// targetSectrum.append({periods[i], Sds*(0.4+0.6*periods[i]/T0)}); -// else if (periods[i] <= Ts) -// targetSectrum.append({periods[i], Sds}); -// else if (periods[i] <= Tl) -// targetSectrum.append({periods[i], Sd1/periods[i]}); -// else -// targetSectrum.append({periods[i], Sd1*Tl/periods[i]/periods[i]}); -// } - return targetSectrum; } +QStringList NoSpectrumUniform::getRSN() const +{ + QStringList RSN({"6,14"}) ; + // Write Json & Run the script + + + // Read the RSN.out file as a stringlist + + return RSN; +} + void NoSpectrumUniform::writeConfigJSON(QJsonObject myJson) { + myJson["numSampPerBin"]=numSampPerBin->text(); + theSCIMWidget_grid->outputToJSON(myJson); } @@ -94,13 +85,6 @@ void NoSpectrumUniform::getUniformRSN(void) { if (!file.open(QFile::WriteOnly | QFile::Text)) { return; } - /* REMOVING CRAP - QJsonObject json; - if (this->outputToJSON(json) == false) { - //this->errorMessage("WorkflowApp - failed in outputToJson"); - return; - } - */ QJsonDocument doc(configJSON); file.write(doc.toJson()); diff --git a/EVENTS/peerNGA/NoSpectrumUniform.h b/EVENTS/peerNGA/NoSpectrumUniform.h index 9cf521b0..d42ae276 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.h +++ b/EVENTS/peerNGA/NoSpectrumUniform.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "AbstractTargetWidget.h" #include "SimCenterIntensityMeasureWidget.h" @@ -24,6 +25,7 @@ class NoSpectrumUniform : public AbstractTargetWidget QLineEdit* numSampPerBin; SimCenterIntensityMeasureWidget *theSCIMWidget_grid; + QPushButton* selectRecordsButton; QProcess * proc; public: @@ -34,6 +36,7 @@ class NoSpectrumUniform : public AbstractTargetWidget // AbstractTargetWidget interface public: QList > spectrum() const override; + QStringList getRSN() const; // double sds(); // double sd1(); // double tl(); diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index 63ae589b..9cb9b920 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -551,7 +551,8 @@ void PEER_NGA_Records::selectRecords() selectRecordsButton->setDown(true); updateStatus("Retrieving ground motion RSN ..."); - auto RSN = unifrom_widget->spectrum(); + auto RSN = unifrom_widget->getRSN(); // This will run a python script + peerClient.selectRecords(RSN); // TO ADD } diff --git a/EVENTS/peerNGA/PeerNgaWest2Client.cpp b/EVENTS/peerNGA/PeerNgaWest2Client.cpp index dcdda5a2..8724349e 100644 --- a/EVENTS/peerNGA/PeerNgaWest2Client.cpp +++ b/EVENTS/peerNGA/PeerNgaWest2Client.cpp @@ -361,10 +361,6 @@ void PeerNgaWest2Client::processPostSpectrumReply() QUrlQuery params; params.addQueryItem("authenticity_token", authenticityToken); params.addQueryItem("search[DampingRatio]", "0.05"); - params.addQueryItem("search[SRkey]", QString::number(this->SRkey)); - params.addQueryItem("search[SRmeanFlag]", QString::number(this->SRmeanFlag)); - params.addQueryItem("search[faultType]", QString::number(this->faultType)); - params.addQueryItem("search[pulse]", QString::number(this->pulse)); params.addQueryItem("search[search_station_name]", ""); params.addQueryItem("search[search_eq_name]", ""); @@ -372,9 +368,14 @@ void PeerNgaWest2Client::processPostSpectrumReply() if (recordsToDownload.length() == 0) { + + // it is a search, provide selection quantaties params.addQueryItem("search[search_nga_number]", ""); - + params.addQueryItem("search[SRkey]", QString::number(this->SRkey)); + params.addQueryItem("search[SRmeanFlag]", QString::number(this->SRmeanFlag)); + params.addQueryItem("search[faultType]", QString::number(this->faultType)); + params.addQueryItem("search[pulse]", QString::number(this->pulse)); if(searchScaleFlag == 0) { @@ -424,7 +425,6 @@ void PeerNgaWest2Client::processPostSpectrumReply() } } else { - // just want to download specific records QString list; int lengthRecords = recordsToDownload.length(); for (int i=0; i Date: Mon, 26 Dec 2022 20:04:29 -0800 Subject: [PATCH 05/22] sy - to retrive RSN for grid (uniform) IM EVT --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 30 ++++++++++++++++++++-------- EVENTS/peerNGA/NoSpectrumUniform.h | 6 +++--- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 09b5cd79..82b3aee6 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -48,11 +48,13 @@ QList> NoSpectrumUniform::spectrum() const return targetSectrum; } -QStringList NoSpectrumUniform::getRSN() const +QStringList NoSpectrumUniform::getRSN() { - QStringList RSN({"6,14"}) ; + // Test + //QStringList RSN({"6,14"}) ; + QStringList RSN; // Write Json & Run the script - + this->getUniformRSN(); // Read the RSN.out file as a stringlist @@ -60,10 +62,21 @@ QStringList NoSpectrumUniform::getRSN() const } -void NoSpectrumUniform::writeConfigJSON(QJsonObject myJson) { +void NoSpectrumUniform::writeConfigJSON(QJsonObject &myJson) { myJson["numSampPerBin"]=numSampPerBin->text(); - theSCIMWidget_grid->outputToJSON(myJson); + + QJsonObject imJson; + theSCIMWidget_grid->outputToJSON(imJson); + myJson.insert("IM", imJson); + // + // config + // + + QString tmpDirName = QString("tmp.SimCenter"); + QDir workDir(SimCenterPreferences::getInstance()->getLocalWorkDir()); + QString tmpDirectory = workDir.absoluteFilePath(tmpDirName); + myJson["runDir"] = tmpDirectory; } @@ -78,7 +91,7 @@ void NoSpectrumUniform::getUniformRSN(void) { QDir destinationDirectory(configJSON.value("runDir").toString()); QString templateDirectory = destinationDirectory.absoluteFilePath(templateDir); destinationDirectory.mkpath(templateDirectory); - QString inputFile = templateDirectory + QDir::separator() + tr("scInput.json"); + QString inputFile = templateDirectory + QDir::separator() + tr("gridIM.json"); qDebug() << "INPUT FILE: " << inputFile; QFile file(inputFile); @@ -100,10 +113,11 @@ void NoSpectrumUniform::getUniformRSN(void) { //qDebug() << "RUNTYPE" << runType; QString appDir = SimCenterPreferences::getInstance()->getAppDir(); //QString appName = QCoreApplication::applicationName(); + qDebug() << "appDir: " << appDir; // //TODO: recognize if it is PBE or EE-UQ -> probably smarter to do it inside the python file // QString pySCRIPT; - QDir scriptDir(appDir); + QDir scriptDir(appDir +QDir::separator() + "applications"); // //scriptDir.cd("applications"); // //scriptDir.cd("Workflow"); // //pySCRIPT = scriptDir.absoluteFilePath("qWHALE.py"); // invoke qWHALE to run GP surrogate prediction @@ -116,6 +130,7 @@ void NoSpectrumUniform::getUniformRSN(void) { // } QString registryFile = scriptDir.absoluteFilePath("WorkflowApplications.json"); + qDebug() << "REGISTRY: " << registryFile; QFileInfo check_registry(registryFile); if (!check_registry.exists() || !check_registry.isFile()) { //emit sendErrorMessage(QString("NO REGISTRY FILE: ") + registryFile); @@ -124,7 +139,6 @@ void NoSpectrumUniform::getUniformRSN(void) { } // qDebug() << "SCRIPT: " << pySCRIPT; - qDebug() << "REGISTRY: " << registryFile; QStringList files; //files << "dakota.in" << "dakota.out" << "dakotaTab.out" << "dakota.err"; diff --git a/EVENTS/peerNGA/NoSpectrumUniform.h b/EVENTS/peerNGA/NoSpectrumUniform.h index d42ae276..82487065 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.h +++ b/EVENTS/peerNGA/NoSpectrumUniform.h @@ -13,8 +13,7 @@ class NoSpectrumUniform : public AbstractTargetWidget Q_OBJECT public: explicit NoSpectrumUniform(QWidget *parent = nullptr); - void writeConfigJSON(QJsonObject myJson); - void getUniformRSN(void); + void writeConfigJSON(QJsonObject &myJson); signals: void runComplete(bool, QString, QString); @@ -23,6 +22,7 @@ class NoSpectrumUniform : public AbstractTargetWidget // QLineEdit* sd1EditBox; // QLineEdit* tlEditBox; + void getUniformRSN(void); QLineEdit* numSampPerBin; SimCenterIntensityMeasureWidget *theSCIMWidget_grid; QPushButton* selectRecordsButton; @@ -36,7 +36,7 @@ class NoSpectrumUniform : public AbstractTargetWidget // AbstractTargetWidget interface public: QList > spectrum() const override; - QStringList getRSN() const; + QStringList getRSN(); // double sds(); // double sd1(); // double tl(); From 905d19d210cae5df2650121c88223799cc80216d Mon Sep 17 00:00:00 2001 From: yisangriB Date: Wed, 28 Dec 2022 20:33:08 -0800 Subject: [PATCH 06/22] sy - to save also the RES tab --- WorkflowAppEE_UQ.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/WorkflowAppEE_UQ.cpp b/WorkflowAppEE_UQ.cpp index 2241e687..1b53e892 100644 --- a/WorkflowAppEE_UQ.cpp +++ b/WorkflowAppEE_UQ.cpp @@ -293,6 +293,11 @@ WorkflowAppEE_UQ::outputToJSON(QJsonObject &jsonObjectTop) { if (result == false) return result; + // sy - to save results + result = theResults->outputToJSON(jsonObjectTop); + if (result == false) + return result; + jsonObjectTop["Applications"]=apps; QJsonObject defaultValues; @@ -419,7 +424,7 @@ WorkflowAppEE_UQ::inputFromJSON(QJsonObject &jsonObject) theEventSelection->inputFromJSON(jsonObject); theRVs->inputFromJSON(jsonObject); theRunWidget->inputFromJSON(jsonObject); - + if (jsonObject.contains("EDP")) { QJsonObject edpObj = jsonObject["EDP"].toObject(); if (theEDP_Selection->inputFromJSON(edpObj) == false) @@ -441,6 +446,13 @@ WorkflowAppEE_UQ::inputFromJSON(QJsonObject &jsonObject) if (theSIM->inputFromJSON(jsonObject) == false) this->errorMessage("EE_UQ: failed to read SIM Method data"); + // sy - to display results + auto* theNewResults = theUQ_Selection->getResults(); + + if (theNewResults->inputFromJSON(jsonObject) == false) + this->errorMessage("EE_UQ: failed to read RES Method data"); + theResults->setResultWidget(theNewResults); + this->statusMessage("Done Loading File"); return true; From dc86f98451fbcdf99aa51fbe0fcbb93bb4d81def Mon Sep 17 00:00:00 2001 From: yisangriB Date: Wed, 4 Jan 2023 10:37:41 -0800 Subject: [PATCH 07/22] sy - selecting RSN and sending them to PEER NGA --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 199 +++++++++++++++++---------- EVENTS/peerNGA/NoSpectrumUniform.h | 3 +- 2 files changed, 131 insertions(+), 71 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 82b3aee6..6ebb5486 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : AbstractTargetWidget(parent) { @@ -48,53 +50,46 @@ QList> NoSpectrumUniform::spectrum() const return targetSectrum; } -QStringList NoSpectrumUniform::getRSN() -{ - // Test - //QStringList RSN({"6,14"}) ; - QStringList RSN; - // Write Json & Run the script - this->getUniformRSN(); - - // Read the RSN.out file as a stringlist - - return RSN; -} void NoSpectrumUniform::writeConfigJSON(QJsonObject &myJson) { myJson["numSampPerBin"]=numSampPerBin->text(); - QJsonObject imJson; theSCIMWidget_grid->outputToJSON(imJson); myJson.insert("IM", imJson); - // - // config - // +} + +void NoSpectrumUniform::getRSN(QStringList &RSN, QVector &additionalScaling) { + + RSN = QStringList({""}); + + QJsonObject configJSON; // Input information - QString tmpDirName = QString("tmp.SimCenter"); + // clean up working directory QDir workDir(SimCenterPreferences::getInstance()->getLocalWorkDir()); + QString tmpDirName("tmp.SimCenter"); + QString templateDir("templatedir"); QString tmpDirectory = workDir.absoluteFilePath(tmpDirName); - myJson["runDir"] = tmpDirectory; - -} + QDir destinationDirectory(tmpDirectory); + QString templateDirectory = destinationDirectory.absoluteFilePath(templateDir); -void NoSpectrumUniform::getUniformRSN(void) { + if(destinationDirectory.exists()) { + destinationDirectory.removeRecursively(); + } + destinationDirectory.mkpath(templateDirectory); // write json - QJsonObject configJSON; this->writeConfigJSON(configJSON); - QString templateDir("templatedir"); - QDir destinationDirectory(configJSON.value("runDir").toString()); - QString templateDirectory = destinationDirectory.absoluteFilePath(templateDir); - destinationDirectory.mkpath(templateDirectory); - QString inputFile = templateDirectory + QDir::separator() + tr("gridIM.json"); + // important + QString inputFilePath = templateDirectory + QDir::separator() + tr("gridIM_input.json"); + QString outputFilePath = templateDirectory + QDir::separator() + tr("gridIM_output.json"); + QString errFilePath = templateDirectory + QDir::separator() + tr("gridIM_log.err"); - qDebug() << "INPUT FILE: " << inputFile; - QFile file(inputFile); + qDebug() << "INPUT FILE: " << inputFilePath; + QFile file(inputFilePath); if (!file.open(QFile::WriteOnly | QFile::Text)) { return; } @@ -105,45 +100,59 @@ void NoSpectrumUniform::getUniformRSN(void) { qDebug() << "JSON: " << configJSON; // run myScript - QString tempDirectory = templateDirectory; - QString inputFilePath = inputFile; - - // qDebug() << "RUNTYPE" << runType; - //QString runType("runningLocal"); - //qDebug() << "RUNTYPE" << runType; QString appDir = SimCenterPreferences::getInstance()->getAppDir(); - //QString appName = QCoreApplication::applicationName(); qDebug() << "appDir: " << appDir; -// //TODO: recognize if it is PBE or EE-UQ -> probably smarter to do it inside the python file -// QString pySCRIPT; - QDir scriptDir(appDir +QDir::separator() + "applications"); -// //scriptDir.cd("applications"); -// //scriptDir.cd("Workflow"); -// //pySCRIPT = scriptDir.absoluteFilePath("qWHALE.py"); // invoke qWHALE to run GP surrogate prediction -// pySCRIPT = "Path/To/GMselector"; -// QFileInfo check_script(pySCRIPT); -// if (!check_script.exists() || !check_script.isFile()) { -// //emit sendErrorMessage(QString("NO SCRIPT FILE: ") + pySCRIPT); -// emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); -// return; -// } - - QString registryFile = scriptDir.absoluteFilePath("WorkflowApplications.json"); - qDebug() << "REGISTRY: " << registryFile; - QFileInfo check_registry(registryFile); + QDir scriptDir(appDir +QDir::separator()); + scriptDir.cd("applications"); + scriptDir.cd("Workflow"); + + QString registryFilePath = scriptDir.absoluteFilePath("WorkflowApplications.json"); + qDebug() << "REGISTRY: " << registryFilePath; + QFileInfo check_registry(registryFilePath); if (!check_registry.exists() || !check_registry.isFile()) { - //emit sendErrorMessage(QString("NO REGISTRY FILE: ") + registryFile); - emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); + return ; + } + + QFile registryFile(registryFilePath); + if (!registryFile.open(QFile::ReadOnly | QFile::Text)) { + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); return; } + // + // place contents of file into json object + // + + QByteArray tmp = registryFile.readAll(); + QJsonDocument jsonDoc = QJsonDocument::fromJson(tmp); + QJsonObject jsonObj = jsonDoc.object(); + + QJsonObject EVT_Apps1 = jsonObj["EventApplications"].toObject(); + QJsonArray EVT_Apps2 = EVT_Apps1["Applications"].toArray(); + + + QString GmSelectionScriptPath = ""; // python file + for(const QJsonValue& val: EVT_Apps2) { + QJsonObject loopObj = val.toObject(); + if (loopObj["Name"].toString() == "gridGroundMoionSelection") { + GmSelectionScriptPath = appDir + QDir::separator() + loopObj["ExecutablePath"].toString(); + } + } + + + QFileInfo check_selectionScript(GmSelectionScriptPath); + + if (!check_selectionScript.exists() || !check_selectionScript.isFile()) { + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); + return; + } -// qDebug() << "SCRIPT: " << pySCRIPT; QStringList files; //files << "dakota.in" << "dakota.out" << "dakotaTab.out" << "dakota.err"; - //qDebug() << "files: " << files; - files << "RSN.out"; + files << "gridIM_input.json"; + qDebug() << "files: " << files; // // now invoke dakota, done via a python script in tool app dircetory // @@ -159,6 +168,8 @@ void NoSpectrumUniform::getUniformRSN(void) { qDebug() << "python: " << python; QString exportPath("export PATH="); qDebug() << "exportPath: " << exportPath; + + bool colonYes = false; SimCenterPreferences *preferences = SimCenterPreferences::getInstance(); python = preferences->getPython(); @@ -171,18 +182,17 @@ void NoSpectrumUniform::getUniformRSN(void) { exportPath += pythonPath; pathEnv = pythonPath + ';' + pathEnv; } else { - //emit sendErrorMessage("NO VALID PYTHON - Read the Manual & Check your Preferences"); - emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); return; } -// exportPath += "$PATH"; -// procEnv.insert("PATH", pathEnv); -// procEnv.insert("PYTHONPATH", pythonPathEnv); -// proc->setProcessEnvironment(procEnv); + exportPath += "$PATH"; + procEnv.insert("PATH", pathEnv); + procEnv.insert("PYTHONPATH", pythonPathEnv); + proc->setProcessEnvironment(procEnv); QStringList args; - args << inputFile << registryFile; + args << GmSelectionScriptPath << files; #ifdef Q_OS_WIN python = QString("\"") + python + QString("\""); @@ -190,6 +200,7 @@ void NoSpectrumUniform::getUniformRSN(void) { qDebug() << python; qDebug() << args; + proc->setWorkingDirectory(templateDirectory); proc->start(python,args); bool failed = false; @@ -210,7 +221,7 @@ void NoSpectrumUniform::getUniformRSN(void) { } - if(0 != proc->exitCode()) + if((0 != proc->exitCode())&&(-1 != proc->exitCode())) // latter is caputred error { qDebug() << "Failed to run the workflow!!! exit code returned: " << proc->exitCode(); qDebug() << proc->errorString(); @@ -222,7 +233,7 @@ void NoSpectrumUniform::getUniformRSN(void) { { qDebug().noquote() << proc->readAllStandardOutput(); qDebug().noquote() << proc->readAllStandardError(); - emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); return; } @@ -277,15 +288,65 @@ void NoSpectrumUniform::getUniformRSN(void) { { qDebug().noquote() << proc->readAllStandardOutput(); qDebug().noquote() << proc->readAllStandardError(); - emit runComplete(false, configJSON.value("runDir").toString(), "surrogateSpectrum.csv"); + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); return; } #endif + qDebug() << "Output File Path" << outputFilePath; + QFile resultsFile(outputFilePath); + if (!resultsFile.open(QFile::ReadOnly | QFile::Text)) { + QFile errFile(errFilePath); + + QString line(""); + if (errFile.open(QIODevice::ReadOnly)) { + QTextStream in(&errFile); + while (!in.atEnd()) { + line = in.readLine(); + } + errFile.close(); + const_cast(this)->emit statusUpdated("RECORD SELECTION FAILED:" + line); + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); + return; + } else { + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); + return; + } + + + emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); + return; + } + + // + // place contents of file into json object + // + + QJsonDocument jsonOutDoc = QJsonDocument::fromJson(resultsFile.readAll()); + QJsonObject jsonOutObj = jsonOutDoc.object(); + + // + // Read GM RSN + // + QJsonArray RSN_array = jsonOutObj["gm_RSN"].toArray(); + for (int i=0; i > spectrum() const override; - QStringList getRSN(); + void getRSN(QStringList &RSN, QVector &additionalScaling); // double sds(); // double sd1(); // double tl(); From 772ea424b1e829330f16306f99ac8ced67a2b903 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Wed, 4 Jan 2023 10:41:56 -0800 Subject: [PATCH 08/22] sy - modification to have uniform IMs --- EVENTS/peerNGA/PEER_NGA_Records.cpp | 89 ++++++++++++++++++++--------- EVENTS/peerNGA/PEER_NGA_Records.h | 3 + 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index 9cb9b920..08c71335 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -211,12 +211,12 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) this->onScalingComboBoxChanged(0); // User-defined output directory - auto outdirGroup = new QGroupBox("Output Directory"); + auto outdirGroup = new QGroupBox("Temporary records Directory"); auto outdirLayout = new QGridLayout(outdirGroup); // add stuff to enter Output Directory - QLabel *labelOD = new QLabel("Output Directory"); + QLabel *labelOD = new QLabel("Temporary records Directory"); outdirLE = new QLineEdit; - outdirLE->setPlaceholderText("(Opional) Default:" + groundMotionsFolder.path()); + outdirLE->setPlaceholderText("(Opional) " + groundMotionsFolder.path()); QPushButton *chooseOutputDirectoryButton = new QPushButton(); chooseOutputDirectoryButton->setText(tr("Choose")); connect(chooseOutputDirectoryButton,SIGNAL(clicked()),this,SLOT(chooseOutputDirectory())); @@ -419,6 +419,29 @@ void PEER_NGA_Records::processPeerRecords(QDir resultFolder) if(!resultFolder.exists()) return; + + QString readMePathString = groundMotionsFolder.path() + QDir::separator() + QString("_readME.txt"); + QFileInfo readMeInfo(readMePathString); + if (readMeInfo.exists()) { + QFile readMeFile(readMePathString); + QString line(""); + if (readMeFile.open(QIODevice::ReadOnly)) { + QTextStream in(&readMeFile); + while (!in.atEnd()) { + line = in.readLine(); + } + readMeFile.close(); + } + if (line.contains("No records")) { + errorMessage(QString(QString("Failed to download PEER NGA records: ") + line)); + errorMessage(QString("The limit can be 100 per day, 200 per week, 400 per month")); + return; + } else { + infoMessage(QString(QString("Message from PEER NGA: ") + line)); + } + } + + clearSpectra(); currentRecords = parseSearchResults(resultFolder.filePath("_SearchResults.csv")); @@ -440,7 +463,7 @@ void PEER_NGA_Records::setRecordsTable(QList records) for(auto& record: records) { addTableItem(row, 0, QString::number(record.RSN)); - addTableItem(row, 1, QString::number(record.Scale)); + addTableItem(row, 1, QString::number(record.Scale, 'g', 2)); addTableItem(row, 2, record.Earthquake); addTableItem(row, 3, record.Station); addTableItem(row, 4, QString::number(record.Magnitude)); @@ -470,19 +493,22 @@ void PEER_NGA_Records::plotSpectra() { //Spectra can be plotted here using the data in //periods, targetSpectrum, meanSpectrum, meanPlusSigmaSpectrum, meanMinusSigmaSpectrum, scaledSelectedSpectra + if (spectrumTypeComboBox->currentIndex()!=6) { + recordSelectionPlot.setHidden(false); + recordSelectionPlot.setSelectedSpectra(periods, scaledSelectedSpectra); + recordSelectionPlot.setMean(periods, meanSpectrum); + recordSelectionPlot.setMeanPlusSigma(periods, meanPlusSigmaSpectrum); + recordSelectionPlot.setMeanMinusSigma(periods, meanMinusSigmaSpectrum); + recordSelectionPlot.setTargetSpectrum(periods, targetSpectrum); + + auto size = recordSelectionPlot.size(); + size.setWidth(size.height()); + recordSelectionPlot.setMinimumSize(size); + } - recordSelectionPlot.setHidden(false); - recordSelectionPlot.setSelectedSpectra(periods, scaledSelectedSpectra); - recordSelectionPlot.setMean(periods, meanSpectrum); - recordSelectionPlot.setMeanPlusSigma(periods, meanPlusSigmaSpectrum); - recordSelectionPlot.setMeanMinusSigma(periods, meanMinusSigmaSpectrum); - recordSelectionPlot.setTargetSpectrum(periods, targetSpectrum); - - auto size = recordSelectionPlot.size(); - size.setWidth(size.height()); - recordSelectionPlot.setMinimumSize(size); } + void PEER_NGA_Records::updateStatus(QString status) { statusMessage(status); @@ -531,6 +557,7 @@ void PEER_NGA_Records::selectRecords() if(durationCheckBox->checkState() == Qt::Checked) durationRange.setValue(qMakePair(durationMin->text().toDouble(), durationMax->text().toDouble())); + additionalScaling.clear(); if(targetSpectrumDetails->currentIndex() == 0) { auto asce710widget = reinterpret_cast(targetSpectrumDetails->currentWidget()); @@ -541,20 +568,25 @@ void PEER_NGA_Records::selectRecords() magnitudeRange, distanceRange, vs30Range,durationRange,groundMotionsComponentsBox->currentIndex()+1,suiteAverageBox->currentIndex(),faultTypeBox->currentIndex()+1,pulseBox->currentIndex()+1); + + // _ no additional scaling + additionalScaling = QVector(nRecordsEditBox->text().toInt(),1.0); } else if(targetSpectrumDetails->currentIndex() == 6) // no spectrum (uniform { auto unifrom_widget = reinterpret_cast(targetSpectrumDetails->currentWidget()); - - progressBar->setHidden("False"); - selectRecordsButton->setEnabled(false); - selectRecordsButton->setDown(true); - updateStatus("Retrieving ground motion RSN ..."); - auto RSN = unifrom_widget->getRSN(); // This will run a python script - peerClient.selectRecords(RSN); - - // TO ADD + QStringList RSN; + unifrom_widget->getRSN(RSN, additionalScaling); // This will run a python script + // additionalScaling are given in "sorted" RSN older. + RSN.removeAll(QString("")); + if (RSN.isEmpty()) { + return; + // TO ADD error messages here + } else { + peerClient.selectRecords(RSN); + //return; + } } else { @@ -576,7 +608,11 @@ void PEER_NGA_Records::selectRecords() selectRecordsButton->setEnabled(true); selectRecordsButton->setDown(false); } + + // _ no additional scaling + additionalScaling = QVector(nRecordsEditBox->text().toInt(),1.0); } + } void PEER_NGA_Records::addTableItem(int row, int column, QString value) @@ -601,7 +637,7 @@ QList PEER_NGA_Records::parseSearchResults(QString searchResul while (!searchResultsStream.atEnd()) { QString line = searchResultsStream.readLine(); - + int ng = 0; //Parsing selected records information if(line.contains("Metadata of Selected Records")) { @@ -620,13 +656,14 @@ QList PEER_NGA_Records::parseSearchResults(QString searchResul record.Distance = values[15].trimmed().toDouble(); record.Vs30 = values[16].trimmed().toDouble(); - record.Scale = values[4].toDouble(); + record.Scale = values[4].toDouble()*additionalScaling[ng]; record.Horizontal1File = values[19].trimmed(); record.Horizontal2File = values[20].trimmed(); record.VerticalFile = values[21].trimmed(); records.push_back(record); line = searchResultsStream.readLine(); + ng++; } } @@ -649,7 +686,7 @@ QList PEER_NGA_Records::parseSearchResults(QString searchResul scaledSelectedSpectra.resize(values.size() - 5); for (int i = 5; i < values.size(); i++) { - scaledSelectedSpectra[i-5].push_back(values[i].toDouble()); + scaledSelectedSpectra[i-5].push_back(values[i].toDouble()*additionalScaling[i-5]); } line = searchResultsStream.readLine(); } diff --git a/EVENTS/peerNGA/PEER_NGA_Records.h b/EVENTS/peerNGA/PEER_NGA_Records.h index bb990356..be19ab62 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.h +++ b/EVENTS/peerNGA/PEER_NGA_Records.h @@ -138,6 +138,9 @@ public slots: QString outdirpath; QString RecordsDir; + // Additional scaling + QVector additionalScaling; + void setupUI(GeneralInformationWidget* generalInfoWidget); void setupConnections(); void processPeerRecords(QDir resultFolder); From 287ac0a26034027b895a0993e074900d296f44d0 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 5 Jan 2023 21:57:47 -0800 Subject: [PATCH 09/22] sy - check if additional scaling file exists --- EVENTS/ExistingPEER_Records.cpp | 93 ++++++++++++++++++++++++++------- EVENTS/ExistingPEER_Records.h | 1 + 2 files changed, 74 insertions(+), 20 deletions(-) diff --git a/EVENTS/ExistingPEER_Records.cpp b/EVENTS/ExistingPEER_Records.cpp index cb3a89d9..d0f52dd0 100644 --- a/EVENTS/ExistingPEER_Records.cpp +++ b/EVENTS/ExistingPEER_Records.cpp @@ -56,6 +56,8 @@ UPDATES, ENHANCEMENTS, OR MODIFICATIONS. #include #include +#include + PeerRecord::PeerRecord(RandomVariablesContainer *theRV_IW, QWidget *parent) :SimCenterWidget(parent), theRandVariableIW(theRV_IW) { @@ -332,6 +334,10 @@ ExistingPEER_Records::ExistingPEER_Records(RandomVariablesContainer *theRV_IW, Q removeEvent->setText(tr("Remove")); // connect(removeEvent,SIGNAL(clicked()),this,SLOT(removeInputWidgetPeerEvent())); + QPushButton *removeAllEvent = new QPushButton(); + removeAllEvent->setMinimumWidth(100); + removeAllEvent->setMaximumWidth(100); + removeAllEvent->setText(tr("Remove All")); QPushButton *loadDirectory = new QPushButton(); loadDirectory->setMinimumWidth(150); @@ -343,6 +349,8 @@ ExistingPEER_Records::ExistingPEER_Records(RandomVariablesContainer *theRV_IW, Q titleLayout->addWidget(addEvent); titleLayout->addSpacing(20); titleLayout->addWidget(removeEvent); + titleLayout->addSpacing(20); + titleLayout->addWidget(removeAllEvent); titleLayout->addSpacing(50); titleLayout->addWidget(loadDirectory); titleLayout->addStretch(); @@ -369,6 +377,7 @@ ExistingPEER_Records::ExistingPEER_Records(RandomVariablesContainer *theRV_IW, Q connect(addEvent, SIGNAL(pressed()), this, SLOT(addEvent())); connect(removeEvent, SIGNAL(pressed()), this, SLOT(removeEvents())); + connect(removeAllEvent, SIGNAL(pressed()), this, SLOT(removeAllEvents())); connect(loadDirectory, SIGNAL(pressed()), this, SLOT(loadEventsFromDir())); } @@ -389,7 +398,7 @@ void ExistingPEER_Records::addEvent(void) void ExistingPEER_Records::loadEventsFromDir(void) { QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"), - "/home", + "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); @@ -454,32 +463,63 @@ void ExistingPEER_Records::loadEventsFromDir(void) { QFileInfo checkCsvFile(recordsCsv); if (checkCsvFile.exists() && checkCsvFile.isFile()) { this->parseSearchResults(directory.filePath("_SearchResults.csv")); - return; + } else { + QStringList fileList= directory.entryList(QStringList() << "*.AT2",QDir::Files); + foreach(QString fileName, fileList) { + + PeerEvent *theEvent = new PeerEvent(theRandVariableIW); + QString name = fileName; + name.chop(4); // remove .AT2 + if (name.contains("RSN")) { + name.remove(0,3); // remove RSN + int index = name.indexOf(QString("_")); + if (index != -1) + name=name.left(index); + } + + theEvent->theName->setText(name); + PeerRecord *theRecord = theEvent->theRecords.at(0); + if (theRecord != NULL) { + theRecord->file->setText(directory.filePath(fileName)); + } + theEvents.append(theEvent); + eventLayout->insertWidget(eventLayout->count()-1, theEvent); + } } + } - QStringList fileList= directory.entryList(QStringList() << "*.AT2",QDir::Files); - foreach(QString fileName, fileList) { - - PeerEvent *theEvent = new PeerEvent(theRandVariableIW); - QString name = fileName; - name.chop(4); // remove .AT2 - if (name.contains("RSN")) { - name.remove(0,3); // remove RSN - int index = name.indexOf(QString("_")); - if (index != -1) - name=name.left(index); + // check if there is additional scaling done in SimCenter UI eg. uniform Grid IM + QString scalingInfoPath(directory.filePath("gridIM_output.json")); + QFileInfo scalingInfoFile(scalingInfoPath); + if (scalingInfoFile.exists() && scalingInfoFile.isFile()) { + + // + // place contents of file into json object + // + QVector additionalScaling; + QFile scalingInfoFile(scalingInfoPath); + if (scalingInfoFile.open(QFile::ReadOnly | QFile::Text)) { + QJsonDocument jsonOutDoc = QJsonDocument::fromJson(scalingInfoFile.readAll()); + QJsonObject jsonOutObj = jsonOutDoc.object(); + + QJsonArray Scale_array = jsonOutObj["gm_scale"].toArray(); + for (int i=0; itheName->setText(name); - PeerRecord *theRecord = theEvent->theRecords.at(0); - if (theRecord != NULL) { - theRecord->file->setText(directory.filePath(fileName)); + } + + if (theEvents.size() == additionalScaling.size()) { + for (int i=0; itheRecords.size(); j++) { + PeerRecord *theRecord = theEvent->theRecords.at(j); + double curScale = theRecord->factor->text().toDouble(); + theRecord->factor->setText(QString::number(curScale*additionalScaling[i])); + } } - theEvents.append(theEvent); - eventLayout->insertWidget(eventLayout->count()-1, theEvent); } } - } void ExistingPEER_Records::removeEvents(void) @@ -498,6 +538,19 @@ void ExistingPEER_Records::removeEvents(void) } } +void ExistingPEER_Records::removeAllEvents(void) +{ + // find the ones selected & remove them + int numInputWidgetExistingEvents = theEvents.size(); + for (int i = numInputWidgetExistingEvents-1; i >= 0; i--) { + PeerEvent *theEvent = theEvents.at(i); + theEvent->close(); + eventLayout->removeWidget(theEvent); + theEvents.remove(i); + theEvent->setParent(0); + delete theEvent; + } +} void ExistingPEER_Records::clear(void) diff --git a/EVENTS/ExistingPEER_Records.h b/EVENTS/ExistingPEER_Records.h index 96adda5d..07d54ae8 100644 --- a/EVENTS/ExistingPEER_Records.h +++ b/EVENTS/ExistingPEER_Records.h @@ -123,6 +123,7 @@ class ExistingPEER_Records : public SimCenterAppWidget public slots: void addEvent(void); void removeEvents(void); + void removeAllEvents(void); void clear(void); void loadEventsFromDir(void); void parseSearchResults(QString searchResultsFilePath); From e1111fceedda598a2ac36c54975459d7e84198ce Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 5 Jan 2023 21:58:53 -0800 Subject: [PATCH 10/22] sy - changing default working dir and displaying total number of ground motions --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 43 +++++++++++++++++----------- EVENTS/peerNGA/NoSpectrumUniform.h | 12 ++++---- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 6ebb5486..8ee305ce 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -19,14 +19,18 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : AbstractTargetWidget(par numSampPerBin = new QLineEdit("4"); theSCIMWidget_grid = new SimCenterIntensityMeasureWidget(); theSCIMWidget_grid->addGridField(); + numTotalSamp = new QLabel("Total number of ground motions is 0."); layout->addWidget(new QLabel("# samples per bin"), 0, 0); layout->addWidget(numSampPerBin, 0, 1); layout->addWidget(theSCIMWidget_grid, 1, 0,1,-1); + layout->addWidget(numTotalSamp, 2, 0,1,-1); layout->setColumnStretch(2,1); -} + connect(theSCIMWidget_grid, SIGNAL(numBinsChanged(int)), this, SLOT(updateNumTotalSamp(int))); + +} QJsonObject NoSpectrumUniform::serialize() const { @@ -50,6 +54,10 @@ QList> NoSpectrumUniform::spectrum() const return targetSectrum; } +void NoSpectrumUniform::updateNumTotalSamp(int numBins) { + int num = numSampPerBin->text().toInt() * numBins; + numTotalSamp -> setText("The number of ground motions to be selected is " + QString::number(num) + "."); +} void NoSpectrumUniform::writeConfigJSON(QJsonObject &myJson) { @@ -60,33 +68,36 @@ void NoSpectrumUniform::writeConfigJSON(QJsonObject &myJson) { myJson.insert("IM", imJson); } -void NoSpectrumUniform::getRSN(QStringList &RSN, QVector &additionalScaling) { +void NoSpectrumUniform::getRSN(QString workDirPath, QStringList &RSN, QVector &additionalScaling, QString &imagePath) { RSN = QStringList({""}); QJsonObject configJSON; // Input information // clean up working directory - QDir workDir(SimCenterPreferences::getInstance()->getLocalWorkDir()); - QString tmpDirName("tmp.SimCenter"); - QString templateDir("templatedir"); - QString tmpDirectory = workDir.absoluteFilePath(tmpDirName); - QDir destinationDirectory(tmpDirectory); - QString templateDirectory = destinationDirectory.absoluteFilePath(templateDir); - - if(destinationDirectory.exists()) { - destinationDirectory.removeRecursively(); + //QDir workDir(SimCenterPreferences::getInstance()->getLocalWorkDir()); + //QDir workDir(workDirPath); + //QString tmpDirName("tmp.SimCenter"); + //QString templateDir("templatedir"); + //QString tmpDirectory = workDir.absoluteFilePath(tmpDirName); + QDir workDir(workDirPath); + + if(workDir.exists()) { + workDir.remove("gridIM_input.json"); + workDir.remove("gridIM_output.json"); + workDir.remove("gridIM_log.err"); + workDir.remove("gridIM_coverage.png"); } - destinationDirectory.mkpath(templateDirectory); // write json this->writeConfigJSON(configJSON); // important - QString inputFilePath = templateDirectory + QDir::separator() + tr("gridIM_input.json"); - QString outputFilePath = templateDirectory + QDir::separator() + tr("gridIM_output.json"); - QString errFilePath = templateDirectory + QDir::separator() + tr("gridIM_log.err"); + QString inputFilePath = workDirPath + QDir::separator() + tr("gridIM_input.json"); + QString outputFilePath = workDirPath + QDir::separator() + tr("gridIM_output.json"); + QString errFilePath = workDirPath + QDir::separator() + tr("gridIM_log.err"); + imagePath = workDirPath + QDir::separator() + tr("gridIM_coverage.png"); qDebug() << "INPUT FILE: " << inputFilePath; QFile file(inputFilePath); @@ -200,7 +211,7 @@ void NoSpectrumUniform::getRSN(QStringList &RSN, QVector &additionalScal qDebug() << python; qDebug() << args; - proc->setWorkingDirectory(templateDirectory); + proc->setWorkingDirectory(workDirPath); proc->start(python,args); bool failed = false; diff --git a/EVENTS/peerNGA/NoSpectrumUniform.h b/EVENTS/peerNGA/NoSpectrumUniform.h index 733d962a..46bff4fe 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.h +++ b/EVENTS/peerNGA/NoSpectrumUniform.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "AbstractTargetWidget.h" #include "SimCenterIntensityMeasureWidget.h" @@ -14,15 +15,17 @@ class NoSpectrumUniform : public AbstractTargetWidget public: explicit NoSpectrumUniform(QWidget *parent = nullptr); void writeConfigJSON(QJsonObject &myJson); + signals: void runComplete(bool, QString, QString); +public slots: + void updateNumTotalSamp(int); + private: -// QLineEdit* sdsEditBox; -// QLineEdit* sd1EditBox; -// QLineEdit* tlEditBox; QLineEdit* numSampPerBin; + QLabel* numTotalSamp; SimCenterIntensityMeasureWidget *theSCIMWidget_grid; QPushButton* selectRecordsButton; QProcess * proc; @@ -33,9 +36,8 @@ class NoSpectrumUniform : public AbstractTargetWidget // AbstractTargetWidget interface -public: QList > spectrum() const override; - void getRSN(QStringList &RSN, QVector &additionalScaling); + void getRSN(QString WorkDir, QStringList &RSN, QVector &additionalScaling, QString &imagePath); // double sds(); // double sd1(); // double tl(); From fdcf176c3f6bd6e3bbcfd0dd746ac870892cacec Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 5 Jan 2023 21:59:49 -0800 Subject: [PATCH 11/22] sy - displaying IM coverage if the uniform IM option is selected --- EVENTS/peerNGA/PEER_NGA_Records.cpp | 36 +++++++++++++++++++++++++---- EVENTS/peerNGA/PEER_NGA_Records.h | 3 +++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index 08c71335..d7914cd7 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -281,11 +281,15 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) peerCitation->setWordWrap(true); layout->addWidget(peerCitation, 4, 0, 1, 3); - //layout->addWidget(thePlottingWindow, 0,3,2,1); - layout->addWidget(&recordSelectionPlot, 0,3,4,1); + coverageImage = new QLabel(); + //add record selection plot + layout->addWidget(&recordSelectionPlot, 0,3,4,1); + layout->addWidget(coverageImage, 0,3,4,1); + coverageImage->setHidden(true); recordSelectionPlot.setHidden(true); + layout->setRowStretch(0,1); //layout->setRowStretch(layout->rowCount(), 1); layout->setColumnStretch(layout->columnCount(), 1); @@ -325,6 +329,14 @@ void PEER_NGA_Records::setupConnections() //Cleaning up previous search results if(tempRecordsDir.exists("_SearchResults.csv")) tempRecordsDir.remove("_SearchResults.csv"); + if(tempRecordsDir.exists("_readME.txt")) + tempRecordsDir.remove("_readME.txt"); + QDir it(RecordsDir, {"grid_IM*"}); + for(const QString & filename: it.entryList()){ + it.remove(filename); + } + + ZipUtils::UnzipFile(recordsFile, tempRecordsDir); processPeerRecords(tempRecordsDir); }); @@ -420,7 +432,7 @@ void PEER_NGA_Records::processPeerRecords(QDir resultFolder) return; - QString readMePathString = groundMotionsFolder.path() + QDir::separator() + QString("_readME.txt"); + QString readMePathString = RecordsDir + QDir::separator() + QString("_readME.txt"); QFileInfo readMeInfo(readMePathString); if (readMeInfo.exists()) { QFile readMeFile(readMePathString); @@ -493,6 +505,9 @@ void PEER_NGA_Records::plotSpectra() { //Spectra can be plotted here using the data in //periods, targetSpectrum, meanSpectrum, meanPlusSigmaSpectrum, meanMinusSigmaSpectrum, scaledSelectedSpectra + + coverageImage->setHidden(true); + recordSelectionPlot.setHidden(true); if (spectrumTypeComboBox->currentIndex()!=6) { recordSelectionPlot.setHidden(false); recordSelectionPlot.setSelectedSpectra(periods, scaledSelectedSpectra); @@ -504,6 +519,8 @@ void PEER_NGA_Records::plotSpectra() auto size = recordSelectionPlot.size(); size.setWidth(size.height()); recordSelectionPlot.setMinimumSize(size); + } else { + coverageImage->setHidden(false); } } @@ -577,7 +594,12 @@ void PEER_NGA_Records::selectRecords() auto unifrom_widget = reinterpret_cast(targetSpectrumDetails->currentWidget()); updateStatus("Retrieving ground motion RSN ..."); QStringList RSN; - unifrom_widget->getRSN(RSN, additionalScaling); // This will run a python script + QString imagePath; + RecordsDir = this->outdirLE->text(); + if (RecordsDir.isEmpty()) { + RecordsDir = groundMotionsFolder.path(); + } + unifrom_widget->getRSN(RecordsDir, RSN, additionalScaling, imagePath); // This will run a python script // additionalScaling are given in "sorted" RSN older. RSN.removeAll(QString("")); if (RSN.isEmpty()) { @@ -587,6 +609,12 @@ void PEER_NGA_Records::selectRecords() peerClient.selectRecords(RSN); //return; } + + QFile searchImageFile(imagePath); + if(searchImageFile.exists()) { + coverageImage->setPixmap(QPixmap(imagePath)); + } + } else { diff --git a/EVENTS/peerNGA/PEER_NGA_Records.h b/EVENTS/peerNGA/PEER_NGA_Records.h index be19ab62..ce9def03 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.h +++ b/EVENTS/peerNGA/PEER_NGA_Records.h @@ -133,6 +133,9 @@ public slots: QVector meanMinusSigmaSpectrum; QVector targetSpectrum; + //Display of coverage image + QLabel *coverageImage; + // Output directory QLineEdit* outdirLE; QString outdirpath; From 1c4867b31e478979d35aa789216b0907894e1f3f Mon Sep 17 00:00:00 2001 From: yisangriB Date: Tue, 10 Jan 2023 19:07:29 -0800 Subject: [PATCH 12/22] sy - emit error msg when same IM is selected twice --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 11 +++++++---- EVENTS/peerNGA/NoSpectrumUniform.h | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 8ee305ce..0f1b1df7 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -60,12 +60,12 @@ void NoSpectrumUniform::updateNumTotalSamp(int numBins) { } -void NoSpectrumUniform::writeConfigJSON(QJsonObject &myJson) { - +bool NoSpectrumUniform::writeConfigJSON(QJsonObject &myJson) { myJson["numSampPerBin"]=numSampPerBin->text(); QJsonObject imJson; - theSCIMWidget_grid->outputToJSON(imJson); + auto res = theSCIMWidget_grid->outputToJSON(imJson); myJson.insert("IM", imJson); + return res; } void NoSpectrumUniform::getRSN(QString workDirPath, QStringList &RSN, QVector &additionalScaling, QString &imagePath) { @@ -91,8 +91,11 @@ void NoSpectrumUniform::getRSN(QString workDirPath, QStringList &RSN, QVectorwriteConfigJSON(configJSON); + bool res = this->writeConfigJSON(configJSON); + if (res==false) { + return; + } // important QString inputFilePath = workDirPath + QDir::separator() + tr("gridIM_input.json"); QString outputFilePath = workDirPath + QDir::separator() + tr("gridIM_output.json"); diff --git a/EVENTS/peerNGA/NoSpectrumUniform.h b/EVENTS/peerNGA/NoSpectrumUniform.h index 46bff4fe..e4e05edf 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.h +++ b/EVENTS/peerNGA/NoSpectrumUniform.h @@ -14,7 +14,7 @@ class NoSpectrumUniform : public AbstractTargetWidget Q_OBJECT public: explicit NoSpectrumUniform(QWidget *parent = nullptr); - void writeConfigJSON(QJsonObject &myJson); + bool writeConfigJSON(QJsonObject &myJson); signals: void runComplete(bool, QString, QString); From fac491f510f6e9afeedcb4c5688e48f8c54e0a40 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Fri, 3 Feb 2023 18:03:01 -0800 Subject: [PATCH 13/22] sy - using QWebEngineView to display 3d plots --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 12 ++++++++--- EVENTS/peerNGA/PEER_NGA_Records.cpp | 31 +++++++++++++++++++++++----- EVENTS/peerNGA/PEER_NGA_Records.h | 6 +++++- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 0f1b1df7..9515da9f 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -57,6 +57,11 @@ QList> NoSpectrumUniform::spectrum() const void NoSpectrumUniform::updateNumTotalSamp(int numBins) { int num = numSampPerBin->text().toInt() * numBins; numTotalSamp -> setText("The number of ground motions to be selected is " + QString::number(num) + "."); + if (num>=100) { + numTotalSamp->setStyleSheet("QLabel {color: red;}"); + } else { + numTotalSamp->setStyleSheet("QLabel {color: black;}"); + } } @@ -86,7 +91,8 @@ void NoSpectrumUniform::getRSN(QString workDirPath, QStringList &RSN, QVector #include #include "SpectrumFromRegionalSurrogate.h" +#include PEER_NGA_Records::PEER_NGA_Records(GeneralInformationWidget* generalInfoWidget, QWidget *parent) : SimCenterAppWidget(parent), groundMotionsFolder(QDir::tempPath()) { @@ -35,6 +36,11 @@ PEER_NGA_Records::PEER_NGA_Records(GeneralInformationWidget* generalInfoWidget, setupConnections(); } +PEER_NGA_Records::~PEER_NGA_Records() +{ + coverageImage->deleteLater(); +} + void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) { auto layout = new QGridLayout(this); @@ -281,15 +287,25 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) peerCitation->setWordWrap(true); layout->addWidget(peerCitation, 4, 0, 1, 3); - coverageImage = new QLabel(); - //add record selection plot layout->addWidget(&recordSelectionPlot, 0,3,4,1); - layout->addWidget(coverageImage, 0,3,4,1); - coverageImage->setHidden(true); recordSelectionPlot.setHidden(true); + //coverageImage = new QLabel(); + //layout->addWidget(coverageImage, 0,3,4,1); + //coverageImage->setHidden(true); + + coverageImage = new QWebEngineView(); + coverageImage->page()->setBackgroundColor(Qt::transparent); + coverageImage->setHtml("Loading coverage image..."); + // sy - **NOTE** QWebEngineView display is VERY SLOW when the app is built in debug mode / Max size of figure is limited to 2MB + layout->addWidget(coverageImage, 0,3,4,1); + coverageImage->load(QUrl::fromLocalFile(("C:/Users/SimCenter/AppData/Local/Temp.oohpbs/gridIM_coverage.html"))); + // coverageImage ->page()-> deleteLater(); + //coverageImage->setHidden(true); + + layout->setRowStretch(0,1); //layout->setRowStretch(layout->rowCount(), 1); layout->setColumnStretch(layout->columnCount(), 1); @@ -609,10 +625,15 @@ void PEER_NGA_Records::selectRecords() peerClient.selectRecords(RSN); //return; } + //TEMP TESTING QFile searchImageFile(imagePath); if(searchImageFile.exists()) { - coverageImage->setPixmap(QPixmap(imagePath)); + //coverageImage->setPixmap(QPixmap(imagePath)); + coverageImage->load(QUrl::fromLocalFile((imagePath))); + coverageImage->show(); + } else { + coverageImage->setHidden(true); } } diff --git a/EVENTS/peerNGA/PEER_NGA_Records.h b/EVENTS/peerNGA/PEER_NGA_Records.h index ce9def03..e54009d4 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.h +++ b/EVENTS/peerNGA/PEER_NGA_Records.h @@ -17,6 +17,7 @@ #include #include #include +#include class QComboBox; @@ -47,6 +48,7 @@ class PEER_NGA_Records : public SimCenterAppWidget public: explicit PEER_NGA_Records(GeneralInformationWidget* generalInfoWidget, QWidget *parent = nullptr); + ~PEER_NGA_Records(); bool outputToJSON(QJsonObject &jsonObject) override; bool inputFromJSON(QJsonObject &jsonObject) override; @@ -134,7 +136,9 @@ public slots: QVector targetSpectrum; //Display of coverage image - QLabel *coverageImage; + //QLabel *coverageImage; + QWebEngineView * coverageImage; + // Output directory QLineEdit* outdirLE; From fa57182eea7108d73c007e01e06f168a6323424d Mon Sep 17 00:00:00 2001 From: yisangriB Date: Mon, 6 Feb 2023 20:32:34 -0800 Subject: [PATCH 14/22] sy - changing from AbstractTargetWidget to SimCenterAppWidget --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 56 ++++++++++++++-------------- EVENTS/peerNGA/NoSpectrumUniform.h | 8 ++-- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 0f1b1df7..f3d8d2ad 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -1,5 +1,7 @@ #include "NoSpectrumUniform.h" #include "SimCenterPreferences.h" +#include "SimCenterHtmlWidget.h" +#include "ModularPython.h" #include #include #include @@ -9,7 +11,7 @@ #include #include -NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : AbstractTargetWidget(parent) +NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : SimCenterAppWidget(parent) { auto layout = new QGridLayout(this); @@ -32,27 +34,27 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : AbstractTargetWidget(par } -QJsonObject NoSpectrumUniform::serialize() const -{ - QJsonObject json; - json["numSampPerBin"] = numSampPerBin->text(); - theSCIMWidget_grid->outputToJSON(json); - return json; -} +//QJsonObject NoSpectrumUniform::serialize() const +//{ +// QJsonObject json; +// json["numSampPerBin"] = numSampPerBin->text(); +// theSCIMWidget_grid->outputToJSON(json); +// return json; +//} -void NoSpectrumUniform::deserialize(const QJsonObject &json) +/*oid NoSpectrumUniform::deserialize(const QJsonObject &json) { QJsonObject* myNonRefJson = const_cast(&json); numSampPerBin->setText(json["numSampPerBin"].toString()); theSCIMWidget_grid->inputFromJSON(*myNonRefJson); -} +}*/ -QList> NoSpectrumUniform::spectrum() const -{ - QList> targetSectrum; - return targetSectrum; -} +//QList> NoSpectrumUniform::spectrum() const +//{ +// QList> targetSectrum; +// return targetSectrum; +//} void NoSpectrumUniform::updateNumTotalSamp(int numBins) { int num = numSampPerBin->text().toInt() * numBins; @@ -86,7 +88,7 @@ void NoSpectrumUniform::getRSN(QString workDirPath, QStringList &RSN, QVectorrun(GmSelectionScriptPath,files); +/* proc = new QProcess(this); proc->setProcessChannelMode(QProcess::SeparateChannels); qDebug() << "setProcessChannelMode"; @@ -307,7 +313,7 @@ void NoSpectrumUniform::getRSN(QString workDirPath, QStringList &RSN, QVector(this)->emit statusUpdated("RECORD SELECTION FAILED:" + line); - emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); + errorMessage("RECORD SELECTION FAILED:" + line); return; } else { - emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); return; } - - emit runComplete(false, configJSON.value("runDir").toString(), "gridIM_output.json"); return; } @@ -358,7 +360,7 @@ void NoSpectrumUniform::getRSN(QString workDirPath, QStringList &RSN, QVector > spectrum() const override; + //QList > spectrum() const override; void getRSN(QString WorkDir, QStringList &RSN, QVector &additionalScaling, QString &imagePath); // double sds(); // double sd1(); From 48ae46c95d67875b5ff04b33f488efe5fbed1141 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Wed, 8 Feb 2023 11:10:32 -0800 Subject: [PATCH 15/22] sy - cleaning up some lines --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 1 - EVENTS/peerNGA/PEER_NGA_Records.cpp | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index 13900481..c38a14de 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -1,6 +1,5 @@ #include "NoSpectrumUniform.h" #include "SimCenterPreferences.h" -#include "SimCenterHtmlWidget.h" #include "ModularPython.h" #include #include diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index 7fee6e80..c49424f3 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -38,7 +38,7 @@ PEER_NGA_Records::PEER_NGA_Records(GeneralInformationWidget* generalInfoWidget, PEER_NGA_Records::~PEER_NGA_Records() { - coverageImage->deleteLater(); + //coverageImage->deleteLater(); } void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) @@ -296,14 +296,13 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) //layout->addWidget(coverageImage, 0,3,4,1); //coverageImage->setHidden(true); + // sy - **NOTE** QWebEngineView display is VERY SLOW in debug mode / Max size of figure is limited to 2MB coverageImage = new QWebEngineView(); coverageImage->page()->setBackgroundColor(Qt::transparent); coverageImage->setHtml("Loading coverage image..."); - // sy - **NOTE** QWebEngineView display is VERY SLOW when the app is built in debug mode / Max size of figure is limited to 2MB layout->addWidget(coverageImage, 0,3,4,1); - coverageImage->load(QUrl::fromLocalFile(("C:/Users/SimCenter/AppData/Local/Temp.oohpbs/gridIM_coverage.html"))); - // coverageImage ->page()-> deleteLater(); - //coverageImage->setHidden(true); + coverageImage->setHidden(true); + //coverageImage->load(QUrl::fromLocalFile(("C:/Users/SimCenter/AppData/Local/Temp.oohpbs/gridIM_coverage.html"))); layout->setRowStretch(0,1); From a0f5cfcab045fc8af7b207ea030718cda5f1a0ec Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 9 Feb 2023 18:25:59 -0800 Subject: [PATCH 16/22] sy - modifying json for uniform IM GMs --- EVENTS/peerNGA/PEER_NGA_Records.cpp | 49 +++++++++++++++-------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index c49424f3..e096be30 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -829,36 +829,39 @@ bool PEER_NGA_Records::outputToJSON(QJsonObject &jsonObject) jsonObject["Events"] = eventsArray; - auto spectrumJson = dynamic_cast(targetSpectrumDetails->currentWidget())->serialize(); - spectrumJson["SpectrumType"] = spectrumTypeComboBox->currentText(); - jsonObject["TargetSpectrum"] = spectrumJson; + if (spectrumTypeComboBox->currentText() != QString("No Spectrum - Uniform IMs")) + { + auto spectrumJson = dynamic_cast(targetSpectrumDetails->currentWidget())->serialize(); + spectrumJson["SpectrumType"] = spectrumTypeComboBox->currentText(); + jsonObject["TargetSpectrum"] = spectrumJson; - jsonObject["scaling"] = scalingComboBox->currentText(); - jsonObject["singlePeriod"] = scalingPeriodLineEdit->text(); - jsonObject["periodPoints"] = periodPointsLineEdit->text(); - jsonObject["weights"] = weightsLineEdit->text(); + jsonObject["scaling"] = scalingComboBox->currentText(); + jsonObject["singlePeriod"] = scalingPeriodLineEdit->text(); + jsonObject["periodPoints"] = periodPointsLineEdit->text(); + jsonObject["weights"] = weightsLineEdit->text(); - jsonObject["components"] = groundMotionsComponentsBox->currentText(); - jsonObject["faultType"] = faultTypeBox->currentText(); - jsonObject["pulse"] = pulseBox->currentText(); + jsonObject["components"] = groundMotionsComponentsBox->currentText(); + jsonObject["faultType"] = faultTypeBox->currentText(); + jsonObject["pulse"] = pulseBox->currentText(); - jsonObject["records"] = nRecordsEditBox->text(); + jsonObject["records"] = nRecordsEditBox->text(); - jsonObject["magnitudeRange"] = magnitudeCheckBox->isChecked(); - jsonObject["magnitudeMin"] = magnitudeMin->text(); - jsonObject["magnitudeMax"] = magnitudeMax->text(); + jsonObject["magnitudeRange"] = magnitudeCheckBox->isChecked(); + jsonObject["magnitudeMin"] = magnitudeMin->text(); + jsonObject["magnitudeMax"] = magnitudeMax->text(); - jsonObject["distanceRange"] = distanceCheckBox->isChecked(); - jsonObject["distanceMin"] = distanceMin->text(); - jsonObject["distanceMax"] = distanceMax->text(); + jsonObject["distanceRange"] = distanceCheckBox->isChecked(); + jsonObject["distanceMin"] = distanceMin->text(); + jsonObject["distanceMax"] = distanceMax->text(); - jsonObject["vs30Range"] = vs30CheckBox->isChecked(); - jsonObject["vs30Min"] = vs30Min->text(); - jsonObject["vs30Max"] = vs30Max->text(); + jsonObject["vs30Range"] = vs30CheckBox->isChecked(); + jsonObject["vs30Min"] = vs30Min->text(); + jsonObject["vs30Max"] = vs30Max->text(); - jsonObject["durationRange"] = durationCheckBox->isChecked(); - jsonObject["durationMin"] = durationMin->text(); - jsonObject["durationMax"] = durationMax->text(); + jsonObject["durationRange"] = durationCheckBox->isChecked(); + jsonObject["durationMin"] = durationMin->text(); + jsonObject["durationMax"] = durationMax->text(); + } return true; } From 3819d92fa8d7562e3b812f5b319b97e8a3fbd9bb Mon Sep 17 00:00:00 2001 From: yisangriB Date: Mon, 20 Feb 2023 12:11:19 -0800 Subject: [PATCH 17/22] sy - downloading batch (>100) ground motion from PEER --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 1 + EVENTS/peerNGA/PEER_NGA_Records.cpp | 57 +++++++++++++++++++++++----- EVENTS/peerNGA/PEER_NGA_Records.h | 5 ++- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index c38a14de..f7a8a100 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -30,6 +30,7 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : SimCenterAppWidget(pare layout->setColumnStretch(2,1); connect(theSCIMWidget_grid, SIGNAL(numBinsChanged(int)), this, SLOT(updateNumTotalSamp(int))); + connect(numSampPerBin, SIGNAL(textChanged(int)), this, SLOT(updateNumTotalSamp(int))); } diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index e096be30..480aaa1b 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -28,7 +28,6 @@ #include #include "SpectrumFromRegionalSurrogate.h" #include - PEER_NGA_Records::PEER_NGA_Records(GeneralInformationWidget* generalInfoWidget, QWidget *parent) : SimCenterAppWidget(parent), groundMotionsFolder(QDir::tempPath()) { setupUI(generalInfoWidget); @@ -303,10 +302,10 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) layout->addWidget(coverageImage, 0,3,4,1); coverageImage->setHidden(true); //coverageImage->load(QUrl::fromLocalFile(("C:/Users/SimCenter/AppData/Local/Temp.oohpbs/gridIM_coverage.html"))); - + RSN=QStringList(); // for batchRSN + numDownloaded = 0; // for batchRSN layout->setRowStretch(0,1); - //layout->setRowStretch(layout->rowCount(), 1); layout->setColumnStretch(layout->columnCount(), 1); } @@ -318,7 +317,7 @@ void PEER_NGA_Records::setupConnections() connect(selectRecordsButton, &QPushButton::clicked, this, [this]() { - + currentRecords.clear(); if(!peerClient.loggedIn()) { PeerLoginDialog loginDialog(&peerClient, this); @@ -350,9 +349,8 @@ void PEER_NGA_Records::setupConnections() for(const QString & filename: it.entryList()){ it.remove(filename); } - - ZipUtils::UnzipFile(recordsFile, tempRecordsDir); + processPeerRecords(tempRecordsDir); }); @@ -468,10 +466,20 @@ void PEER_NGA_Records::processPeerRecords(QDir resultFolder) } } - clearSpectra(); + auto tmpList = parseSearchResults(resultFolder.filePath("_SearchResults.csv")); + currentRecords = currentRecords + tmpList; + //if (currentRecords.length()!=numDownloaded) { + // errorMessage(QString("Some records are missing")); + //} + if (!RSN.isEmpty()) + { + this->downloadRecordBatch(); + return; + // "_SearchResults.csv" + } + - currentRecords = parseSearchResults(resultFolder.filePath("_SearchResults.csv")); setRecordsTable(currentRecords); plotSpectra(); @@ -608,7 +616,6 @@ void PEER_NGA_Records::selectRecords() { auto unifrom_widget = reinterpret_cast(targetSpectrumDetails->currentWidget()); updateStatus("Retrieving ground motion RSN ..."); - QStringList RSN; QString imagePath; RecordsDir = this->outdirLE->text(); if (RecordsDir.isEmpty()) { @@ -621,7 +628,11 @@ void PEER_NGA_Records::selectRecords() return; // TO ADD error messages here } else { - peerClient.selectRecords(RSN); + //peerClient.selectRecords(RSN); + if (!RSN.isEmpty()) + { + this->downloadRecordBatch(); + } //return; } //TEMP TESTING @@ -663,6 +674,32 @@ void PEER_NGA_Records::selectRecords() } +void PEER_NGA_Records::downloadRecordBatch(void) +{ + if(RSN.empty()) + return; + + + const int peerBatchSize = 100; + + if(RSN.size() < peerBatchSize) + { + peerClient.selectRecords(RSN); + numDownloaded = RSN.size(); + + RSN.clear(); + } + else + { + auto recordsBatch = RSN.mid(0,peerBatchSize); + + peerClient.selectRecords(recordsBatch); + numDownloaded += peerBatchSize; + + RSN = RSN.mid(peerBatchSize,RSN.size()-peerBatchSize); + } +} + void PEER_NGA_Records::addTableItem(int row, int column, QString value) { auto item = new QTableWidgetItem(value); diff --git a/EVENTS/peerNGA/PEER_NGA_Records.h b/EVENTS/peerNGA/PEER_NGA_Records.h index e54009d4..46dcd10e 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.h +++ b/EVENTS/peerNGA/PEER_NGA_Records.h @@ -72,6 +72,8 @@ public slots: private: + void downloadRecordBatch(); + // widget groups QGroupBox *recordSelectionGroup; QGridLayout *targetSpectrumLayout; @@ -147,7 +149,8 @@ public slots: // Additional scaling QVector additionalScaling; - + QStringList RSN; + int numDownloaded; void setupUI(GeneralInformationWidget* generalInfoWidget); void setupConnections(); void processPeerRecords(QDir resultFolder); From be9988ffda40ab086d285b0a803ebdc8a5f957e2 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 16 Mar 2023 16:12:25 -0700 Subject: [PATCH 18/22] sy - fixing slots in surrogate --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 10 +++++++--- EVENTS/peerNGA/NoSpectrumUniform.h | 2 ++ EVENTS/peerNGA/PEER_NGA_Records.cpp | 14 +++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index f7a8a100..e579d869 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -17,10 +17,11 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : SimCenterAppWidget(pare auto positiveDoubleValidator = new QDoubleValidator(); positiveDoubleValidator->setBottom(0.0); - numSampPerBin = new QLineEdit("4"); + numSampPerBin = new QLineEdit("1"); theSCIMWidget_grid = new SimCenterIntensityMeasureWidget(); theSCIMWidget_grid->addGridField(); numTotalSamp = new QLabel("Total number of ground motions is 0."); + numBin=0; layout->addWidget(new QLabel("# samples per bin"), 0, 0); layout->addWidget(numSampPerBin, 0, 1); @@ -30,7 +31,9 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : SimCenterAppWidget(pare layout->setColumnStretch(2,1); connect(theSCIMWidget_grid, SIGNAL(numBinsChanged(int)), this, SLOT(updateNumTotalSamp(int))); - connect(numSampPerBin, SIGNAL(textChanged(int)), this, SLOT(updateNumTotalSamp(int))); + connect(numSampPerBin, &QLineEdit::textChanged, this, [=](QString txt) { + this->updateNumTotalSamp(numBin); + }); } @@ -57,7 +60,8 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : SimCenterAppWidget(pare //} void NoSpectrumUniform::updateNumTotalSamp(int numBins) { - int num = numSampPerBin->text().toInt() * numBins; + numBin = numBins; + int num = numSampPerBin->text().toInt() * numBin; numTotalSamp -> setText("The number of ground motions to be selected is " + QString::number(num) + "."); if (num>=100) { numTotalSamp->setStyleSheet("QLabel {color: red;}"); diff --git a/EVENTS/peerNGA/NoSpectrumUniform.h b/EVENTS/peerNGA/NoSpectrumUniform.h index fc56faf6..bf04b57d 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.h +++ b/EVENTS/peerNGA/NoSpectrumUniform.h @@ -30,6 +30,8 @@ public slots: QPushButton* selectRecordsButton; QProcess * proc; + int numBin; + public: //QJsonObject serialize() const override; //void deserialize(const QJsonObject &json) override; diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index 480aaa1b..b48b7f5a 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -298,7 +298,7 @@ void PEER_NGA_Records::setupUI(GeneralInformationWidget* generalInfoWidget) // sy - **NOTE** QWebEngineView display is VERY SLOW in debug mode / Max size of figure is limited to 2MB coverageImage = new QWebEngineView(); coverageImage->page()->setBackgroundColor(Qt::transparent); - coverageImage->setHtml("Loading coverage image..."); + //coverageImage->setHtml("Loading coverage image..."); layout->addWidget(coverageImage, 0,3,4,1); coverageImage->setHidden(true); //coverageImage->load(QUrl::fromLocalFile(("C:/Users/SimCenter/AppData/Local/Temp.oohpbs/gridIM_coverage.html"))); @@ -409,7 +409,7 @@ void PEER_NGA_Records::setupConnections() connect(spectrumTypeComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index){ targetSpectrumDetails->setCurrentIndex(index); if(spectrumTypeComboBox->currentText().contains("No Spectrum")) { - double newHeight = targetSpectrumDetails->height(); + //double newHeight = targetSpectrumDetails->height(); double newWidth = targetSpectrumDetails->width(); newWidth += recordSelectionGroup->width(); @@ -417,10 +417,14 @@ void PEER_NGA_Records::setupConnections() //targetSpectrumDetails->resize(newHeight, newWidth); targetSpectrumDetails->setMinimumWidth(newWidth); //widget->resize(165, widget->height()); - + scalingComboBox->setDisabled(true); + suiteAverageBox->setCurrentIndex(1); + suiteAverageBox->setDisabled(true); } else { recordSelectionGroup->setVisible(true); targetSpectrumDetails->setMinimumWidth(10); // some random number + scalingComboBox->setDisabled(false); + suiteAverageBox->setDisabled(false); } return; }); @@ -637,9 +641,9 @@ void PEER_NGA_Records::selectRecords() } //TEMP TESTING - QFile searchImageFile(imagePath); + QFile searchImageFile(imagePath); //html image if(searchImageFile.exists()) { - //coverageImage->setPixmap(QPixmap(imagePath)); + //coverageImage->setPixmap(QPixmap(imagePath)); // for png coverageImage->load(QUrl::fromLocalFile((imagePath))); coverageImage->show(); } else { From 0eb2497c24ca373dc5f363167aced0a0e96e902e Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 30 Mar 2023 19:43:02 -0700 Subject: [PATCH 19/22] sy - fixing reading from/writing to json --- EVENTS/peerNGA/NoSpectrumUniform.cpp | 17 +++++++++++++++++ EVENTS/peerNGA/NoSpectrumUniform.h | 2 ++ EVENTS/peerNGA/PEER_NGA_Records.cpp | 25 ++++++++++++++++++------- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/EVENTS/peerNGA/NoSpectrumUniform.cpp b/EVENTS/peerNGA/NoSpectrumUniform.cpp index e579d869..8a2a9391 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.cpp +++ b/EVENTS/peerNGA/NoSpectrumUniform.cpp @@ -37,6 +37,23 @@ NoSpectrumUniform::NoSpectrumUniform(QWidget *parent) : SimCenterAppWidget(pare } +bool NoSpectrumUniform::outputToJSON(QJsonObject &jsonObject) +{ + jsonObject["numSampPerBin"] = numSampPerBin->text().toInt(); + QJsonObject jsonIM; + bool result = theSCIMWidget_grid->outputToJSON(jsonIM); + jsonObject["IntensityMeasure"] = jsonIM; + return result; +} + +bool NoSpectrumUniform::inputFromJSON(QJsonObject &jsonObject) +{ + numSampPerBin->setText(QString::number(jsonObject["numSampPerBin"].toInt())); + bool result =theSCIMWidget_grid->inputFromJSON(jsonObject); + return result; +} + + //QJsonObject NoSpectrumUniform::serialize() const //{ // QJsonObject json; diff --git a/EVENTS/peerNGA/NoSpectrumUniform.h b/EVENTS/peerNGA/NoSpectrumUniform.h index bf04b57d..958d078d 100644 --- a/EVENTS/peerNGA/NoSpectrumUniform.h +++ b/EVENTS/peerNGA/NoSpectrumUniform.h @@ -15,6 +15,8 @@ class NoSpectrumUniform : public SimCenterAppWidget public: explicit NoSpectrumUniform(QWidget *parent = nullptr); bool writeConfigJSON(QJsonObject &myJson); + bool outputToJSON(QJsonObject &jsonObject); + bool inputFromJSON(QJsonObject &jsonObject); signals: void runComplete(bool, QString, QString); diff --git a/EVENTS/peerNGA/PEER_NGA_Records.cpp b/EVENTS/peerNGA/PEER_NGA_Records.cpp index b48b7f5a..a69cce09 100644 --- a/EVENTS/peerNGA/PEER_NGA_Records.cpp +++ b/EVENTS/peerNGA/PEER_NGA_Records.cpp @@ -870,17 +870,17 @@ bool PEER_NGA_Records::outputToJSON(QJsonObject &jsonObject) jsonObject["Events"] = eventsArray; + jsonObject["scaling"] = scalingComboBox->currentText(); + jsonObject["singlePeriod"] = scalingPeriodLineEdit->text(); + jsonObject["periodPoints"] = periodPointsLineEdit->text(); + jsonObject["weights"] = weightsLineEdit->text(); + if (spectrumTypeComboBox->currentText() != QString("No Spectrum - Uniform IMs")) { auto spectrumJson = dynamic_cast(targetSpectrumDetails->currentWidget())->serialize(); spectrumJson["SpectrumType"] = spectrumTypeComboBox->currentText(); jsonObject["TargetSpectrum"] = spectrumJson; - jsonObject["scaling"] = scalingComboBox->currentText(); - jsonObject["singlePeriod"] = scalingPeriodLineEdit->text(); - jsonObject["periodPoints"] = periodPointsLineEdit->text(); - jsonObject["weights"] = weightsLineEdit->text(); - jsonObject["components"] = groundMotionsComponentsBox->currentText(); jsonObject["faultType"] = faultTypeBox->currentText(); jsonObject["pulse"] = pulseBox->currentText(); @@ -902,6 +902,11 @@ bool PEER_NGA_Records::outputToJSON(QJsonObject &jsonObject) jsonObject["durationRange"] = durationCheckBox->isChecked(); jsonObject["durationMin"] = durationMin->text(); jsonObject["durationMax"] = durationMax->text(); + } else { + QJsonObject spectrumJson; + spectrumJson["SpectrumType"] = "No Spectrum - Uniform IMs"; + jsonObject["TargetSpectrum"] = spectrumJson; + dynamic_cast(targetSpectrumDetails->currentWidget())->outputToJSON(jsonObject); } return true; @@ -912,9 +917,15 @@ bool PEER_NGA_Records::inputFromJSON(QJsonObject &jsonObject) if(jsonObject["TargetSpectrum"].isObject() && jsonObject["TargetSpectrum"].toObject().keys().contains("SpectrumType")) { auto targetSpectrumJson = jsonObject["TargetSpectrum"].toObject(); + spectrumTypeComboBox->setCurrentIndex(0); spectrumTypeComboBox->setCurrentText(jsonObject["TargetSpectrum"].toObject()["SpectrumType"].toString()); - dynamic_cast(targetSpectrumDetails->currentWidget())->deserialize(jsonObject["TargetSpectrum"].toObject()); - } + + if (spectrumTypeComboBox->currentText() != QString("No Spectrum - Uniform IMs")) { + dynamic_cast(targetSpectrumDetails->currentWidget())->deserialize(jsonObject["TargetSpectrum"].toObject()); + } else { + dynamic_cast(targetSpectrumDetails->currentWidget())->inputFromJSON(jsonObject); + } + }; scalingComboBox->setCurrentText(jsonObject["scaling"].toString()); scalingPeriodLineEdit->setText(jsonObject["singlePeriod"].toString()); From 669c3e9dbb7110561d71659e2e4d3c534965f16c Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 30 Mar 2023 19:43:19 -0700 Subject: [PATCH 20/22] sy - adding surrogate examples --- Examples/eeuq-0009/README.rst | 68 +++++++++++++++++++++++ Examples/eeuq-0009/figures/EE09_EVT.png | Bin 0 -> 39137 bytes Examples/eeuq-0009/figures/EE09_EVT2.png | Bin 0 -> 95187 bytes Examples/eeuq-0009/figures/EE09_SIM.png | Bin 0 -> 60324 bytes Examples/eeuq-0009/figures/EE09_UQ.png | Bin 0 -> 68620 bytes Examples/eeuq-0009/meta.yaml | 2 + 6 files changed, 70 insertions(+) create mode 100644 Examples/eeuq-0009/README.rst create mode 100644 Examples/eeuq-0009/figures/EE09_EVT.png create mode 100644 Examples/eeuq-0009/figures/EE09_EVT2.png create mode 100644 Examples/eeuq-0009/figures/EE09_SIM.png create mode 100644 Examples/eeuq-0009/figures/EE09_UQ.png create mode 100644 Examples/eeuq-0009/meta.yaml diff --git a/Examples/eeuq-0009/README.rst b/Examples/eeuq-0009/README.rst new file mode 100644 index 00000000..03ee2b91 --- /dev/null +++ b/Examples/eeuq-0009/README.rst @@ -0,0 +1,68 @@ + +Surrogate Model for Structural Response Prediction (Gaussian Process) +=========================================================================================================== + +Pre-trained Gaussian Process Surrogate Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This example shows how to train a surrogate model that can replace structural dyanmic simulations once it is trained using a small set of simulations. +The ground motions are selected from the PEER NGA database + +.. warning:: To reproduce the result of this example, user should first click **EVT** and **Select Records**, and then click the **RUN** button. See the below procedure for details. + +Configure Surrogate Target Spectrum +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. In **UQ tab** select the **SimCenterUQ** as **UQ Engine**. Select the **Train GP Surrogate Model** in the method. + + .. figure:: EE09_UQ/Fig.png + :name: UQ inputs + :align: center + :width: 600 + :figclass: align-center + + Below are the details of the selected inputs: + + - **Number of Samples** : same as the ground motions to be selected in the EVT tab, 64. This is has freedom when stochastic ground motion is selected. Typically, as the number of samples increases, surrogate modeling accuracy will increase + - **Max Computation Time** : 60 mins (default) + - **Target Accuracy** : 0.02. EE-UQ will give warning when this accuracy target is not met + - **Random Seed** : Random seed generator used to reproduce the exact random samples + - **Parallel Execution** : True. This will perform dynamic simulations in parallel + + - **Advanced Options for Gaussian Process Model** : False. By default, EE-UQ takes **Martern 5/2**, **Log-space transform of QoI**, **Heteroskedastic nugget variance** options. + - **Existing Data set** : False. This is useful when one hopes to resume the surrogate model training after training is finished by performing more simulations + - **Intensity Measure Calculation**: Select the intensity measures to be used as the input of surrogate model. + +2. The **GI tab** is kept as default. + +3. In **SIM tab**, the specifics of the target structural model is provided via **MDOF** building generator. One story building is created having stiffness as an input parameter. + + + .. figure:: figures/EE09_UQ.png + :name: UQ inputs + :align: center + :width: 600 + :figclass: align-center + + +4. In **EVT tab**, **PEER NGA ground motion records** is selected. Theoretically the more diverse the intensity measures are, the more likely to reasonably capture the aleatory uncertainty in the earthquake source. + + + .. figure:: figures/EE09_EVT.png + :name: UQ inputs + :align: center + :width: 600 + :figclass: align-center + + + .. figure:: figures/EE09_EVT2.png + :name: UQ inputs + :align: center + :width: 600 + :figclass: align-center + + +5. The **FEM tab** is kept as default. + +6. The **EDP tab** is kept as default. For the surrogate model to be compatible with the PBE and other applications, it should follow the naming of the Standard Earthquake. + diff --git a/Examples/eeuq-0009/figures/EE09_EVT.png b/Examples/eeuq-0009/figures/EE09_EVT.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c797264d2bf26ff59c944656d1d804088c4b19 GIT binary patch literal 39137 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�C7R2}yuaSxe}jbr*GTEq(nRqjZ&-=?u1FPm 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%0D6+Pq1HP-%m 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
    l7hCx%Vs#i%?Vzjzb{tnq>{S~h#tvXx^tJZ za(UCVQ@<5a0}ym!9(TnUcEZL&&!w0Dob{B_usIV4GwvF|j>D?gyZ8;5Vy!78J0mMEaU$5HmbPSZP3t@f@u%FRauV>~Sue_grbf|}>eKCOkLk{}N4^U}8^39nQ zQbJP$QEuQ@fEibuWG0$F6QUwCB`!bBgQQo?-rd_1P;*fr z0`SU!0vXMh1;R6V3J8bhX_OaHg6KQ@?|t=$xudiW$n%$iHyR4#s+^Ff{j&^+PmCCA zN2$WjyXwe&vKX|j3$W0!q-Utjbo2VWQ+ioAYiFD>I(wkb5bdKCcuWie<;m8l@`BiVK-$QQe8sxuDY0&7Oz_?W3R9+W5XdCqm0#(@N(A!@fKH20f%EP zd`v#3wFa&p%h>{W+pHa4M!`ASKL(u=h3`GVKPITp8=-b?6+Xd}KtDko%&&X6zDoa) z59T}K^@+%)Go^02;@_Jbh6hml+0}|iOtEk>)A3ybc_r#ig7F!cwpJk;&?#E?EU*2Q+FB0%1!w>e@7OYX6fp>ED5ugd@ zJOif?-SX|?8}pw19pwW66Xf^X(Lh7Iq(7K6(gWq26z*sSjRAgaVE&q*kS06sk{yPtF+w%4@u91rMMQ zi%CAf?(;-VWPtN*m;d7CDyL1bqAHgKrpp@Tc)L{)=28O(jWZALYi?URYUzFu~$NiYN zKWtGJkG(91tMz z7l!ssR8l%L0lLP;-o=Vula_==``Ydr}+y+X)=I) z#woqf#UM^^g^fsXJL91Fd6!8{Am0w(D-DD)xe2_C+z(U)ADYusF?mhELs(e=6yM#> zu)zYWKr`LbN&s~JG|IW#6y9{YOGT}np7xyK-_8x9H-w0JvHMgnL68J5V}BO;xj27E zx2%1boIG)*vaQE9onlT@Q-|-3`z5L-H7)FZ5h?&#<`~Ym&V-@XjX;e)*NRe-_l(I+ zpL^SrQ;(B>;PEEfKR0=sD4b@Og2$FCsIW7e$q?*#eb4~6>l;m7{w(p{xZ@1EkH-FP zvZ+6I4ugkgQ(czsqIzl<4zjZ+^Kfftr$%q+haQTxIh)aZTD)(_NIm{x5;T;t47wri zCyz4(h&CR`Q6@&l4$W3d9ptLgDWCG@+o)#eoPT36r|=Vwt5kg<&DhCBxY$F?DOrh!}UD@`J=<+V6Z z3qH$&iDr7DQxf#(?{q$I>YSfKGPJno@I3)Oomz!~HI2?pXFbbpwM!5zvksWZ+Kh5% ztG9{mslSY{9_sn1)O++iPl<74+oSl5>}{P5cflEI3x8)jdDA_WZ{}H4Qx#4_`@L_0 zJP=~CU)*{sxUz~NXHU#z(?XEbS6?n(n_)tV!eP(Wf??zV^fv4^Wv=+LF11Qn1`X3# z#nqbw?jE-o<456xwi!c1dn%HD{FqmOEE`HZ#ed59H=hq1I=A^DD6Tv4_fnE78TCT& zXN9(Rl@(ZAD}3|RciD+jug895|N7+c7u&#t3jS^hl}XC~WnY$8#U}Z%$+B%f3;O0^1KT+ADh0gu50BGUb5kC?nKh3uNgnf-Oiz7 z4Vn(cSs1a<|5Qr{Z!cz4uLxcuwe`Wba}6N}76iYvCc4jm)6$T&F3IuL3%$r({ZsA1 z4cb82U%#)2FSqFq8vjkpR{wQizI6S8ufDw4uoQe3oBTk>b-uYxYrkO*E3`=RngSoo zRR42SAM}qP%zr(7RnPkVUq99_e*ayxt-tyISEK!Z@s&BOZcX>Kj1;T+?TwPY-qtf7 M=TDN|uKxKy0Ebm>3;+NC literal 0 HcmV?d00001 diff --git a/Examples/eeuq-0009/figures/EE09_SIM.png b/Examples/eeuq-0009/figures/EE09_SIM.png new file mode 100644 index 0000000000000000000000000000000000000000..14c733d0b305679a34d095dc5a8da50561f16577 GIT binary patch literal 60324 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�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

    mM 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 AssI20 literal 0 HcmV?d00001 diff --git a/Examples/eeuq-0009/meta.yaml b/Examples/eeuq-0009/meta.yaml new file mode 100644 index 00000000..8fc517d4 --- /dev/null +++ b/Examples/eeuq-0009/meta.yaml @@ -0,0 +1,2 @@ +summary: This example demonstrates the training of Gaussian Process (GP) model to predict the peak seismic response +difficulty: 2 From 0df48478d37202241a49e84c239d97ea984f7cd0 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Thu, 30 Mar 2023 19:43:39 -0700 Subject: [PATCH 21/22] sy - adding surrogate option --- WorkflowAppEE_UQ.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WorkflowAppEE_UQ.cpp b/WorkflowAppEE_UQ.cpp index 9dad703d..1dc7ed6b 100644 --- a/WorkflowAppEE_UQ.cpp +++ b/WorkflowAppEE_UQ.cpp @@ -108,7 +108,7 @@ WorkflowAppEE_UQ::WorkflowAppEE_UQ(RemoteService *theService, QWidget *parent) theSIM = new SIM_Selection(false, false); theEventSelection = new EarthquakeEventSelection(theRVs, theGI); theAnalysisSelection = new FEA_Selection(false); - theUQ_Selection = new UQ_EngineSelection(ForwardReliabilitySensitivity); + theUQ_Selection = new UQ_EngineSelection(ForwardReliabilitySensitivitySurrogate); theEDP_Selection = new EDP_EarthquakeSelection(theRVs); theResults = theUQ_Selection->getResults(); From 52abcb9fb22353b816844add4a9c084f9a5465a2 Mon Sep 17 00:00:00 2001 From: yisangriB Date: Fri, 31 Mar 2023 08:48:27 -0700 Subject: [PATCH 22/22] sy - adding surrogate GP examples --- Examples/Examples.json | 6 ++++++ Examples/index.json | 27 ++++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Examples/Examples.json b/Examples/Examples.json index 6e2a7536..71b08270 100644 --- a/Examples/Examples.json +++ b/Examples/Examples.json @@ -36,5 +36,11 @@ "description": "This example demonstrates using pre-trained Gaussian Process (GP) model to get target response spectrum for ground motion selection and scaling.", "inputFile": "eeuq-0007/src/input.json" } + , + { + "name": "E9: Surrogate Model: GP", + "description": "This example demonstrates to develop surrogate models for seismic structural responses.", + "inputFile": "eeuq-0009/src/input.json" + } ] } diff --git a/Examples/index.json b/Examples/index.json index aa7ff1ad..f76e5c9f 100644 --- a/Examples/index.json +++ b/Examples/index.json @@ -203,18 +203,23 @@ "Difficulty": "0", "Simulation": "OpenSees-Simulation" } - } - }, - "categories": { - "Difficulty": { - "0": "Beginner", - "1": "Intermediate", - "2": "Advanced" }, - "Simulation": { - "IMasEDP": "IMasEDP", - "OpenSees-Simulation": "OpenSees", - "OpenSeesPy-Simulation": "OpenSeesPy" + "eeuq-0009": { + "id": "eeuq-0009", + "title": "Surrogate Model for Structural Response Prediction (Gaussian Process)", + "base": "eeuq-0009", + "doc": [ + "eeuq-0009/figures/Fig.png", + "eeuq-0009/README.rst" + ], + "entry_point": "eeuq-0009/./input.json", + "summary": "This surrogates seismic structural responses using a Gaussian Process model", + "logo": "figures/Fig.png", + "published": "2022-07-10T21:26:53.946381-08:00", + "categories": { + "Difficulty": "2", + "Simulation": "OpenSees-Simulation" + } } } }