BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
JobModel.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/JobModel.cpp
6 //! @brief Implements class JobModel
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
31 
32 JobModel::JobModel(QObject* parent)
33  : SessionModel(SessionXML::JobModelTag, parent), m_queue_data(nullptr)
34 {
35  m_queue_data = new JobQueueData(this);
38  setObjectName(SessionXML::JobModelTag);
39 }
40 
42 {
43  delete m_queue_data;
44 }
45 
46 const JobItem* JobModel::getJobItemForIndex(const QModelIndex& index) const
47 {
48  const JobItem* result = dynamic_cast<const JobItem*>(itemForIndex(index));
49  ASSERT(result);
50  return result;
51 }
52 
53 JobItem* JobModel::getJobItemForIndex(const QModelIndex& index)
54 {
55  JobItem* result = dynamic_cast<JobItem*>(itemForIndex(index));
56  ASSERT(result);
57  return result;
58 }
59 
60 JobItem* JobModel::getJobItemForIdentifier(const QString& identifier)
61 {
62  QModelIndex parentIndex;
63  for (int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
64  QModelIndex itemIndex = index(i_row, 0, parentIndex);
65  JobItem* jobItem = getJobItemForIndex(itemIndex);
66  if (jobItem->getIdentifier() == identifier)
67  return jobItem;
68  }
69  return nullptr;
70 }
71 
72 //! Main method to add a job
73 JobItem* JobModel::addJob(const MultiLayerItem* multiLayerItem,
74  const InstrumentItem* instrumentItem, const RealDataItem* realDataItem,
75  const SimulationOptionsItem* optionItem)
76 {
77  ASSERT(multiLayerItem);
78  ASSERT(instrumentItem);
79  ASSERT(optionItem);
80 
81  auto jobItem = insertItem<JobItem>();
82  jobItem->setItemName(generateJobName());
83  jobItem->setIdentifier(GUIHelpers::createUuid());
84 
85  JobModelFunctions::setupJobItemSampleData(jobItem, multiLayerItem);
86  JobModelFunctions::setupJobItemInstrument(jobItem, instrumentItem);
87 
88  // TODO: remove when specular instrument is ready for magnetization
89  if (instrumentItem->is<SpecularInstrumentItem>())
91  copyItem(optionItem, jobItem, JobItem::T_SIMULATION_OPTIONS);
92 
93  jobItem->getItem(JobItem::P_SAMPLE_NAME)->setValue(multiLayerItem->itemName());
94 
96 
98 
99  if (realDataItem)
100  JobModelFunctions::setupJobItemForFit(jobItem, realDataItem);
101 
102  return jobItem;
103 }
104 
105 QVector<JobItem*> JobModel::jobItems() const
106 {
107  return topItems<JobItem>();
108 }
109 
110 //! restore instrument and sample model from backup for given JobItem
112 {
114 }
115 
117 {
118  bool result = m_queue_data->hasUnfinishedJobs();
119  for (auto jobItem : topItems<JobItem>()) {
120  if (jobItem->getStatus() == "Fitting")
121  result = true;
122  }
123 
124  return result;
125 }
126 
128 {
129  for (auto item : topItems())
130  removeJob(item->index());
131 
133 }
134 
135 QVector<SessionItem*> JobModel::nonXMLItems() const
136 {
137  QVector<SessionItem*> result;
138 
139  for (auto jobItem : topItems<JobItem>()) {
140  if (auto intensityItem = jobItem->getItem(JobItem::T_OUTPUT))
141  result.push_back(intensityItem);
142 
143  if (auto real_data = dynamic_cast<RealDataItem*>(jobItem->getItem(JobItem::T_REALDATA))) {
144  if (auto data_item = real_data->dataItem())
145  result.push_back(data_item);
146  if (auto native_data = real_data->nativeData())
147  result.push_back(native_data);
148  }
149 
150  auto instrument =
151  dynamic_cast<SpecularInstrumentItem*>(jobItem->getItem(JobItem::T_INSTRUMENT));
152  if (instrument) {
153  auto axis_group = instrument->beamItem()->inclinationAxisGroup();
154  result.push_back(axis_group->getChildOfType("PointwiseAxis"));
155  }
156  }
157 
158  return result;
159 }
160 
161 void JobModel::readFrom(QXmlStreamReader* reader, MessageService* messageService /*= 0*/)
162 {
163  SessionModel::readFrom(reader, messageService);
164 
165  // Set & check instrument links. JobItem and realDataItem have to reference the same instrument
166  // (which is the one contained in this job item, not contained in the instrument model)
167  for (auto jobItem : jobItems())
168  if (RealDataItem* refItem = jobItem->realDataItem()) {
169  refItem->setInstrumentId(jobItem->instrumentItem()->id());
170  ASSERT(refItem->linkedInstrument() == jobItem->instrumentItem());
171  }
172 }
173 
175 {
177 }
178 
179 void JobModel::runJob(const QModelIndex& index)
180 {
182 }
183 
184 void JobModel::cancelJob(const QModelIndex& index)
185 {
186  m_queue_data->cancelJob(getJobItemForIndex(index)->getIdentifier());
187 }
188 
189 void JobModel::removeJob(const QModelIndex& index)
190 {
191  JobItem* jobItem = getJobItemForIndex(index);
192  ASSERT(jobItem);
193  m_queue_data->removeJob(jobItem->getIdentifier());
194 
195  emit aboutToDeleteJobItem(jobItem);
196  removeRows(index.row(), 1, QModelIndex());
197 }
198 
199 //! generates job name
201 {
202  int glob_index = 0;
203  QModelIndex parentIndex;
204  for (int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
205  QModelIndex itemIndex = index(i_row, 0, parentIndex);
206 
207  if (SessionItem* item = itemForIndex(itemIndex)) {
208  if (item->modelType() == "JobItem") {
209  QString jobName = item->itemName();
210  if (jobName.startsWith("job")) {
211  int job_index = jobName.remove(0, 3).toInt();
212  if (job_index > glob_index)
213  glob_index = job_index;
214  }
215  }
216  }
217  }
218  return QString("job") + QString::number(++glob_index);
219 }
220 
222 {
223  if (ParameterItem* parameter = dynamic_cast<ParameterItem*>(item))
224  parameter->restoreFromBackup();
225 
226  for (auto child : item->children())
227  restoreItem(child);
228 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines various axis items.
Defines class FitSuiteItem.
Defines class GUIHelpers functions.
Defines class GroupItem.
Defines InstrumentItems classes.
Defines class IntensityDataItem.
Defines class JobItemUtils.
Defines class JobItem.
Defines auxiliary functions in JobModelFunctions namespace.
Defines class JobModel.
Defines class JobQueueData.
Defines class MultiLayerItem.
Defines classes for ParameterTreeItems.
Defines ParameterTreeUtils namespace.
Defines class RealDataItem.
Defines class SimulationOptionsItem.
static const QString T_OUTPUT
Definition: JobItem.h:50
static const QString T_PARAMETER_TREE
Definition: JobItem.h:53
static const QString T_INSTRUMENT
Definition: JobItem.h:49
static const QString T_SIMULATION_OPTIONS
Definition: JobItem.h:54
QString getIdentifier() const
Definition: JobItem.cpp:103
static const QString T_REALDATA
Definition: JobItem.h:51
static const QString P_SAMPLE_NAME
Definition: JobItem.h:37
void runJob(const QModelIndex &index)
Definition: JobModel.cpp:179
JobItem * addJob(const MultiLayerItem *multiLayerItem, const InstrumentItem *instrumentItem, const RealDataItem *realDataItem, const SimulationOptionsItem *optionItem)
Main method to add a job.
Definition: JobModel.cpp:73
void focusRequest(JobItem *item)
void removeJob(const QModelIndex &index)
Definition: JobModel.cpp:189
const JobItem * getJobItemForIndex(const QModelIndex &index) const
Definition: JobModel.cpp:46
void globalProgress(int)
QVector< JobItem * > jobItems() const
Definition: JobModel.cpp:105
virtual ~JobModel()
Definition: JobModel.cpp:41
void cancelJob(const QModelIndex &index)
Definition: JobModel.cpp:184
virtual void readFrom(QXmlStreamReader *reader, MessageService *messageService=0) override
Definition: JobModel.cpp:161
void restoreItem(SessionItem *item)
Definition: JobModel.cpp:221
void restore(JobItem *jobItem)
restore instrument and sample model from backup for given JobItem
Definition: JobModel.cpp:111
JobModel(QObject *parent=0)
Definition: JobModel.cpp:32
bool hasUnfinishedJobs()
Definition: JobModel.cpp:116
JobQueueData * m_queue_data
Definition: JobModel.h:64
JobItem * getJobItemForIdentifier(const QString &identifier)
Definition: JobModel.cpp:60
void clear() override
Definition: JobModel.cpp:127
QString generateJobName()
generates job name
Definition: JobModel.cpp:200
void onCancelAllJobs()
Definition: JobModel.cpp:174
void aboutToDeleteJobItem(JobItem *item)
QVector< SessionItem * > nonXMLItems() const override
Definition: JobModel.cpp:135
The JobQueueData class holds all objects/logic to run simulation in a thread.
Definition: JobQueueData.h:28
bool hasUnfinishedJobs()
void focusRequest(JobItem *jobItem)
void globalProgress(int)
void removeJob(const QString &identifier)
Remove job from list completely.
void cancelJob(const QString &identifier)
Cancels running job.
void runJob(JobItem *jobItem)
Submits job and run it in a thread.
void onCancelAllJobs()
Cancels all running jobs.
The service to collect messages from different senders.
The ParameterItem class represent a tuning value in a parameter tuning tree.
The RealDataItem class represents intensity data imported from file and intended for fitting.
Definition: RealDataItem.h:35
QString itemName() const
Get item name, return display name if no name is set.
bool is() const
Definition: SessionItem.h:175
QVector< SessionItem * > children() const
Returns vector of all children.
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.
virtual void clear()
T * copyItem(const T *item_to_copy, SessionItem *new_parent=0, const QString &tag="")
Definition: SessionModel.h:136
SessionItem * itemForIndex(const QModelIndex &index) const
QVector< T * > topItems() const
Definition: SessionModel.h:147
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
virtual int rowCount(const QModelIndex &parent) const
virtual bool removeRows(int row, int count, const QModelIndex &parent)
virtual void readFrom(QXmlStreamReader *reader, MessageService *messageService=0)
The SimulationOptionsItem class holds simulation status (run policy, number of threads,...
GroupItem * inclinationAxisGroup()
Definition: BeamItems.cpp:155
SpecularBeamItem * beamItem() const override
QString createUuid()
Definition: GUIHelpers.cpp:242
void setupJobItemForFit(JobItem *jobItem, const RealDataItem *realDataItem)
Setups JobItem for fit.
void setupJobItemInstrument(JobItem *jobItem, const InstrumentItem *from)
Properly copies instrument into job item.
void setupJobItemSampleData(JobItem *jobItem, const MultiLayerItem *sampleItem)
Properly copies sample and materials into JobItem.
void muteMagnetizationData(JobItem *jobItem)
void setupJobItemOutput(JobItem *jobItem)
Setup items intended for storing results of the job.
void createParameterTree(JobItem *jobItem)
const QString JobModelTag("JobModel")