Newer
Older
// ************************************************************************************************
// BornAgain: simulate and fit reflection and scattering
Pospelov, Gennady
committed
//! @brief Implements class JobItem
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
// ************************************************************************************************
#include "GUI/Models/JobItem.h"
#include "GUI/Models/Data1DViewItem.h"
#include "GUI/Models/FitSuiteItem.h"
#include "GUI/Models/InstrumentItems.h"
#include "GUI/Models/IntensityDataItem.h"
#include "GUI/Models/ItemFileNameUtils.h"
#include "GUI/Models/JobItemUtils.h"
#include "GUI/Models/MaterialItemContainer.h"
#include "GUI/Models/MultiLayerItem.h"
#include "GUI/Models/ParameterTreeItems.h"
#include "GUI/Models/RealDataItem.h"
#include "GUI/Models/SimulationOptionsItem.h"
#include "GUI/Models/SpecularDataItem.h"
#include "GUI/utils/GUIHelpers.h"
const QString JobItem::P_IDENTIFIER = "Identifier";
const QString JobItem::P_SAMPLE_NAME = "Sample";
const QString JobItem::P_INSTRUMENT_NAME = "Instrument";
const QString JobItem::P_WITH_FITTING = "With fitting";
const QString JobItem::P_BEGIN_TIME = "Begin time";
const QString JobItem::P_END_TIME = "End time";
const QString JobItem::P_DURATION = "Duration";
const QString JobItem::P_COMMENTS = "Comments";
const QString JobItem::P_PROGRESS = "Progress";
const QString JobItem::P_PRESENTATION_TYPE = "Presentation type";
const QString JobItem::T_SAMPLE = "Sample tag";
const QString JobItem::T_MATERIAL_CONTAINER = "Material container tag";
const QString JobItem::T_INSTRUMENT = "Instrument tag";
const QString JobItem::T_OUTPUT = "Output tag";
const QString JobItem::T_REALDATA = "Real Data tag";
const QString JobItem::T_DATAVIEW = "Data View tag";
const QString JobItem::T_PARAMETER_TREE = "Parameter tree tag";
const QString JobItem::T_SIMULATION_OPTIONS = "Simulation options tag";
const QString JobItem::T_FIT_SUITE = "Fit suite tag";
JobItem::JobItem() : SessionItem("JobItem")
{

Wuttke, Joachim
committed
setItemName("JobItem");
addProperty(P_IDENTIFIER, QString())->setVisible(false);
addProperty(P_SAMPLE_NAME, QString())->setEditable(false);
addProperty(P_INSTRUMENT_NAME, QString())->setEditable(false);
Pospelov, Gennady
committed
addProperty(P_WITH_FITTING, false)->setVisible(false);

Wuttke, Joachim
committed
addProperty(P_STATUS, "Idle")->setEditable(false);
Pospelov, Gennady
committed
addProperty(P_BEGIN_TIME, QString())->setEditable(false);
addProperty(P_END_TIME, QString())->setEditable(false);
Pospelov, Gennady
committed
auto durationItem = addProperty(P_DURATION, QString());
durationItem->setEditable(false);
durationItem->setToolTip("Duration of DWBA simulation in sec.msec format");
addProperty(P_COMMENTS, QString())->setVisible(false);
addProperty(P_PROGRESS, 0)->setVisible(false);
addProperty(P_PRESENTATION_TYPE, QVariant::Type::Invalid)->setVisible(false);
Pospelov, Gennady
committed

Wuttke, Joachim
committed
registerTag(T_SAMPLE, 1, 1, QStringList() << "MultiLayer");
registerTag(T_MATERIAL_CONTAINER, 1, 1, QStringList{"MaterialContainer"});
registerTag(T_INSTRUMENT, 1, 1, { GISASInstrumentItem::M_TYPE,
OffSpecularInstrumentItem::M_TYPE,
SpecularInstrumentItem::M_TYPE,
DepthProbeInstrumentItem::M_TYPE });
registerTag(T_OUTPUT, 1, 1, { IntensityDataItem::M_TYPE,
SpecularDataItem::M_TYPE });

Wuttke, Joachim
committed
registerTag(T_REALDATA, 1, 1, QStringList() << "RealData");
registerTag(T_DATAVIEW, 1, 1, QStringList() << "Data1DViewItem");
registerTag(T_PARAMETER_TREE, 0, -1, QStringList() << "Parameter Container");
Pospelov, Gennady
committed

Wuttke, Joachim
committed
registerTag(T_SIMULATION_OPTIONS, 1, 1, QStringList() << "SimulationOptions");

Wuttke, Joachim
committed
registerTag(T_FIT_SUITE, 1, 1, QStringList() << "FitSuite");
Pospelov, Gennady
committed
mapper()->setOnChildPropertyChange([this](SessionItem* item, const QString& name) {
if (item->parent() == this && dynamic_cast<DataItem*>(item)
&& DataItem::isAxesUnitsPropertyName(name))
dynamic_cast<DataItem*>(item)->updateCoords(instrumentItem());
Pospelov, Gennady
committed
Pospelov, Gennady
committed
mapper()->setOnPropertyChange([this](const QString& name) {
if (name == P_NAME)
Pospelov, Gennady
committed
updateIntensityDataFileName();
Pospelov, Gennady
committed
});
Pospelov, Gennady
committed
}
QString JobItem::getIdentifier() const
{
return getItemValue(P_IDENTIFIER).toString();
void JobItem::setIdentifier(const QString& identifier)
{
setItemValue(JobItem::P_IDENTIFIER, identifier);
IntensityDataItem* JobItem::intensityDataItem()
{
return dynamic_cast<IntensityDataItem*>(getItem(T_OUTPUT));
DataItem* JobItem::dataItem()
{
return dynamic_cast<DataItem*>(getItem(T_OUTPUT));
}
QString JobItem::getStatus() const
{
return getItemValue(P_STATUS).toString();
void JobItem::setStatus(const QString& status)
{
setItemValue(P_STATUS, status);

Wuttke, Joachim
committed
if (status == "Failed") {
if (DataItem* intensityItem = dataItem()) {
Pospelov, Gennady
committed
if (intensityItem->getOutputData())
Pospelov, Gennady
committed
intensityItem->getOutputData()->setAllTo(0.0);
Pospelov, Gennady
committed
emit intensityItem->emitDataChanged();
Pospelov, Gennady
committed
}
bool JobItem::isStatusPropertyName(const QString& name)
{
return name == P_STATUS;
}
bool JobItem::isIdle() const
{

Wuttke, Joachim
committed
return getStatus() == "Idle";
bool JobItem::isRunning() const
{

Wuttke, Joachim
committed
return getStatus() == "Running";
bool JobItem::isCompleted() const
{

Wuttke, Joachim
committed
return getStatus() == "Completed";
bool JobItem::isCanceled() const
{

Wuttke, Joachim
committed
return getStatus() == "Canceled";
bool JobItem::isFailed() const
{

Wuttke, Joachim
committed
return getStatus() == "Failed";
bool JobItem::isValidForFitting()
{
return isTag(T_REALDATA) && getItem(T_REALDATA);
void JobItem::setBeginTime(const QString& begin_time)
{
setItemValue(P_BEGIN_TIME, begin_time);
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;
Pospelov, Gennady
committed
if (duration != 0)
str = QString("%7.3f").arg(duration / 1000.);
setItemValue(P_DURATION, str.simplified());
}
QString JobItem::getComments() const
{
return getItemValue(P_COMMENTS).toString();
void JobItem::setComments(const QString& comments)
{
setItemValue(P_COMMENTS, comments);
bool JobItem::isCommentsPropertyName(const QString& name)
{
return name == P_COMMENTS;
}
int JobItem::getProgress() const
{
return getItemValue(P_PROGRESS).toInt();
void JobItem::setProgress(int progress)
{
setItemValue(P_PROGRESS, progress);
bool JobItem::runImmediately() const
{
Pospelov, Gennady
committed
return simulationOptionsItem()->runImmediately();
bool JobItem::runInBackground() const
{
Pospelov, Gennady
committed
return simulationOptionsItem()->runInBackground();
Pospelov, Gennady
committed
return dynamic_cast<MultiLayerItem*>(getItem(T_SAMPLE));
Pospelov, Gennady
committed
}
MultiLayerItem* JobItem::copySampleIntoJob(const MultiLayerItem* sample)
{
return model()->copyItem(sample, this, T_SAMPLE);
}
InstrumentItem* JobItem::instrumentItem()
{
return dynamic_cast<InstrumentItem*>(getItem(T_INSTRUMENT));
Pospelov, Gennady
committed
}
void JobItem::setResults(const ISimulation* simulation)
{
JobItemUtils::setResults(dataItem(), simulation);
Pospelov, Gennady
committed
updateIntensityDataFileName();
}
FitSuiteItem* JobItem::fitSuiteItem()
{
Pospelov, Gennady
committed
return dynamic_cast<FitSuiteItem*>(getItem(JobItem::T_FIT_SUITE));
}
ParameterContainerItem* JobItem::parameterContainerItem()
{
return const_cast<ParameterContainerItem*>(
static_cast<const JobItem*>(this)->parameterContainerItem());
}
const ParameterContainerItem* JobItem::parameterContainerItem() const
{
Pospelov, Gennady
committed
return dynamic_cast<ParameterContainerItem*>(getItem(JobItem::T_PARAMETER_TREE));
}
FitParameterContainerItem* JobItem::fitParameterContainerItem()
{
Pospelov, Gennady
committed
if (FitSuiteItem* item = fitSuiteItem())
return item->fitParameterContainerItem();
return nullptr;
}
RealDataItem* JobItem::realDataItem()
{
Pospelov, Gennady
committed
return dynamic_cast<RealDataItem*>(getItem(JobItem::T_REALDATA));
}
MaterialItemContainer* JobItem::materialContainerItem() const
return static_cast<MaterialItemContainer*>(getItem(JobItem::T_MATERIAL_CONTAINER));
}
MaterialItemContainer* JobItem::createMaterialContainer()
{
return model()->insertItem<MaterialItemContainer>
(this, -1, T_MATERIAL_CONTAINER);
}
Data1DViewItem* JobItem::dataItemView()
{
return dynamic_cast<Data1DViewItem*>(getItem(JobItem::T_DATAVIEW));
void JobItem::setSampleName(const QString& name)
{
getItem(P_SAMPLE_NAME)->setValue(name);
}
void JobItem::setInstrumentName(const QString& name)
{
getItem(P_INSTRUMENT_NAME)->setValue(name);
}
const QString JobItem::presentationType() const
{
return getItemValue(P_PRESENTATION_TYPE).toString();
}
void JobItem::setPresentationType(const QString& type)
{
setItemValue(P_PRESENTATION_TYPE, type);
}
Pospelov, Gennady
committed
//! Updates the name of file to store intensity data.
void JobItem::updateIntensityDataFileName()
{
item->setFileName(ItemFileNameUtils::jobResultsFileName(*this));
if (RealDataItem* realItem = realDataItem()) {
if (DataItem* item = realItem->dataItem())
item->setFileName(ItemFileNameUtils::jobReferenceFileName(*this));
if (DataItem* item = realItem->nativeData())
item->setFileName(ItemFileNameUtils::jobNativeDataFileName(*this));
Pospelov, Gennady
committed
}
SimulationOptionsItem* JobItem::simulationOptionsItem()
{
Pospelov, Gennady
committed
return const_cast<SimulationOptionsItem*>(
static_cast<const JobItem*>(this)->simulationOptionsItem());
Pospelov, Gennady
committed
}
const SimulationOptionsItem* JobItem::simulationOptionsItem() const
{
Gennady Pospelov
committed
return item<const SimulationOptionsItem>(T_SIMULATION_OPTIONS);