Add warnings if calibration standard does not cover calibration measurement range

This commit is contained in:
Jan Käberich 2023-02-12 13:21:07 +01:00
parent d9b4da3a8f
commit d02efdb146
3 changed files with 65 additions and 34 deletions

View File

@ -524,7 +524,7 @@ void Calibration::edit()
ui->table->setItem(i, 0, new QTableWidgetItem(CalibrationMeasurement::Base::TypeToString(measurements[i]->getType())));
ui->table->setCellWidget(i, 1, measurements[i]->createStandardWidget());
ui->table->setCellWidget(i, 2, measurements[i]->createSettingsWidget());
ui->table->setItem(i, 3, new QTableWidgetItem(measurements[i]->getStatistics()));
ui->table->setItem(i, 3, measurements[i]->getStatisticsItem());
ui->table->setItem(i, 4, new QTableWidgetItem(measurements[i]->getTimestamp().toString()));
}
ui->table->selectRow(row);
@ -1847,12 +1847,12 @@ bool Calibration::hasFrequencyOverlap(std::vector<CalibrationMeasurement::Base *
if(meas->numPoints() < 2) {
return false;
}
auto resolution = (meas->maxFreq() - meas->minFreq()) / (meas->numPoints() - 1);
if(meas->maxFreq() < maxFreq) {
maxFreq = meas->maxFreq();
auto resolution = (meas->maxUsableFreq() - meas->minUsableFreq()) / (meas->numPoints() - 1);
if(meas->maxUsableFreq() < maxFreq) {
maxFreq = meas->maxUsableFreq();
}
if(meas->minFreq() > minFreq) {
minFreq = meas->minFreq();
if(meas->minUsableFreq() > minFreq) {
minFreq = meas->minUsableFreq();
}
if(resolution < minResolution) {
minResolution = resolution;

View File

@ -66,6 +66,11 @@ bool CalibrationMeasurement::Base::setStandard(CalStandard::Virtual *standard)
}
}
QTableWidgetItem *CalibrationMeasurement::Base::getStatisticsItem()
{
return new QTableWidgetItem(getStatistics());
}
QString CalibrationMeasurement::Base::getStatistics()
{
if(numPoints() > 0) {
@ -222,7 +227,22 @@ CalStandard::Virtual* CalibrationMeasurement::Base::getStandard() const
return standard;
}
double CalibrationMeasurement::OnePort::minFreq()
QTableWidgetItem *CalibrationMeasurement::OnePort::getStatisticsItem()
{
auto ret = Base::getStatisticsItem();
if(numPoints() > 0) {
if(!standard) {
ret->setBackgroundColor(Qt::red);
ret->setToolTip("No calibration standard assigned, unable to use this measurement");
} else if(standard->minFrequency() > points.front().frequency || standard->maxFrequency() < points.back().frequency) {
ret->setBackgroundColor(Qt::yellow);
ret->setToolTip("Usable frequency range constrained by calibration standard to "+Unit::ToString(minUsableFreq(), "Hz", " kMG", 4)+" - "+Unit::ToString(maxUsableFreq(), "Hz", " kMG", 4));
}
}
return ret;
}
double CalibrationMeasurement::OnePort::minUsableFreq()
{
if(points.size() > 0 && standard) {
return max(points.front().frequency, standard->minFrequency());
@ -231,7 +251,7 @@ double CalibrationMeasurement::OnePort::minFreq()
}
}
double CalibrationMeasurement::OnePort::maxFreq()
double CalibrationMeasurement::OnePort::maxUsableFreq()
{
if(points.size() > 0 && standard) {
return min(points.back().frequency, standard->maxFrequency());
@ -366,7 +386,22 @@ std::vector<CalibrationMeasurement::OnePort::Point> CalibrationMeasurement::OneP
return points;
}
double CalibrationMeasurement::TwoPort::minFreq()
QTableWidgetItem *CalibrationMeasurement::TwoPort::getStatisticsItem()
{
auto ret = Base::getStatisticsItem();
if(numPoints() > 0) {
if(!standard) {
ret->setBackgroundColor(Qt::red);
ret->setToolTip("No calibration standard assigned, unable to use this measurement");
} else if(standard->minFrequency() > points.front().frequency || standard->maxFrequency() < points.back().frequency) {
ret->setBackgroundColor(Qt::yellow);
ret->setToolTip("Usable frequency range constrained by calibration standard to "+Unit::ToString(minUsableFreq(), "Hz", " kMG", 4)+" - "+Unit::ToString(maxUsableFreq(), "Hz", " kMG", 4));
}
}
return ret;
}
double CalibrationMeasurement::TwoPort::minUsableFreq()
{
if(points.size() > 0 && standard) {
return max(points.front().frequency, standard->minFrequency());
@ -375,7 +410,7 @@ double CalibrationMeasurement::TwoPort::minFreq()
}
}
double CalibrationMeasurement::TwoPort::maxFreq()
double CalibrationMeasurement::TwoPort::maxUsableFreq()
{
if(points.size() > 0 && standard) {
return min(points.back().frequency, standard->maxFrequency());
@ -574,24 +609,6 @@ int CalibrationMeasurement::TwoPort::getPort1() const
return port1;
}
double CalibrationMeasurement::Isolation::minFreq()
{
if(points.size() > 0) {
return points.front().frequency;
} else {
return numeric_limits<double>::max();
}
}
double CalibrationMeasurement::Isolation::maxFreq()
{
if(points.size() > 0) {
return points.back().frequency;
} else {
return 0;
}
}
unsigned int CalibrationMeasurement::Isolation::numPoints()
{
return points.size();

View File

@ -6,6 +6,7 @@
#include <QDateTime>
#include <QObject>
#include <QTableWidgetItem>
class Calibration;
@ -33,8 +34,11 @@ public:
virtual bool setFirstSupportedStandard();
virtual bool setStandard(CalStandard::Virtual *standard);
virtual QTableWidgetItem *getStatisticsItem();
QString getStatistics();
virtual double minUsableFreq() = 0;
virtual double maxUsableFreq() = 0;
virtual double minFreq() = 0;
virtual double maxFreq() = 0;
virtual unsigned int numPoints() = 0;
@ -78,8 +82,12 @@ public:
Base(cal),
port(0) {}
virtual double minFreq() override;
virtual double maxFreq() override;
virtual QTableWidgetItem *getStatisticsItem() override;
virtual double minUsableFreq() override;
virtual double maxUsableFreq() override;
virtual double minFreq() override {return points.size() > 0 ? points.front().frequency : std::numeric_limits<double>::max();}
virtual double maxFreq() override {return points.size() > 0 ? points.back().frequency : 0;}
virtual unsigned int numPoints() override {return points.size();}
virtual bool readyForMeasurement() override {return standard != nullptr;}
virtual bool readyForCalculation() override {return standard && points.size() > 0;}
@ -193,8 +201,12 @@ public:
port2(0),
reverseStandard(false){}
virtual double minFreq() override;
virtual double maxFreq() override;
virtual QTableWidgetItem *getStatisticsItem() override;
virtual double minUsableFreq() override;
virtual double maxUsableFreq() override;
virtual double minFreq() override {return points.size() > 0 ? points.front().frequency : std::numeric_limits<double>::max();}
virtual double maxFreq() override {return points.size() > 0 ? points.back().frequency : 0;}
virtual unsigned int numPoints() override {return points.size();}
virtual bool readyForMeasurement() override {return standard != nullptr;}
virtual bool readyForCalculation() override {return standard && points.size() > 0;}
@ -265,8 +277,10 @@ public:
Isolation(Calibration *cal) :
Base(cal){}
virtual double minFreq() override;
virtual double maxFreq() override;
virtual double minUsableFreq() override {return minFreq();}
virtual double maxUsableFreq() override {return maxFreq();}
virtual double minFreq() override {return points.size() > 0 ? points.front().frequency : std::numeric_limits<double>::max();}
virtual double maxFreq() override {return points.size() > 0 ? points.back().frequency : 0;}
virtual unsigned int numPoints() override;
virtual bool readyForMeasurement() override {return true;}
virtual bool readyForCalculation() override {return points.size() > 0;}