labplot  2.8.2
About: LabPlot is an application for plotting and analysis of 2D and 3D functions and data. It is a complete rewrite of LabPlot1 and lacks in the first release a lot of features available in the predecessor. On the other hand, the GUI and the usability is more superior.
  Fossies Dox: labplot-2.8.2.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

XYCorrelationCurveDock.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  File : XYCorrelationCurveDock.cpp
3  Project : LabPlot
4  --------------------------------------------------------------------
5  Copyright : (C) 2018 Stefan Gerlach (stefan.gerlach@uni.kn)
6  Description : widget for editing properties of correlation curves
7 
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  * This program is distributed in the hope that it will be useful, *
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
20  * GNU General Public License for more details. *
21  * *
22  * You should have received a copy of the GNU General Public License *
23  * along with this program; if not, write to the Free Software *
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
25  * Boston, MA 02110-1301 USA *
26  * *
27  ***************************************************************************/
28 
29 #include "XYCorrelationCurveDock.h"
31 #include "backend/core/Project.h"
34 
35 #include <KConfigGroup>
36 #include <KSharedConfig>
37 
38 #include <QMenu>
39 #include <QWidgetAction>
40 #include <QStandardItemModel>
41 
42 extern "C" {
43 #include "backend/nsl/nsl_corr.h"
44 }
45 
46 /*!
47  \class XYCorrelationCurveDock
48  \brief Provides a widget for editing the properties of the XYCorrelationCurves
49  (2D-curves defined by a correlation) currently selected in
50  the project explorer.
51 
52  If more then one curves are set, the properties of the first column are shown.
53  The changes of the properties are applied to all curves.
54  The exclusions are the name, the comment and the datasets (columns) of
55  the curves - these properties can only be changed if there is only one single curve.
56 
57  \ingroup kdefrontend
58 */
59 
61 }
62 
63 /*!
64  * // Tab "General"
65  */
67  DEBUG("XYCorrelationCurveDock::setupGeneral()");
68  QWidget* generalTab = new QWidget(ui.tabGeneral);
69  uiGeneralTab.setupUi(generalTab);
70  m_leName = uiGeneralTab.leName;
71  m_leComment = uiGeneralTab.leComment;
72 
73  auto* gridLayout = static_cast<QGridLayout*>(generalTab->layout());
74  gridLayout->setContentsMargins(2,2,2,2);
75  gridLayout->setHorizontalSpacing(2);
76  gridLayout->setVerticalSpacing(2);
77 
78  uiGeneralTab.cbDataSourceType->addItem(i18n("Spreadsheet"));
79  uiGeneralTab.cbDataSourceType->addItem(i18n("XY-Curve"));
80 
81  cbDataSourceCurve = new TreeViewComboBox(generalTab);
82  gridLayout->addWidget(cbDataSourceCurve, 5, 2, 1, 3);
83  cbXDataColumn = new TreeViewComboBox(generalTab);
84  gridLayout->addWidget(cbXDataColumn, 6, 2, 1, 3);
85  cbYDataColumn = new TreeViewComboBox(generalTab);
86  gridLayout->addWidget(cbYDataColumn, 8, 2, 1, 3);
87  cbY2DataColumn = new TreeViewComboBox(generalTab);
88  gridLayout->addWidget(cbY2DataColumn, 9, 2, 1, 3);
89 
90  uiGeneralTab.sbMin->setRange(-std::numeric_limits<double>::max(), std::numeric_limits<double>::max());
91  uiGeneralTab.sbMax->setRange(-std::numeric_limits<double>::max(), std::numeric_limits<double>::max());
92 
93  for (int i = 0; i < NSL_CORR_TYPE_COUNT; i++)
94  uiGeneralTab.cbType->addItem(i18n(nsl_corr_type_name[i]));
95  // nsl_corr_method_type not exposed to user
96  for (int i = 0; i < NSL_CORR_NORM_COUNT; i++)
97  uiGeneralTab.cbNorm->addItem(i18n(nsl_corr_norm_name[i]));
98 
99  uiGeneralTab.pbRecalculate->setIcon(QIcon::fromTheme("run-build"));
100 
101  auto* layout = new QHBoxLayout(ui.tabGeneral);
102  layout->setMargin(0);
103  layout->addWidget(generalTab);
104 
105  DEBUG("XYCorrelationCurveDock::setupGeneral() DONE");
106 
107  //Slots
108  connect(uiGeneralTab.leName, &QLineEdit::textChanged, this, &XYCorrelationCurveDock::nameChanged );
109  connect(uiGeneralTab.leComment, &QLineEdit::textChanged, this, &XYCorrelationCurveDock::commentChanged );
110  connect(uiGeneralTab.chkVisible, &QCheckBox::clicked, this, &XYCorrelationCurveDock::visibilityChanged);
111  connect(uiGeneralTab.cbDataSourceType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &XYCorrelationCurveDock::dataSourceTypeChanged);
112  connect(uiGeneralTab.sbSamplingInterval, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &XYCorrelationCurveDock::samplingIntervalChanged);
113  connect(uiGeneralTab.cbAutoRange, &QCheckBox::clicked, this, &XYCorrelationCurveDock::autoRangeChanged);
114  connect(uiGeneralTab.sbMin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &XYCorrelationCurveDock::xRangeMinChanged);
115  connect(uiGeneralTab.sbMax, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &XYCorrelationCurveDock::xRangeMaxChanged);
116  connect(uiGeneralTab.cbType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &XYCorrelationCurveDock::typeChanged);
117  connect(uiGeneralTab.cbNorm, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &XYCorrelationCurveDock::normChanged);
118  connect(uiGeneralTab.pbRecalculate, &QPushButton::clicked, this, &XYCorrelationCurveDock::recalculateClicked);
119 
124 }
125 
127  DEBUG("XYCorrelationCurveDock::initGeneralTab()");
128  //if there are more then one curve in the list, disable the tab "general"
129  if (m_curvesList.size() == 1) {
130  uiGeneralTab.lName->setEnabled(true);
131  uiGeneralTab.leName->setEnabled(true);
132  uiGeneralTab.lComment->setEnabled(true);
133  uiGeneralTab.leComment->setEnabled(true);
134 
135  uiGeneralTab.leName->setText(m_curve->name());
136  uiGeneralTab.leComment->setText(m_curve->comment());
137  } else {
138  uiGeneralTab.lName->setEnabled(false);
139  uiGeneralTab.leName->setEnabled(false);
140  uiGeneralTab.lComment->setEnabled(false);
141  uiGeneralTab.leComment->setEnabled(false);
142 
143  uiGeneralTab.leName->setText(QString());
144  uiGeneralTab.leComment->setText(QString());
145  }
146 
147  auto* analysisCurve = dynamic_cast<XYAnalysisCurve*>(m_curve);
148  checkColumnAvailability(cbXDataColumn, analysisCurve->xDataColumn(), analysisCurve->xDataColumnPath());
149  checkColumnAvailability(cbYDataColumn, analysisCurve->yDataColumn(), analysisCurve->yDataColumnPath());
150  checkColumnAvailability(cbY2DataColumn, analysisCurve->y2DataColumn(), analysisCurve->y2DataColumnPath());
151 
152  //show the properties of the first curve
154 
155  // hide x-Range per default
156  uiGeneralTab.lXRange->setEnabled(false);
157  uiGeneralTab.cbAutoRange->setEnabled(false);
158 
159  uiGeneralTab.cbDataSourceType->setCurrentIndex(static_cast<int>(m_correlationCurve->dataSourceType()));
160  this->dataSourceTypeChanged(uiGeneralTab.cbDataSourceType->currentIndex());
165  uiGeneralTab.sbSamplingInterval->setValue(m_correlationData.samplingInterval);
166  uiGeneralTab.cbAutoRange->setChecked(m_correlationData.autoRange);
167  uiGeneralTab.sbMin->setValue(m_correlationData.xRange.first());
168  uiGeneralTab.sbMax->setValue(m_correlationData.xRange.last());
169  this->autoRangeChanged();
171 
172  // settings
173  uiGeneralTab.cbType->setCurrentIndex(m_correlationData.type);
174  //m_correlationData.method not used
175  uiGeneralTab.cbNorm->setCurrentIndex(m_correlationData.normalize);
176 
177  this->showCorrelationResult();
178 
179  uiGeneralTab.chkVisible->setChecked( m_curve->isVisible() );
180 
181  //Slots
191 }
192 
194  DEBUG("XYCorrelationCurveDock::setModel()");
198 
199  QList<const AbstractAspect*> hiddenAspects;
200  for (auto* curve : m_curvesList)
201  hiddenAspects << curve;
202  cbDataSourceCurve->setHiddenAspects(hiddenAspects);
203 
207  };
211 
216 
218  DEBUG("XYCorrelationCurveDock::setModel() DONE");
219 }
220 
221 /*!
222  sets the curves. The properties of the curves in the list \c list can be edited in this widget.
223 */
225  m_initializing = true;
226  m_curvesList = list;
227  m_curve = list.first();
230  this->setModel();
231  m_correlationData = m_correlationCurve->correlationData();
232 
234  uiGeneralTab.sbSamplingInterval->setLocale(numberLocale);
235  uiGeneralTab.sbMin->setLocale(numberLocale);
236  uiGeneralTab.sbMax->setLocale(numberLocale);
237 
238  initGeneralTab();
239  initTabs();
240  m_initializing = false;
241 
242  //hide the "skip gaps" option after the curves were set
243  ui.lLineSkipGaps->hide();
244  ui.chkLineSkipGaps->hide();
245 }
246 
247 //*************************************************************
248 //**** SLOTs for changes triggered in XYCorrelationCurveDock **
249 //*************************************************************
253  uiGeneralTab.lDataSourceCurve->hide();
254  cbDataSourceCurve->hide();
255  uiGeneralTab.lXColumn->show();
256  cbXDataColumn->show();
257  uiGeneralTab.lYColumn->show();
258  cbYDataColumn->show();
259  uiGeneralTab.lY2Column->show();
260  cbY2DataColumn->show();
261  uiGeneralTab.lSamplingInterval->show();
262  uiGeneralTab.l2SamplingInterval->show();
263  uiGeneralTab.sbSamplingInterval->show();
264  } else {
265  uiGeneralTab.lDataSourceCurve->show();
266  cbDataSourceCurve->show();
267  uiGeneralTab.lXColumn->hide();
268  cbXDataColumn->hide();
269  uiGeneralTab.lYColumn->hide();
270  cbYDataColumn->hide();
271  uiGeneralTab.lY2Column->hide();
272  cbY2DataColumn->hide();
273  uiGeneralTab.lSamplingInterval->hide();
274  uiGeneralTab.l2SamplingInterval->hide();
275  uiGeneralTab.sbSamplingInterval->hide();
276  }
277 
278  if (m_initializing)
279  return;
280 
281  for (auto* curve : m_curvesList)
282  dynamic_cast<XYCorrelationCurve*>(curve)->setDataSourceType(type);
283 }
284 
285 void XYCorrelationCurveDock::dataSourceCurveChanged(const QModelIndex& index) {
286  auto* aspect = static_cast<AbstractAspect*>(index.internalPointer());
287  auto* dataSourceCurve = dynamic_cast<XYCurve*>(aspect);
288 
289  if (m_initializing)
290  return;
291 
292  for (auto* curve : m_curvesList)
293  dynamic_cast<XYCorrelationCurve*>(curve)->setDataSourceCurve(dataSourceCurve);
294 }
295 
296 void XYCorrelationCurveDock::xDataColumnChanged(const QModelIndex& index) {
297  DEBUG("XYCorrelationCurveDock::xDataColumnChanged()");
298  if (m_initializing)
299  return;
300 
301  auto* aspect = static_cast<AbstractAspect*>(index.internalPointer());
302  auto* column = dynamic_cast<AbstractColumn*>(aspect);
303 
304  for (auto* curve : m_curvesList)
305  dynamic_cast<XYCorrelationCurve*>(curve)->setXDataColumn(column);
306 
307  if (column != nullptr) {
308  if (uiGeneralTab.cbAutoRange->isChecked()) {
309  uiGeneralTab.sbMin->setValue(column->minimum());
310  uiGeneralTab.sbMax->setValue(column->maximum());
311  }
312  }
313 
315  cbXDataColumn->setInvalid(false);
316 }
317 
318 void XYCorrelationCurveDock::yDataColumnChanged(const QModelIndex& index) {
319  if (m_initializing)
320  return;
321  DEBUG("yDataColumnChanged()");
322 
323  auto* aspect = static_cast<AbstractAspect*>(index.internalPointer());
324  auto* column = dynamic_cast<AbstractColumn*>(aspect);
325 
326  for (auto* curve : m_curvesList)
327  dynamic_cast<XYCorrelationCurve*>(curve)->setYDataColumn(column);
328 
330  cbYDataColumn->setInvalid(false);
331 }
332 
333 void XYCorrelationCurveDock::y2DataColumnChanged(const QModelIndex& index) {
334  if (m_initializing)
335  return;
336  DEBUG("y2DataColumnChanged()");
337 
338  auto* aspect = static_cast<AbstractAspect*>(index.internalPointer());
339  auto* column = dynamic_cast<AbstractColumn*>(aspect);
340 
341  for (auto* curve : m_curvesList)
342  dynamic_cast<XYCorrelationCurve*>(curve)->setY2DataColumn(column);
343 
345  cbY2DataColumn->setInvalid(false);
346 }
347 
349  double samplingInterval = uiGeneralTab.sbSamplingInterval->value();
350  m_correlationData.samplingInterval = samplingInterval;
351 
353 }
354 
356  bool autoRange = uiGeneralTab.cbAutoRange->isChecked();
357  m_correlationData.autoRange = autoRange;
358 
359  if (autoRange) {
360  uiGeneralTab.lMin->setEnabled(false);
361  uiGeneralTab.sbMin->setEnabled(false);
362  uiGeneralTab.lMax->setEnabled(false);
363  uiGeneralTab.sbMax->setEnabled(false);
364 
365  const AbstractColumn* xDataColumn = nullptr;
367  xDataColumn = m_correlationCurve->xDataColumn();
368  else {
369  if (m_correlationCurve->dataSourceCurve())
370  xDataColumn = m_correlationCurve->dataSourceCurve()->xColumn();
371  }
372 
373  if (xDataColumn) {
374  uiGeneralTab.sbMin->setValue(xDataColumn->minimum());
375  uiGeneralTab.sbMax->setValue(xDataColumn->maximum());
376  }
377  } else {
378  uiGeneralTab.lMin->setEnabled(true);
379  uiGeneralTab.sbMin->setEnabled(true);
380  uiGeneralTab.lMax->setEnabled(true);
381  uiGeneralTab.sbMax->setEnabled(true);
382  }
383 
384 }
386  double xMin = uiGeneralTab.sbMin->value();
387 
388  m_correlationData.xRange.first() = xMin;
390 }
391 
393  double xMax = uiGeneralTab.sbMax->value();
394 
395  m_correlationData.xRange.last() = xMax;
397 }
398 
400  auto type = (nsl_corr_type_type) uiGeneralTab.cbType->currentIndex();
402 
404 }
405 
407  auto norm = (nsl_corr_norm_type) uiGeneralTab.cbNorm->currentIndex();
409 
411 }
412 
414  QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
415 
416  for (auto* curve : m_curvesList)
417  dynamic_cast<XYCorrelationCurve*>(curve)->setCorrelationData(m_correlationData);
418 
419  uiGeneralTab.pbRecalculate->setEnabled(false);
420  emit info(i18n("Correlation status: %1", m_correlationCurve->correlationResult().status));
421  QApplication::restoreOverrideCursor();
422 }
423 
425  DEBUG("XYCorrelationCurveDock::enableRecalculate()");
426  if (m_initializing)
427  return;
428 
429  bool hasSourceData = false;
430  //no correlation possible without y-data and y2-data
432  AbstractAspect* aspectY = static_cast<AbstractAspect*>(cbYDataColumn->currentModelIndex().internalPointer());
433  AbstractAspect* aspectY2 = static_cast<AbstractAspect*>(cbY2DataColumn->currentModelIndex().internalPointer());
434  hasSourceData = (aspectY != nullptr && aspectY2 != nullptr);
435  if (aspectY) {
437  cbYDataColumn->setInvalid(false);
438  }
439  if (aspectY2) {
441  cbY2DataColumn->setInvalid(false);
442  }
443  } else {
444  hasSourceData = (m_correlationCurve->dataSourceCurve() != nullptr);
445  }
446 
447  uiGeneralTab.pbRecalculate->setEnabled(hasSourceData);
448 }
449 
450 /*!
451  * show the result and details of the correlation
452  */
455  if (!correlationResult.available) {
456  uiGeneralTab.teResult->clear();
457  return;
458  }
459 
460  QString str = i18n("status: %1", correlationResult.status) + "<br>";
461 
462  if (!correlationResult.valid) {
463  uiGeneralTab.teResult->setText(str);
464  return; //result is not valid, there was an error which is shown in the status-string, nothing to show more.
465  }
466 
468  if (correlationResult.elapsedTime > 1000)
469  str += i18n("calculation time: %1 s", numberLocale.toString(correlationResult.elapsedTime/1000)) + "<br>";
470  else
471  str += i18n("calculation time: %1 ms", numberLocale.toString(correlationResult.elapsedTime)) + "<br>";
472 
473  str += "<br><br>";
474 
475  uiGeneralTab.teResult->setText(str);
476 
477  //enable the "recalculate"-button if the source data was changed since the last correlation
479 }
480 
481 //*************************************************************
482 //*********** SLOTs for changes triggered in XYCurve **********
483 //*************************************************************
484 //General-Tab
486  if (m_curve != aspect)
487  return;
488 
489  m_initializing = true;
490  if (aspect->name() != uiGeneralTab.leName->text())
491  uiGeneralTab.leName->setText(aspect->name());
492  else if (aspect->comment() != uiGeneralTab.leComment->text())
493  uiGeneralTab.leComment->setText(aspect->comment());
494  m_initializing = false;
495 }
496 
498  m_initializing = true;
499  uiGeneralTab.cbDataSourceType->setCurrentIndex(static_cast<int>(type));
500  m_initializing = false;
501 }
502 
504  m_initializing = true;
506  m_initializing = false;
507 }
508 
510  DEBUG("XYCorrelationCurveDock::curveXDataColumnChanged()");
511  m_initializing = true;
513  if (column != nullptr) {
514  DEBUG("X Column available");
515  uiGeneralTab.lXRange->setEnabled(true);
516  uiGeneralTab.cbAutoRange->setEnabled(true);
517  uiGeneralTab.lSamplingInterval->setEnabled(false);
518  uiGeneralTab.l2SamplingInterval->setEnabled(false);
519  uiGeneralTab.sbSamplingInterval->setEnabled(false);
520  } else {
521  DEBUG("X Column not available");
522  uiGeneralTab.lXRange->setEnabled(false);
523  uiGeneralTab.cbAutoRange->setEnabled(false);
524  uiGeneralTab.lSamplingInterval->setEnabled(true);
525  uiGeneralTab.l2SamplingInterval->setEnabled(true);
526  uiGeneralTab.sbSamplingInterval->setEnabled(true);
527  }
528  m_initializing = false;
529 }
530 
532  DEBUG("XYCorrelationCurveDock::curveYDataColumnChanged()");
533  m_initializing = true;
535  m_initializing = false;
536 }
537 
539  DEBUG("XYCorrelationCurveDock::curveY2DataColumnChanged()");
540  m_initializing = true;
542  m_initializing = false;
543 }
544 
546  m_initializing = true;
547  m_correlationData = correlationData;
548 
549  this->showCorrelationResult();
550  m_initializing = false;
551 }
552 
554  this->enableRecalculate();
555 }
556 
558  m_initializing = true;
559  uiGeneralTab.chkVisible->setChecked(on);
560  m_initializing = false;
561 }
@ XYCorrelationCurve
Base class of all persistent objects in a Project.
void aspectDescriptionChanged(const AbstractAspect *)
Emitted after the name, comment or caption spec have changed.
QString name() const
QString comment() const
virtual Project * project()
Return the Project this Aspect belongs to, or 0 if it is currently not part of one.
Interface definition for data with column logic.
virtual double maximum(int count=0) const
virtual double minimum(int count=0) const
Represents a tree of AbstractAspect objects as a Qt item model.
QLineEdit * m_leName
Definition: BaseDock.h:68
QLineEdit * m_leComment
Definition: BaseDock.h:69
void commentChanged()
Definition: BaseDock.cpp:61
bool m_initializing
Definition: BaseDock.h:67
void nameChanged()
Definition: BaseDock.cpp:47
Provides a QTreeView in a QComboBox.
void setInvalid(bool invalid, const QString &tooltip=QString())
void setModel(QAbstractItemModel *)
void setHiddenAspects(const QList< const AbstractAspect * > &)
QModelIndex currentModelIndex() const
void useCurrentIndexText(const bool set)
void setTopLevelClasses(const QList< AspectType > &)
void currentModelIndexChanged(const QModelIndex &)
Base class for all analysis curves.
void yDataColumnChanged(const AbstractColumn *)
void dataSourceTypeChanged(XYAnalysisCurve::DataSourceType)
void dataSourceCurveChanged(const XYCurve *)
void xDataColumnChanged(const AbstractColumn *)
void y2DataColumnChanged(const AbstractColumn *)
void sourceDataChanged()
void setCurves(QList< XYCurve * >)
void y2DataColumnChanged(const QModelIndex &)
XYCorrelationCurve * m_correlationCurve
void xDataColumnChanged(const QModelIndex &)
void curveXDataColumnChanged(const AbstractColumn *)
XYCorrelationCurve::CorrelationData m_correlationData
void curveDataSourceTypeChanged(XYAnalysisCurve::DataSourceType)
void yDataColumnChanged(const QModelIndex &)
TreeViewComboBox * cbY2DataColumn
TreeViewComboBox * cbYDataColumn
Ui::XYCorrelationCurveDockGeneralTab uiGeneralTab
void curveDataSourceCurveChanged(const XYCurve *)
void curveCorrelationDataChanged(const XYCorrelationCurve::CorrelationData &)
TreeViewComboBox * cbDataSourceCurve
void dataSourceCurveChanged(const QModelIndex &)
void curveY2DataColumnChanged(const AbstractColumn *)
TreeViewComboBox * cbXDataColumn
void curveDescriptionChanged(const AbstractAspect *)
void curveYDataColumnChanged(const AbstractColumn *)
A xy-curve defined by a correlation.
const CorrelationResult & correlationResult() const
void correlationDataChanged(const XYCorrelationCurve::CorrelationData &)
Provides a widget for editing the properties of the XYCurves (2D-curves) currently selected in the pr...
Definition: XYCurveDock.h:46
void initTabs()
XYCurve * m_curve
Definition: XYCurveDock.h:82
AspectTreeModel * m_aspectTreeModel
Definition: XYCurveDock.h:83
void info(const QString &)
virtual void setModel()
QList< XYCurve * > m_curvesList
Definition: XYCurveDock.h:81
void setModelIndexFromAspect(TreeViewComboBox *, const AbstractAspect *)
Ui::XYCurveDock ui
Definition: XYCurveDock.h:80
void visibilityChanged(bool)
void checkColumnAvailability(TreeViewComboBox *, const AbstractColumn *, const QString &columnPath)
A 2D-curve, provides an interface for editing many properties of the curve.
Definition: XYCurve.h:46
bool isVisible() const override
Return whether the element is (at least) partially visible.
Definition: XYCurve.cpp:216
bool isSourceDataChangedSinceLastRecalc() const
Definition: XYCurve.cpp:329
void visibilityChanged()
Definition: XYCurve.cpp:902
#define DEBUG(x)
Definition: macros.h:50
#define SET_NUMBER_LOCALE
Definition: macros.h:75
#define i18n(m)
Definition: nsl_common.h:38
const char * nsl_corr_type_name[]
Definition: nsl_corr.c:37
const char * nsl_corr_norm_name[]
Definition: nsl_corr.c:38
#define NSL_CORR_TYPE_COUNT
Definition: nsl_corr.h:34
nsl_corr_type_type
Definition: nsl_corr.h:36
#define NSL_CORR_NORM_COUNT
Definition: nsl_corr.h:39
nsl_corr_norm_type
Definition: nsl_corr.h:45