Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 47 additions & 9 deletions src/components/StatusModal/CalibrationTable.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,52 @@ import { formatMetricValue } from '../../utils/formatMetricValue';
// Render calibration data as a table
export const CalibrationTable = (props) => {

const { calibrationData, qubitSwitch, couplerSwitch, qubitMetricOptions, couplerMetricOptions } = props;
const { calibrationData, qubitSwitch, qubitMetricOptions, couplerMetricOptions } = props;
if (!calibrationData) return <p>No calibration data available</p>;

const allMetrics = Object.keys(calibrationData);
if (allMetrics.length === 0) return <p>No metrics available</p>;

// Get all unique qubit/coupler IDs
const allIds = new Set();
const idMap = {}; // Map normalized IDs to actual IDs in data
allMetrics.forEach(metric => {
Object.keys(calibrationData[metric]).forEach(id => {
if (id !== 'statistics' && ((qubitSwitch && !id.includes("__")) || (couplerSwitch && id.includes("__")))) {
allIds.add(id);
if (id !== 'statistics' && ((qubitSwitch && !id.includes("__")) || (!qubitSwitch && id.includes("__")))) {
// Normalize the ID
const match = id.match(/QB(\d+)__QB(\d+)/);
let normalizedId = id;
if (match) {
const [, num1, num2] = match;
const smaller = Math.min(parseInt(num1), parseInt(num2));
const larger = Math.max(parseInt(num1), parseInt(num2));
normalizedId = `QB${smaller}__QB${larger}`;
}
allIds.add(normalizedId);
idMap[normalizedId] = id; // Store the actual ID
}
});
});

const sortedIds = Array.from(allIds);

var sortedIds;
if (qubitSwitch){
sortedIds = Array.from(allIds).sort((a, b) => {
const numA = parseInt(a.replace('QB', ''));
const numB = parseInt(b.replace('QB', ''));
return numA - numB;
});
} else {
sortedIds = Array.from(allIds).sort((a, b) => {
const [a1, a2] = a.match(/QB(\d+)__QB(\d+)/).slice(1).map(Number);
const [b1, b2] = b.match(/QB(\d+)__QB(\d+)/).slice(1).map(Number);
return a1 - b1 || a2 - b2;
});
}
// Filter out metrics that have only N/A values for the filtered IDs
const metrics = allMetrics.filter(metric => {
return sortedIds.some(id => {
const data = calibrationData[metric][id];
const actualId = idMap[id];
const data = calibrationData[metric][actualId];
const value = data?.value;
return value !== null && value !== undefined;
});
Expand All @@ -53,9 +77,23 @@ export const CalibrationTable = (props) => {
<tr key={id}>
<td>{id}</td>
{metrics.map(metric => {
const data = calibrationData[metric][id];
const value = data?.value;
const actualId = idMap[id];
let data = calibrationData[metric][actualId];
let value = data?.value;
const unit = data?.unit || '';

// Try flipped ID if value is N/A
if ((value === null || value === undefined) && actualId.includes("__")) {
const match = actualId.match(/QB(\d+)__QB(\d+)/);
if (match) {
const flippedId = `QB${match[2]}__QB${match[1]}`;
const flippedData = calibrationData[metric][flippedId];
if (flippedData?.value !== null && flippedData?.value !== undefined) {
value = flippedData.value;
}
}
}

return (
<td key={`${id}-${metric}`}>
{value !== null && value !== undefined ? formatMetricValue(value, unit) : 'N/A'}
Expand All @@ -69,4 +107,4 @@ export const CalibrationTable = (props) => {
</CTable>
</div>
);
};
};
4 changes: 1 addition & 3 deletions src/components/StatusModal/RawDataSwitcher.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,18 +53,16 @@ export const RawDataSwitcher = (props) => {
value={viewState.qubitSwitch}
onChangeValue={(e) => {
updateViewState('qubitSwitch', e.detail)
updateViewState('couplerSwitch', !e.detail)
}}
>
Qubits
</CSwitch>
</div>
<div className='mt-2 ml-2 flex flex-col'>
<CSwitch
value={viewState.couplerSwitch}
value={!viewState.qubitSwitch}
onChangeValue={(e) => {
updateViewState('qubitSwitch', !e.detail)
updateViewState('couplerSwitch', e.detail)
}}
>
Couplers
Expand Down
2 changes: 0 additions & 2 deletions src/components/StatusModal/StatusModalConent.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export const ModalContent = (props) => {
rawDataType: { name: 'Calibration Data', value: 'calibration_data' },
tableView: false,
qubitSwitch: true,
couplerSwitch: false,
});

// Update functions for grouped states
Expand Down Expand Up @@ -132,7 +131,6 @@ export const ModalContent = (props) => {
<CalibrationTable
calibrationData={calibrationData}
qubitSwitch={viewState.qubitSwitch}
couplerSwitch={viewState.couplerSwitch}
qubitMetricOptions={qubitMetricOptions}
couplerMetricOptions={couplerMetricOptions}
/>
Expand Down