Show gender of required standard in additional column

This commit is contained in:
Jan Käberich 2021-12-04 21:16:45 +01:00
parent ecf994cf4a
commit 45cf2200b8
5 changed files with 95 additions and 29 deletions

View File

@ -218,6 +218,9 @@ void Calibration::construct12TermPoints()
p.re11 = ((S22_through - p.re33)*(1.0 - p.re22 * actual.ThroughS22)-actual.ThroughS22*p.re23e32)
/ ((S22_through - p.re33)*(actual.ThroughS11-p.re22*deltaS)-deltaS*p.re23e32);
p.re23e01 = (S12_through - p.re03)*(1.0 - p.re11*actual.ThroughS11 - p.re22*actual.ThroughS22 + p.re11*p.re22*deltaS) / actual.ThroughS12;
points.push_back(p);
}
}
@ -237,6 +240,7 @@ void Calibration::constructPort1SOL()
// See page 13 of https://www.rfmentor.com/sites/default/files/NA_Error_Models_and_Cal_Methods.pdf
computeSOL(S11_short, S11_open, S11_load, p.fe00, p.fe11, p.fe10e01, actual.Open, actual.Short, actual.Load);
// All other calibration coefficients to ideal values
p.fex = 0.0;
p.fe30 = 0.0;
p.fe22 = 0.0;
p.fe10e32 = 1.0;
@ -244,6 +248,7 @@ void Calibration::constructPort1SOL()
p.re22 = 0.0;
p.re23e32 = 1.0;
p.re03 = 0.0;
p.rex = 0.0;
p.re11 = 0.0;
p.re23e01 = 1.0;
points.push_back(p);
@ -265,6 +270,7 @@ void Calibration::constructPort2SOL()
// See page 19 of https://www.rfmentor.com/sites/default/files/NA_Error_Models_and_Cal_Methods.pdf
computeSOL(S22_short, S22_open, S22_load, p.re33, p.re22, p.re23e32, actual.Open, actual.Short, actual.Load);
// All other calibration coefficients to ideal values
p.fex = 0.0;
p.fe30 = 0.0;
p.fe22 = 0.0;
p.fe10e32 = 1.0;
@ -272,6 +278,7 @@ void Calibration::constructPort2SOL()
p.fe11 = 0.0;
p.fe10e01 = 1.0;
p.re03 = 0.0;
p.rex = 0.0;
p.re11 = 0.0;
p.re23e01 = 1.0;
points.push_back(p);
@ -292,11 +299,13 @@ void Calibration::constructTransmissionNormalization()
p.re23e01 = S12_through / actual.ThroughS12;
// All other calibration coefficients to ideal values
p.fe30 = 0.0;
p.fex = 0.0;
p.fe22 = 0.0;
p.fe00 = 0.0;
p.fe11 = 0.0;
p.fe10e01 = 1.0;
p.re03 = 0.0;
p.rex = 0.0;
p.re11 = 0.0;
p.re33 = 0.0;
p.re22 = 0.0;
@ -396,6 +405,7 @@ void Calibration::constructTRL()
p.fe10e32 = S_B.m21;
// no isolation measurement available
p.fe30 = 0.0;
p.fex = 0.0;
// Reverse coefficients, normalize for S12 = 1.0
// => det(T)/T22 = 1.0
@ -416,6 +426,7 @@ void Calibration::constructTRL()
p.re33 = S_B.m22;
// no isolation measurement available
p.re03 = 0.0;
p.rex = 0.0;
points.push_back(p);
}
@ -1117,7 +1128,9 @@ Calibration::Point Calibration::getCalibrationPoint(Protocol::Datapoint &d)
ret.fe11 = low->fe11 * (1 - alpha) + high->fe11 * alpha;
ret.fe22 = low->fe22 * (1 - alpha) + high->fe22 * alpha;
ret.fe30 = low->fe30 * (1 - alpha) + high->fe30 * alpha;
ret.fex = low->fex * (1 - alpha) + high->fex * alpha;
ret.re03 = low->re03 * (1 - alpha) + high->re03 * alpha;
ret.rex = low->rex * (1 - alpha) + high->rex * alpha;
ret.re11 = low->re11 * (1 - alpha) + high->re11 * alpha;
ret.re22 = low->re22 * (1 - alpha) + high->re22 * alpha;
ret.re33 = low->re33 * (1 - alpha) + high->re33 * alpha;
@ -1141,6 +1154,12 @@ void Calibration::computeSOL(std::complex<double> s_m, std::complex<double> o_m,
tracking = directivity * match - delta;
}
void Calibration::computeIsolation(std::complex<double> x0_m, std::complex<double> x1_m, std::complex<double> reverse_match, std::complex<double> reverse_tracking, std::complex<double> reverse_directivity, std::complex<double> x0, std::complex<double> x1, std::complex<double> &internal_isolation, std::complex<double> &external_isolation)
{
external_isolation = (x1_m - x0_m)*(1.0 - reverse_match * (x1 - x0) + x1*x0*reverse_match*reverse_match) / (reverse_tracking * (x1 - x0));
internal_isolation = x0_m - external_isolation*(reverse_directivity + reverse_tracking*x0 / (1.0 - x0*reverse_match));
}
std::complex<double> Calibration::correctSOL(std::complex<double> measured, std::complex<double> directivity, std::complex<double> match, std::complex<double> tracking)
{
return (measured - directivity) / (measured * match - directivity * match + tracking);

View File

@ -138,9 +138,9 @@ private:
public:
double frequency;
// Forward error terms
std::complex<double> fe00, fe11, fe10e01, fe10e32, fe22, fe30;
std::complex<double> fe00, fe11, fe10e01, fe10e32, fe22, fe30, fex;
// Reverse error terms
std::complex<double> re33, re11, re23e32, re23e01, re22, re03;
std::complex<double> re33, re11, re23e32, re23e01, re22, re03, rex;
};
Point getCalibrationPoint(Protocol::Datapoint &d);
/*
@ -158,6 +158,15 @@ private:
std::complex<double> o_c = std::complex<double>(1.0, 0),
std::complex<double> s_c = std::complex<double>(-1.0, 0),
std::complex<double> l_c = std::complex<double>(0, 0));
void computeIsolation(std::complex<double> x0_m,
std::complex<double> x1_m,
std::complex<double> reverse_match,
std::complex<double> reverse_tracking,
std::complex<double> reverse_directivity,
std::complex<double> x0,
std::complex<double> x1,
std::complex<double> &internal_isolation,
std::complex<double> &external_isolation);
std::complex<double> correctSOL(std::complex<double> measured,
std::complex<double> directivity,
std::complex<double> match,

View File

@ -21,9 +21,10 @@ CalibrationTraceDialog::CalibrationTraceDialog(Calibration *cal, double f_min, d
model = new MeasurementModel(cal, measurements);
ui->tableView->setModel(model);
ui->tableView->setColumnWidth(0, 100);
ui->tableView->setColumnWidth(1, 350);
ui->tableView->setColumnWidth(2, 320);
ui->tableView->setColumnWidth(3, 160);
ui->tableView->setColumnWidth(1, 80);
ui->tableView->setColumnWidth(2, 350);
ui->tableView->setColumnWidth(3, 320);
ui->tableView->setColumnWidth(4, 160);
UpdateCalibrationStatus();
auto updateThroughStandardUI = [=](){
@ -37,6 +38,7 @@ CalibrationTraceDialog::CalibrationTraceDialog(Calibration *cal, double f_min, d
ui->throughZero->setEnabled(true);
ui->throughCalkit->setEnabled(true);
}
model->genderUpdated();
};
connect(ui->port1Group, qOverload<int>(&QButtonGroup::buttonClicked), [=](){
@ -73,6 +75,7 @@ CalibrationTraceDialog::CalibrationTraceDialog(Calibration *cal, double f_min, d
ui->port1Standards->hide();
ui->port2Standards->hide();
ui->throughStandard->hide();
ui->tableView->hideColumn((int) MeasurementModel::ColIndex::Gender);
// default selection is male
ui->port1Male->click();
ui->port2Male->click();

View File

@ -19,21 +19,46 @@ int MeasurementModel::rowCount(const QModelIndex &) const
int MeasurementModel::columnCount(const QModelIndex &) const
{
return ColIndexLast;
return (int) ColIndex::Last;
}
QVariant MeasurementModel::data(const QModelIndex &index, int role) const
{
auto info = cal->getMeasurementInfo(measurements[index.row()]);
if(role == Qt::DisplayRole) {
switch(index.column()) {
case ColIndexName:
switch((ColIndex) index.column()) {
case ColIndex::Name:
return info.name;
break;
case ColIndexDescription:
case ColIndex::Gender:
switch(measurements[index.row()]) {
case Calibration::Measurement::Port1Load:
case Calibration::Measurement::Port1Open:
case Calibration::Measurement::Port1Short:
if(cal->getPortStandard(1) == Calibration::PortStandard::Male) {
return "Male";
} else {
return "Female";
}
break;
case Calibration::Measurement::Port2Load:
case Calibration::Measurement::Port2Open:
case Calibration::Measurement::Port2Short:
if(cal->getPortStandard(2) == Calibration::PortStandard::Male) {
return "Male";
} else {
return "Female";
}
break;
default:
return "";
}
break;
case ColIndex::Description:
return info.prerequisites;
break;
case ColIndexData:
case ColIndex::Data:
if(info.points > 0) {
QString data = QString::number(info.points);
data.append(" points from ");
@ -45,16 +70,17 @@ QVariant MeasurementModel::data(const QModelIndex &index, int role) const
return "Not available";
}
break;
case ColIndexDate:
case ColIndex::Date:
return info.timestamp.toString("dd.MM.yyyy hh:mm:ss");
break;
}
} else if(role == Qt::SizeHintRole) {
switch(index.column()) {
case ColIndexName: return 200; break;
case ColIndexDescription: return 500; break;
case ColIndexData: return 300; break;
case ColIndexDate: return 300; break;
switch((ColIndex) index.column()) {
case ColIndex::Name: return 200; break;
case ColIndex::Gender: return 150; break;
case ColIndex::Description: return 500; break;
case ColIndex::Data: return 300; break;
case ColIndex::Date: return 300; break;
default: return QVariant(); break;
}
}
@ -65,11 +91,12 @@ QVariant MeasurementModel::data(const QModelIndex &index, int role) const
QVariant MeasurementModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if(orientation == Qt::Horizontal && role == Qt::DisplayRole) {
switch(section) {
case ColIndexName: return "Type"; break;
case ColIndexDescription: return "Prerequisites"; break;
case ColIndexData: return "Statistics"; break;
case ColIndexDate: return "Timestamp"; break;
switch((ColIndex) section) {
case ColIndex::Name: return "Type"; break;
case ColIndex::Gender: return "Gender"; break;
case ColIndex::Description: return "Prerequisites"; break;
case ColIndex::Data: return "Statistics"; break;
case ColIndex::Date: return "Timestamp"; break;
default: return QVariant(); break;
}
} else {
@ -83,6 +110,11 @@ void MeasurementModel::measurementUpdated(Calibration::Measurement m)
auto it = std::find(measurements.begin(), measurements.end(), m);
if(it != measurements.end()) {
int row = it - measurements.begin();
emit dataChanged(index(row, 0), index(row, ColIndexLast - 1));
emit dataChanged(index(row, 0), index(row, (int) ColIndex::Last - 1));
}
}
void MeasurementModel::genderUpdated()
{
emit dataChanged(index(0, (int) ColIndex::Gender), index(rowCount() - 1, (int) ColIndex::Gender));
}

View File

@ -11,6 +11,15 @@ class MeasurementModel : public QAbstractTableModel
{
Q_OBJECT
public:
enum class ColIndex {
Name,
Gender,
Description,
Data,
Date,
Last
};
MeasurementModel(Calibration *cal, std::vector<Calibration::Measurement> measurements);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
@ -20,15 +29,9 @@ public:
public slots:
void measurementUpdated(Calibration::Measurement m);
void genderUpdated();
private:
enum {
ColIndexName,
ColIndexDescription,
ColIndexData,
ColIndexDate,
ColIndexLast
};
Calibration *cal;
std::vector<Calibration::Measurement> measurements;
};