General Purpose Geodetic Library
NsBrowseNotUsedObsDialog.cpp
Go to the documentation of this file.
1 /*
2  *
3  * This file is a part of nuSolve. nuSolve is a part of CALC/SOLVE system
4  * and is designed to perform data analyis of a geodetic VLBI session.
5  * Copyright (C) 2010-2020 Sergei Bolotin.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
23 #include "nuSolve.h"
24 
25 
26 #include <iostream>
27 #include <stdlib.h>
28 
29 
30 #include <QtCore/QDir>
31 
32 #if QT_VERSION >= 0x050000
33 # include <QtWidgets/QBoxLayout>
34 # include <QtWidgets/QGroupBox>
35 # include <QtWidgets/QHeaderView>
36 # include <QtWidgets/QFrame>
37 # include <QtWidgets/QLabel>
38 # include <QtWidgets/QPlainTextEdit>
39 # include <QtWidgets/QPushButton>
40 # include <QtWidgets/QTabWidget>
41 # include <QtWidgets/QTextEdit>
42 # include <QtWidgets/QTreeWidget>
43 #else
44 # include <QtGui/QBoxLayout>
45 # include <QtGui/QGroupBox>
46 # include <QtGui/QHeaderView>
47 # include <QtGui/QFrame>
48 # include <QtGui/QLabel>
49 # include <QtGui/QPlainTextEdit>
50 # include <QtGui/QPushButton>
51 # include <QtGui/QTabWidget>
52 # include <QtGui/QTextEdit>
53 # include <QtGui/QTreeWidget>
54 #endif
55 
56 
57 
58 #include <SgLogger.h>
59 #include <SgMJD.h>
60 #include <SgSolutionReporter.h>
61 
62 
63 
64 
65 
66 /*=======================================================================================================
67 *
68 * NsQTreeWidgetItem METHODS:
69 *
70 *======================================================================================================*/
72 {
73  int column=treeWidget()->sortColumn();
74  double dL, dR;
75  bool isOk;
76  //
77  // if can be converted to double sort by value:
78  dL = text(column).toDouble(&isOk);
79  if (isOk)
80  {
81  dR = other.text(column).toDouble(&isOk);
82  if (isOk)
83  return dL < dR;
84  };
85  // otherwice, do as usual:
86  return QTreeWidgetItem::operator<(other);
87 };
88 /*=====================================================================================================*/
89 
90 
91 
92 
93 
94 
95 /*=======================================================================================================
96 *
97 * METHODS:
98 *
99 *======================================================================================================*/
101  const QList<NsDeselectedObsInfo*>& deselectedObservations, SgSolutionReporter *reporter,
102  QWidget *parent, Qt::WindowFlags flags)
103  :
104  QDialog(parent, flags),
105  nonUsableObservations_(nonUsableObservations),
106  deselectedObservations_(deselectedObservations)
107 {
108  reporter_ = reporter;
109 
110  QBoxLayout *layout, *subLayout;
111  QSize btnSize;
112  QString str("");
113 
114  layout = new QVBoxLayout(this);
115 
116  QStringList headerLabels;
117  headerLabels
118  << "Media index"
119  << "Station#1"
120  << "Station#2"
121  << "Source"
122  << "Time"
123  << "QF(s)"
124  << "Reason(s)"
125  ;
126 
127  twUnusable_ = new QTreeWidget(this);
128  twUnusable_->setColumnCount(headerLabels.count());
129  twUnusable_->setHeaderLabels(headerLabels);
130 
131  for (int i=0; i<nonUsableObservations_.size(); i++)
132  {
135 
136  item->setText(0, str.sprintf("%6d", obsInfo->getMediaIdx()));
137  item->setData(0, Qt::TextAlignmentRole, Qt::AlignRight);
138 
139  item->setText(1, str.sprintf("%s", qPrintable(obsInfo->getStn_1Name())));
140  item->setData(1, Qt::TextAlignmentRole, Qt::AlignLeft);
141  item->setText(2, str.sprintf("%s", qPrintable(obsInfo->getStn_2Name())));
142  item->setData(2, Qt::TextAlignmentRole, Qt::AlignLeft);
143  item->setText(3, str.sprintf("%s", qPrintable(obsInfo->getSrcName())));
144  item->setData(3, Qt::TextAlignmentRole, Qt::AlignLeft);
145  item->setText(4, str.sprintf("%s", qPrintable(obsInfo->getStrEpoch())));
146  item->setData(4, Qt::TextAlignmentRole, Qt::AlignLeft);
147  item->setText(5, str.sprintf("%s", qPrintable(obsInfo->getStrQFs())));
148  item->setData(5, Qt::TextAlignmentRole, Qt::AlignCenter);
149  item->setText(6, str.sprintf("%s", qPrintable(obsInfo->getReasons())));
150  item->setData(6, Qt::TextAlignmentRole, Qt::AlignLeft);
151  };
152 
153  twUnusable_->header()->resizeSections(QHeaderView::ResizeToContents);
154 #if QT_VERSION >= 0x050000
155  twUnusable_->header()->setSectionResizeMode(QHeaderView::Interactive);
156 #else
157  twUnusable_->header()->setResizeMode(QHeaderView::Interactive);
158 #endif
159  twUnusable_->header()->setStretchLastSection(true);
160 
161  twUnusable_->setSortingEnabled(true);
162  twUnusable_->setUniformRowHeights(true);
163  twUnusable_->sortByColumn(0, Qt::AscendingOrder);
164  twUnusable_->setFocus();
165  twUnusable_->setItemsExpandable(false);
166  twUnusable_->setAllColumnsShowFocus(true);
167  twUnusable_->setFrameStyle(QFrame::WinPanel | QFrame::Sunken);
168  twUnusable_->setMinimumSize(twUnusable_->sizeHint());
169 
170  //
171  //
172  //----------
173  headerLabels.clear();
174  headerLabels
175  << "Media index"
176  << "Station#1"
177  << "Station#2"
178  << "Source"
179  << "Time"
180  << "QF(s)"
181  << "Residual(ps)"
182  << "Std.Dev(ps)"
183  << "NormResid"
184  ;
185 
186  twDeselected_ = new QTreeWidget(this);
187  twDeselected_->setColumnCount(headerLabels.count());
188  twDeselected_->setHeaderLabels(headerLabels);
189 
190  for (int i=0; i<deselectedObservations_.size(); i++)
191  {
194 
195  item->setText(0, str.sprintf("%6d", obsInfo->getMediaIdx()));
196  item->setData(0, Qt::TextAlignmentRole, Qt::AlignRight);
197 
198  item->setText(1, str.sprintf("%s", qPrintable(obsInfo->getStn_1Name())));
199  item->setData(1, Qt::TextAlignmentRole, Qt::AlignLeft);
200  item->setText(2, str.sprintf("%s", qPrintable(obsInfo->getStn_2Name())));
201  item->setData(2, Qt::TextAlignmentRole, Qt::AlignLeft);
202  item->setText(3, str.sprintf("%s", qPrintable(obsInfo->getSrcName())));
203  item->setData(3, Qt::TextAlignmentRole, Qt::AlignLeft);
204  item->setText(4, str.sprintf("%s", qPrintable(obsInfo->getStrEpoch())));
205  item->setData(4, Qt::TextAlignmentRole, Qt::AlignLeft);
206  item->setText(5, str.sprintf("%s", qPrintable(obsInfo->getStrQFs())));
207  item->setData(5, Qt::TextAlignmentRole, Qt::AlignCenter);
208 
209  item->setText(6, str.sprintf("%.1f", obsInfo->getResidual()));
210  item->setData(6, Qt::TextAlignmentRole, Qt::AlignRight);
211  item->setText(7, str.sprintf("%.1f", obsInfo->getStdDev()));
212  item->setData(7, Qt::TextAlignmentRole, Qt::AlignRight);
213  item->setText(8, str.sprintf("%.1f", obsInfo->getNormResid()));
214  item->setData(8, Qt::TextAlignmentRole, Qt::AlignRight);
215  };
216 
217  twDeselected_->header()->resizeSections(QHeaderView::ResizeToContents);
218 #if QT_VERSION >= 0x050000
219  twDeselected_->header()->setSectionResizeMode(QHeaderView::Interactive);
220 #else
221  twDeselected_->header()->setResizeMode(QHeaderView::Interactive);
222 #endif
223  twDeselected_->header()->setStretchLastSection(false);
224 
225  twDeselected_->setSortingEnabled(true);
226  twDeselected_->setUniformRowHeights(true);
227  twDeselected_->sortByColumn(0, Qt::AscendingOrder);
228  twDeselected_->setFocus();
229  twDeselected_->setItemsExpandable(false);
230  twDeselected_->setAllColumnsShowFocus(true);
231  twDeselected_->setFrameStyle(QFrame::WinPanel | QFrame::Sunken);
232  twDeselected_->setMinimumSize(twDeselected_->sizeHint());
233  //
234  //
235  //----------
236  QTabWidget *aTabs=new QTabWidget(this);
237 
238  aTabs->addTab(twUnusable_,
239  QString("").setNum(nonUsableObservations_.size()) + " &Unusable Observations");
240  aTabs->addTab(twDeselected_,
241  QString("").setNum(deselectedObservations_.size()) + " &Deselected Observations");
242  layout->addWidget(aTabs);
243 
244  // buttons:
245  subLayout = new QHBoxLayout();
246  layout->addLayout(subLayout);
247  subLayout->addStretch(1);
248 
249  QPushButton *bClose=new QPushButton("Close", this);
250  QPushButton *bExport=new QPushButton("Export", this);
251  bClose->setDefault(true);
252 
253  bExport->setMinimumSize((btnSize=bExport->sizeHint()));
254  bClose ->setMinimumSize(btnSize);
255 
256  subLayout->addWidget(bExport);
257  subLayout->addWidget(bClose);
258 
259  layout->activate();
260  setMinimumSize(sizeHint());
261 
262  connect(bClose, SIGNAL(clicked()), SLOT(accept()));
263  connect(bExport, SIGNAL(clicked()), SLOT(export2file()));
264  setWindowTitle("The lists of not used observations");
265 };
266 
267 
268 
269 //
271 {
272  for (int i=0; i<nonUsableObservations_.size(); i++)
273  delete nonUsableObservations_.at(i);
274  nonUsableObservations_.clear();
275 
276  deselectedObservations_.clear();
277 };
278 
279 
280 
281 //
283 {
284  QDialog::accept();
286  "::accept(): accept selected");
287  deleteLater();
288 };
289 
290 
291 
292 //
294 {
295  QDialog::reject();
297  "::reject(): reject selected");
298  deleteLater();
299 };
300 
301 
302 
303 //
305 {
307  "::export2file(): export observations status selected");
308  if (reporter_)
309  {
310  bool isOk(true);
311  QString nuobsDirName=setup.path2(setup.getPath2NotUsedObsFileOutput());
312  QDir d(nuobsDirName);
313  if (!d.exists())
314  isOk = d.mkpath("./"); // Qt, wtf?
315  if (!isOk)
316  {
318  "::export2file(): cannot create directory " + nuobsDirName + "; report failed");
319  return;
320  };
321  //
322  // create the report:
323  QString fName("nuSolve_unused_observations_" + setup.identities().getUserDefaultInitials());
324 
325  if (reporter_->reportNotUsedObs(nuobsDirName, fName))
327  "::export2file(): observations status have been saved in the \"" + fName + "\" file of \"" +
328  nuobsDirName + "\" directory");
329  else
331  "::export2file(): writting observations status the " + fName + " file has been failed");
332  }
333  else
335  "::export2file(): export has been failed, the reporter is NULL");
336 };
337 /*=====================================================================================================*/
SgLogger * logger
Definition: SgLogger.cpp:231
bool operator<(const SgMJD &T1, const SgMJD &T2)
Definition: SgMJD.h:552
QList< NsDeselectedObsInfo * > deselectedObservations_
QList< NsNotUsedObsInfo * > nonUsableObservations_
NsBrowseNotUsedObsDialog(const QList< NsNotUsedObsInfo * > &nonUsableObservations, const QList< NsDeselectedObsInfo * > &deselectedObservations, SgSolutionReporter *reporter, QWidget *parent=0, Qt::WindowFlags flags=0)
const QString & getStrEpoch() const
const QString & getStn_1Name() const
const QString & getSrcName() const
const QString & getStn_2Name() const
const QString & getStrQFs() const
const QString & getSrcName() const
const QString & getStn_1Name() const
const QString & getStrQFs() const
const QString & getStrEpoch() const
const QString & getStn_2Name() const
const QString & getReasons() const
virtual bool operator<(const QTreeWidgetItem &other) const
QString path2(const QString &) const
Definition: NsSetup.h:1008
SgIdentities & identities()
Definition: NsSetup.h:566
const QString & getPath2NotUsedObsFileOutput() const
Definition: NsSetup.h:462
const QString & getUserDefaultInitials() const
Definition: SgIdentities.h:231
virtual void write(LogLevel, quint32, const QString &, bool=false)
Definition: SgLogger.cpp:88
@ IO_TXT
Definition: SgLogger.h:65
@ REPORT
Definition: SgLogger.h:95
bool reportNotUsedObs(const QString &path, const QString &fileName)
NsSetup setup
Definition: nuSolve.cpp:61