diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp index 1101f362eb12a8eda04b5e410fe34ae59fb10bb0..38cd285201403bbc9de636c389b10d965eb54864 100644 --- a/GUI/coregui/Models/DomainSimulationBuilder.cpp +++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp @@ -25,6 +25,7 @@ #include "DetectorItems.h" #include "DomainObjectBuilder.h" #include "TransformToDomain.h" +#include "SimulationOptionsItem.h" #include "GUIHelpers.h" #include <QDebug> #include <memory> @@ -54,7 +55,8 @@ GISASSimulation *DomainSimulationBuilder::getSimulation(SampleModel *sampleModel //! Creates domain simulation from sample and instrument items. GISASSimulation *DomainSimulationBuilder::getSimulation(const MultiLayerItem *sampleItem, - const InstrumentItem *instrumentItem) + const InstrumentItem *instrumentItem, + const SimulationOptionsItem *optionsItem) { if(!sampleItem || !instrumentItem) { QString message("DomainSimulationBuilder::getSimulation() -> Error. Either MultiLayerItem " @@ -74,5 +76,9 @@ GISASSimulation *DomainSimulationBuilder::getSimulation(const MultiLayerItem *sa TransformToDomain::addMasksToSimulation(*instrumentItem->getDetectorItem(), result); + + if(optionsItem) + TransformToDomain::setSimulationOptions(result, *optionsItem); + return result; } diff --git a/GUI/coregui/Models/DomainSimulationBuilder.h b/GUI/coregui/Models/DomainSimulationBuilder.h index 6a0f4ead7baf6aa366beaa40024deeb59539a49c..2fc49ed0692d63642fabb45eda682ae95ea7daf7 100644 --- a/GUI/coregui/Models/DomainSimulationBuilder.h +++ b/GUI/coregui/Models/DomainSimulationBuilder.h @@ -24,6 +24,7 @@ class SampleModel; class InstrumentModel; class MultiLayerItem; class InstrumentItem; +class SimulationOptionsItem; //! The DomainSimulationBuilder class builds the domain simulation //! from instrument and sample models. @@ -36,7 +37,9 @@ public: static GISASSimulation *getSimulation(SampleModel *sampleModel, InstrumentModel *instrumentModel); - static GISASSimulation *getSimulation(const MultiLayerItem *sampleItem, const InstrumentItem *instrumentItem); + static GISASSimulation *getSimulation(const MultiLayerItem *sampleItem, + const InstrumentItem *instrumentItem, + const SimulationOptionsItem *optionsItem = 0); }; diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp index 76425ee540a33b185bc27de22cb6300a22f2029a..27f68b08fe998ccd7a65c8e3e1c7a7b667c1e294 100644 --- a/GUI/coregui/Models/JobItem.cpp +++ b/GUI/coregui/Models/JobItem.cpp @@ -169,10 +169,11 @@ void JobItem::setEndTime(const QString &end_time) setItemValue(P_END_TIME, end_time); } +// Sets duration (msec -> "sec.msec") void JobItem::setDuration(int duration) { QString str; - str.sprintf("%6.3f", duration/1000.); + str.sprintf("%7.3f", duration/1000.); setItemValue(P_DURATION, str.simplified()); } @@ -198,22 +199,22 @@ void JobItem::setProgress(int progress) int JobItem::getNumberOfThreads() const { - return getSimulationOptions()->getNumberOfThreads(); + return getSimulationOptionsItem()->getNumberOfThreads(); } void JobItem::setRunPolicy(const QString &run_policy) { - getSimulationOptions()->setRunPolicy(run_policy); + getSimulationOptionsItem()->setRunPolicy(run_policy); } bool JobItem::runImmediately() const { - return getSimulationOptions()->runImmediately(); + return getSimulationOptionsItem()->runImmediately(); } bool JobItem::runInBackground() const { - return getSimulationOptions()->runInBackground(); + return getSimulationOptionsItem()->runInBackground(); } //! Returns MultiLayerItem of this JobItem, if from_backup=true, then backup'ed version of @@ -238,12 +239,12 @@ void JobItem::setResults(const GISASSimulation *simulation) JobResultsPresenter::setResults(intensityItem, simulation); } -SimulationOptionsItem *JobItem::getSimulationOptions() +SimulationOptionsItem *JobItem::getSimulationOptionsItem() { - return const_cast<SimulationOptionsItem *>(static_cast<const JobItem*>(this)->getSimulationOptions()); + return const_cast<SimulationOptionsItem *>(static_cast<const JobItem*>(this)->getSimulationOptionsItem()); } -const SimulationOptionsItem *JobItem::getSimulationOptions() const +const SimulationOptionsItem *JobItem::getSimulationOptionsItem() const { const SimulationOptionsItem *result = dynamic_cast<const SimulationOptionsItem *>(getItem(T_SIMULATION_OPTIONS)); if(!result) { diff --git a/GUI/coregui/Models/JobItem.h b/GUI/coregui/Models/JobItem.h index 5572086342e1de16294c96d1cce7dc89bc008ed4..ae720a4d3065efbd521666942ad0d07a3f3f7ceb 100644 --- a/GUI/coregui/Models/JobItem.h +++ b/GUI/coregui/Models/JobItem.h @@ -86,11 +86,12 @@ public: InstrumentItem *getInstrumentItem(); + SimulationOptionsItem *getSimulationOptionsItem(); + void setResults(const GISASSimulation *simulation); private: - SimulationOptionsItem *getSimulationOptions(); - const SimulationOptionsItem *getSimulationOptions() const; + const SimulationOptionsItem *getSimulationOptionsItem() const; }; #endif // NJOBITEM_H diff --git a/GUI/coregui/Models/JobQueueData.cpp b/GUI/coregui/Models/JobQueueData.cpp index 376e164d03917ccde6c760ae2bcf5a954f097788..1ff6e9f9423da5a86ae4a2298d7db69a1dc4a8f3 100644 --- a/GUI/coregui/Models/JobQueueData.cpp +++ b/GUI/coregui/Models/JobQueueData.cpp @@ -99,7 +99,8 @@ void JobQueueData::runJob(JobItem *jobItem) GISASSimulation *simulation(0); try{ simulation = DomainSimulationBuilder::getSimulation(jobItem->getMultiLayerItem(), - jobItem->getInstrumentItem()); + jobItem->getInstrumentItem(), + jobItem->getSimulationOptionsItem()); } catch(const std::exception &ex) { QString message("JobQueueData::runJob() -> Error. Attempt to create sample/instrument object from user description " "has failed with following error message.\n\n"); @@ -112,7 +113,7 @@ void JobQueueData::runJob(JobItem *jobItem) return; } - simulation->getOptions().setNumberOfThreads(jobItem->getNumberOfThreads()); +// simulation->getOptions().setNumberOfThreads(jobItem->getNumberOfThreads()); m_simulations[identifier] = simulation; JobRunner *runner = new JobRunner(identifier, simulation); diff --git a/GUI/coregui/Models/SimulationOptionsItem.cpp b/GUI/coregui/Models/SimulationOptionsItem.cpp index 75651d329ef43245ef9ec659b455b834f7bcc396..9f8419750ec14ba6aef137302981be196a466479 100644 --- a/GUI/coregui/Models/SimulationOptionsItem.cpp +++ b/GUI/coregui/Models/SimulationOptionsItem.cpp @@ -117,6 +117,16 @@ void SimulationOptionsItem::setRunPolicy(const QString &policy) setItemValue(P_RUN_POLICY, combo.getVariant()); } +QString SimulationOptionsItem::getComputationMethod() const +{ + return getItemValue(P_COMPUTATION_METHOD).toString(); +} + +int SimulationOptionsItem::getNumberOfMonteCarloPoints() const +{ + return getItemValue(P_MC_POINTS).toInt(); +} + //! returns list with number of threads to select QStringList SimulationOptionsItem::getCPUUsageOptions() { diff --git a/GUI/coregui/Models/SimulationOptionsItem.h b/GUI/coregui/Models/SimulationOptionsItem.h index b93ddac2d52bd8c2e60f020217d1d63d51ed538d..814137109b5509f0c2530047d38d453417dcea29 100644 --- a/GUI/coregui/Models/SimulationOptionsItem.h +++ b/GUI/coregui/Models/SimulationOptionsItem.h @@ -40,6 +40,10 @@ public: void setRunPolicy(const QString &policy); + QString getComputationMethod() const; + + int getNumberOfMonteCarloPoints() const; + private: QStringList getCPUUsageOptions(); }; diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp index a9b14291c6c6c152e777e5ec92a7bb27dfe8e643..1e12f2c331c53aa1480483763d3bf33682308d04 100644 --- a/GUI/coregui/Models/TransformToDomain.cpp +++ b/GUI/coregui/Models/TransformToDomain.cpp @@ -50,6 +50,7 @@ #include "BornAgainNamespace.h" #include "ParticleDistributionItem.h" #include "FTDecayFunctionItems.h" +#include "SimulationOptionsItem.h" #include <QDebug> @@ -404,6 +405,21 @@ void TransformToDomain::addMasksToSimulation(const SessionItem &detector_item, } +void TransformToDomain::setSimulationOptions(GISASSimulation *simulation, + const SessionItem &item) +{ + Q_ASSERT(item.modelType() == Constants::SimulationOptionsType); + + if(auto optionItem = dynamic_cast<const SimulationOptionsItem *>(&item)) { + simulation->getOptions().setNumberOfThreads(optionItem->getNumberOfThreads()); + if(optionItem->getComputationMethod() == Constants::SIMULATION_MONTECARLO) { + simulation->getOptions().setMonteCarloIntegration(true, + optionItem->getNumberOfMonteCarloPoints()); + } + } + +} + void TransformToDomain::setTransformationInfo(IParticle *result, const SessionItem &item) { diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h index e73d52a6e2a6948eca52d5d0188c5b08b925129d..eafe2eb0826d736f5c0ed02c308f06d9fbf34c94 100644 --- a/GUI/coregui/Models/TransformToDomain.h +++ b/GUI/coregui/Models/TransformToDomain.h @@ -45,6 +45,8 @@ BA_CORE_API_ void addDistributionParametersToSimulation(const SessionItem &beam_ GISASSimulation *simulation); BA_CORE_API_ void addMasksToSimulation(const SessionItem &detector_item, GISASSimulation *simulation); +BA_CORE_API_ void setSimulationOptions(GISASSimulation *simulation, const SessionItem &item); + BA_CORE_API_ void setTransformationInfo(IParticle *result, const SessionItem &item); BA_CORE_API_ void setPositionInfo(IParticle *result, const SessionItem &item); BA_CORE_API_ void setRotationInfo(IParticle *result, const SessionItem &item);