Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkHistogramVisualizationWidget.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 
15 #include <QClipboard>
16 
18 {
19  m_Controls.setupUi(this);
20  m_Controls.checkBoxShowSubchart->setChecked(false);
21  m_Controls.spinBoxNBins->setValue(m_DefaultNBins);
22  m_Controls.spinBoxNBins->setMinimum(m_MinNBins);
23  m_Controls.spinBoxNBins->setMaximum(m_MaxNBins);
24  SetGUIElementsEnabled(false);
25  CreateConnections();
26 }
27 
28 void QmitkHistogramVisualizationWidget::SetHistogram(itk::Statistics::Histogram<double>::ConstPointer histogram, const std::string& dataLabel)
29 {
30  if (histogram == nullptr)
31  return;
32 
33  m_Histogram = histogram;
34  m_Controls.chartWidget->AddData2D(ConvertHistogramToPairList(m_Histogram), dataLabel);
35  m_Controls.chartWidget->SetChartType(dataLabel, QmitkChartWidget::ChartType::bar);
36  m_Controls.chartWidget->SetXAxisLabel("Gray value");
37  m_Controls.chartWidget->SetYAxisLabel("Frequency");
38  m_Controls.chartWidget->Show(m_Controls.checkBoxShowSubchart->isChecked());
39  SetGUIElementsEnabled(true);
40 }
41 
43 {
44  m_Controls.chartWidget->Clear();
45  SetGUIElementsEnabled(false);
46 }
47 
49  return m_Controls.spinBoxNBins->value();
50 }
51 
53 {
54  m_Controls.checkBoxUseDefaultNBins->setChecked(true);
55  m_Controls.spinBoxNBins->setEnabled(false);
56  m_Controls.spinBoxNBins->setValue(100);
57  m_Controls.checkBoxShowSubchart->setChecked(false);
58 }
59 
61 {
62  m_Controls.chartWidget->SetTheme(style);
63 }
64 
65 void QmitkHistogramVisualizationWidget::CreateConnections()
66 {
67  connect(m_Controls.buttonCopyHistogramToClipboard, &QPushButton::clicked, this, &QmitkHistogramVisualizationWidget::OnClipboardButtonClicked);
68  connect(m_Controls.checkBoxUseDefaultNBins, &QCheckBox::clicked, this, &QmitkHistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged);
69  connect(m_Controls.spinBoxNBins, &QSpinBox::editingFinished, this, &QmitkHistogramVisualizationWidget::OnNBinsSpinBoxValueChanged);
70  connect(m_Controls.checkBoxShowSubchart, &QCheckBox::clicked, this, &QmitkHistogramVisualizationWidget::OnShowSubchartCheckBoxChanged);
71  connect(m_Controls.checkBoxViewMinMax, &QCheckBox::clicked, this, &QmitkHistogramVisualizationWidget::OnViewMinMaxCheckBoxChanged);
72  connect(m_Controls.doubleSpinBoxMaxValue, &QSpinBox::editingFinished, this, &QmitkHistogramVisualizationWidget::OnMaxValueSpinBoxValueChanged);
73  connect(m_Controls.doubleSpinBoxMinValue, &QSpinBox::editingFinished, this, &QmitkHistogramVisualizationWidget::OnMinValueSpinBoxValueChanged);
74 }
75 
76 void QmitkHistogramVisualizationWidget::SetGUIElementsEnabled(bool enabled)
77 {
78  this->setEnabled(enabled);
79  m_Controls.tabWidgetPlot->setEnabled(enabled);
80  m_Controls.checkBoxShowSubchart->setEnabled(enabled);
81  m_Controls.checkBoxUseDefaultNBins->setEnabled(enabled);
82  m_Controls.spinBoxNBins->setEnabled(!m_Controls.checkBoxUseDefaultNBins->isChecked());
83  m_Controls.buttonCopyHistogramToClipboard->setEnabled(enabled);
84  m_Controls.checkBoxViewMinMax->setEnabled(enabled);
85  m_Controls.doubleSpinBoxMaxValue->setEnabled(m_Controls.checkBoxViewMinMax->isChecked());
86  m_Controls.doubleSpinBoxMinValue->setEnabled(m_Controls.checkBoxViewMinMax->isChecked());
87 }
88 
89 std::vector< std::pair<double, double> > QmitkHistogramVisualizationWidget::ConvertHistogramToPairList(itk::Statistics::Histogram<double>::ConstPointer histogram) const
90 {
91  std::map<double, double> histogramMap;
92  if (histogram)
93  {
94  auto endIt = histogram->End();
95  auto it = histogram->Begin();
96 
97  // generating Lists of measurement and frequencies
98  for (; it != endIt; ++it)
99  {
100  double frequency = it.GetFrequency();
101  double measurement = it.GetMeasurementVector()[0];
102  histogramMap.emplace(measurement, frequency);
103  }
104 
105  }
106  std::vector< std::pair<double, double> > histogram_list;
107  for(auto iter = histogramMap.begin(); iter != histogramMap.end(); ++iter)
108  histogram_list.emplace_back( iter->first, iter->second );
109 
110  return histogram_list;
111 }
112 
113 void QmitkHistogramVisualizationWidget::OnClipboardButtonClicked()
114 {
115  if (m_Histogram)
116  {
117  QApplication::clipboard()->clear();
118  QString clipboard("Measurement \t Frequency\n");
119  auto iter = m_Histogram->Begin();
120  auto iterEnd = m_Histogram->End();
121  for (; iter != iterEnd; ++iter)
122  {
123  clipboard = clipboard.append("%L1 \t %L2\n")
124  .arg(iter.GetMeasurementVector()[0], 0, 'f', 2)
125  .arg(iter.GetFrequency());
126  }
127 
128  QApplication::clipboard()->setText(clipboard, QClipboard::Clipboard);
129  }
130 }
131 
132 void QmitkHistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged()
133 {
134  if (m_Controls.checkBoxUseDefaultNBins->isChecked())
135  {
136  m_Controls.spinBoxNBins->setEnabled(false);
137  if (m_Controls.spinBoxNBins->value() != static_cast<int>(m_DefaultNBins) ) {
138  m_Controls.spinBoxNBins->setValue(m_DefaultNBins);
139  OnNBinsSpinBoxValueChanged();
140  }
141  }
142  else
143  {
144  m_Controls.spinBoxNBins->setEnabled(true);
145  }
146 }
147 
148 void QmitkHistogramVisualizationWidget::OnNBinsSpinBoxValueChanged()
149 {
150  emit RequestHistogramUpdate(m_Controls.spinBoxNBins->value());
151 }
152 
153 void QmitkHistogramVisualizationWidget::OnShowSubchartCheckBoxChanged()
154 {
155  m_Controls.chartWidget->Show(m_Controls.checkBoxShowSubchart->isChecked());
156 }
157 
158 void QmitkHistogramVisualizationWidget::OnViewMinMaxCheckBoxChanged()
159 {
160  double min = m_Histogram->GetBinMin(0, 0);
161  auto maxVector = m_Histogram->GetDimensionMaxs(0);
162  double max;
163  if (m_Controls.checkBoxUseDefaultNBins->isChecked())
164  max = maxVector[m_DefaultNBins - 1];
165  else
166  max = maxVector[m_Controls.spinBoxNBins->value() - 1];
167 
168  if (!m_Controls.checkBoxViewMinMax->isChecked())
169  {
170  m_Controls.doubleSpinBoxMaxValue->setEnabled(false);
171  m_Controls.doubleSpinBoxMinValue->setEnabled(false);
172  m_Controls.chartWidget->Reload();
173  }
174  else
175  {
176  m_Controls.doubleSpinBoxMinValue->setMinimum(min);
177  m_Controls.doubleSpinBoxMinValue->setValue(min);
178  m_Controls.doubleSpinBoxMaxValue->setMaximum(max);
179  m_Controls.doubleSpinBoxMaxValue->setValue(max);
180  m_Controls.doubleSpinBoxMaxValue->setEnabled(true);
181  m_Controls.doubleSpinBoxMinValue->setEnabled(true);
182  }
183 }
184 
185 void QmitkHistogramVisualizationWidget::OnMinValueSpinBoxValueChanged()
186 {
187  m_Controls.doubleSpinBoxMaxValue->setMinimum(m_Controls.doubleSpinBoxMinValue->value()+1);
188  m_Controls.chartWidget->SetMinMaxValueXView(m_Controls.doubleSpinBoxMinValue->value(),m_Controls.doubleSpinBoxMaxValue->value());
189  m_Controls.chartWidget->Show();
190 }
191 
192 void QmitkHistogramVisualizationWidget::OnMaxValueSpinBoxValueChanged()
193 {
194  m_Controls.doubleSpinBoxMinValue->setMaximum(m_Controls.doubleSpinBoxMaxValue->value()-1);
195  m_Controls.chartWidget->SetMinMaxValueXView(m_Controls.doubleSpinBoxMinValue->value(),m_Controls.doubleSpinBoxMaxValue->value());
196  m_Controls.chartWidget->Show();
197 }
void RequestHistogramUpdate(unsigned int nBins)
Signal to be emitted when the number of bins is changed by the user. The HistogramCalculator should c...
int GetBins()
Gets the number of bins to calculate.
ColorTheme
enum of chart style (modifies background and line color).
void Reset()
Clears the histogram and disables all GUI elements.
void SetTheme(QmitkChartWidget::ColorTheme style)
Sets the theme (either dark or light)
static T max(T x, T y)
Definition: svm.cpp:56
void SetHistogram(itk::Statistics::Histogram< double >::ConstPointer histogram, const std::string &dataLabel)
Draws the histogram and enables the GUI elements.
static T min(T x, T y)
Definition: svm.cpp:53
void ResetDefault()
Resets the default settings.