add all Norilsk calibs, add upd feautures

This commit is contained in:
mipt-user
2025-11-10 12:45:51 +03:00
parent 3f3fa39cf9
commit c1752f5e33
131 changed files with 194451 additions and 20100 deletions

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251021_vna2_s11_plata",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-21T15:01:22.834932",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251021_vna2_s11_plata",
"standard": "load",
"sweep_number": 57,
"sweep_timestamp": 1761033678.751442,
"created_timestamp": "2025-10-21T15:01:22.834573",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251021_vna2_s11_plata",
"standard": "open",
"sweep_number": 55,
"sweep_timestamp": 1761033490.9448445,
"created_timestamp": "2025-10-21T15:01:22.828740",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251021_vna2_s11_plata",
"standard": "short",
"sweep_number": 56,
"sweep_timestamp": 1761033582.5801551,
"created_timestamp": "2025-10-21T15:01:22.832002",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251022_Cabinet_Platyi_N2",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-22T16:18:30.295003",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251022_Cabinet_Platyi_N2",
"standard": "load",
"sweep_number": 16,
"sweep_timestamp": 1761124705.3246522,
"created_timestamp": "2025-10-22T16:18:30.294665",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251022_Cabinet_Platyi_N2",
"standard": "open",
"sweep_number": 14,
"sweep_timestamp": 1761124345.5289564,
"created_timestamp": "2025-10-22T16:18:30.288561",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251022_Cabinet_Platyi_N2",
"standard": "short",
"sweep_number": 15,
"sweep_timestamp": 1761124659.1153042,
"created_timestamp": "2025-10-22T16:18:30.292961",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251023_cabinet_samples",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-23T15:11:38.979279",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251023_cabinet_samples",
"standard": "load",
"sweep_number": 6,
"sweep_timestamp": 1761207096.755639,
"created_timestamp": "2025-10-23T15:11:38.978961",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251023_cabinet_samples",
"standard": "open",
"sweep_number": 4,
"sweep_timestamp": 1761206866.4641244,
"created_timestamp": "2025-10-23T15:11:38.955500",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251023_cabinet_samples",
"standard": "short",
"sweep_number": 5,
"sweep_timestamp": 1761206957.058148,
"created_timestamp": "2025-10-23T15:11:38.977151",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-24T16:11:14.707119",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
"standard": "load",
"sweep_number": 8,
"sweep_timestamp": 1761297068.5551102,
"created_timestamp": "2025-10-24T16:11:14.706824",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
"standard": "open",
"sweep_number": 6,
"sweep_timestamp": 1761296919.9108818,
"created_timestamp": "2025-10-24T16:11:14.687921",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251024_N2_cabinet_platyi_noamp",
"standard": "short",
"sweep_number": 7,
"sweep_timestamp": 1761296985.4298542,
"created_timestamp": "2025-10-24T16:11:14.705201",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-31T15:29:49.348949",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
"standard": "load",
"sweep_number": 23,
"sweep_timestamp": 1761913785.401429,
"created_timestamp": "2025-10-31T15:29:49.346894",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
"standard": "open",
"sweep_number": 21,
"sweep_timestamp": 1761913673.8630784,
"created_timestamp": "2025-10-31T15:29:49.290677",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251031_SOL_N2_g&r_forkvp",
"standard": "short",
"sweep_number": 22,
"sweep_timestamp": 1761913724.010445,
"created_timestamp": "2025-10-31T15:29:49.337144",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "241025_SOL_g&r_forkvp_N2",
"standards": [
"load",
"short",
"open"
],
"created_timestamp": "2025-10-24T12:11:24.607328",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "241025_SOL_g&r_forkvp_N2",
"standard": "load",
"sweep_number": 21,
"sweep_timestamp": 1761282597.914453,
"created_timestamp": "2025-10-24T12:11:24.590655",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "241025_SOL_g&r_forkvp_N2",
"standard": "open",
"sweep_number": 23,
"sweep_timestamp": 1761282662.8935268,
"created_timestamp": "2025-10-24T12:11:24.606098",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "241025_SOL_g&r_forkvp_N2",
"standard": "short",
"sweep_number": 22,
"sweep_timestamp": 1761282628.7853029,
"created_timestamp": "2025-10-24T12:11:24.599809",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-23T10:58:13.181202",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
"standard": "load",
"sweep_number": 23,
"sweep_timestamp": 1761191858.9400437,
"created_timestamp": "2025-10-23T10:58:13.180239",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
"standard": "open",
"sweep_number": 21,
"sweep_timestamp": 1761191773.1479347,
"created_timestamp": "2025-10-23T10:58:13.156746",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_SOL_grey&red_forkvp_231025",
"standard": "short",
"sweep_number": 22,
"sweep_timestamp": 1761191820.2173865,
"created_timestamp": "2025-10-23T10:58:13.175163",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_grey_211025",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-21T22:03:34.631095",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_grey_211025",
"standard": "load",
"sweep_number": 6,
"sweep_timestamp": 1761058968.8240635,
"created_timestamp": "2025-10-21T22:03:34.630310",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_grey_211025",
"standard": "open",
"sweep_number": 4,
"sweep_timestamp": 1761058894.0138934,
"created_timestamp": "2025-10-21T22:03:34.622858",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "N2_grey_211025",
"standard": "short",
"sweep_number": 5,
"sweep_timestamp": 1761058927.2508612,
"created_timestamp": "2025-10-21T22:03:34.627319",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_211025_grey&red",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-21T08:58:43.086454",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_211025_grey&red",
"standard": "load",
"sweep_number": 10,
"sweep_timestamp": 1761011885.4749713,
"created_timestamp": "2025-10-21T08:58:43.085331",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_211025_grey&red",
"standard": "open",
"sweep_number": 8,
"sweep_timestamp": 1761011802.4032564,
"created_timestamp": "2025-10-21T08:58:43.077201",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_211025_grey&red",
"standard": "short",
"sweep_number": 9,
"sweep_timestamp": 1761011841.287023,
"created_timestamp": "2025-10-21T08:58:43.081495",
"total_points": 1000
}

View File

@ -0,0 +1,18 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_grey&red_N2_221025",
"standards": [
"open",
"short",
"load"
],
"created_timestamp": "2025-10-22T11:12:29.520083",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_grey&red_N2_221025",
"standard": "load",
"sweep_number": 7,
"sweep_timestamp": 1761106309.8736792,
"created_timestamp": "2025-10-22T11:12:29.519011",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_grey&red_N2_221025",
"standard": "open",
"sweep_number": 5,
"sweep_timestamp": 1761106224.5574822,
"created_timestamp": "2025-10-22T11:12:29.508112",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s11_start100_stop8800_points1000_bw1khz.bin",
"mode": "s11",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "for_kvp_grey&red_N2_221025",
"standard": "short",
"sweep_number": 6,
"sweep_timestamp": 1761106268.756612,
"created_timestamp": "2025-10-22T11:12:29.513427",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"mode": "s21",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251023_n2_451u_noamp_through",
"standards": [
"through"
],
"created_timestamp": "2025-10-23T09:25:12.520901",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"mode": "s21",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "20251023_n2_451u_noamp_through",
"standard": "through",
"sweep_number": 16,
"sweep_timestamp": 1761186276.904338,
"created_timestamp": "2025-10-23T09:25:12.520239",
"total_points": 1000
}

View File

@ -7,10 +7,10 @@
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "bambambum",
"calibration_name": "T_N1_tair_451U_x2",
"standards": [
"through"
],
"created_timestamp": "2025-09-25T14:41:46.014320",
"created_timestamp": "2025-10-19T19:38:31.093090",
"is_complete": true
}

View File

@ -7,10 +7,10 @@
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "bimBimPatapim",
"calibration_name": "T_N1_tair_451U_x2",
"standard": "through",
"sweep_number": 1186,
"sweep_timestamp": 1758725431.370608,
"created_timestamp": "2025-09-24T17:50:35.610460",
"sweep_number": 79,
"sweep_timestamp": 1760877457.5906727,
"created_timestamp": "2025-10-19T19:38:31.092429",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"mode": "s21",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "T_N2_451U_x2_noamp_20251105",
"standards": [
"through"
],
"created_timestamp": "2025-11-05T20:50:07.441271",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"mode": "s21",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "T_N2_451U_x2_noamp_20251105",
"standard": "through",
"sweep_number": 14,
"sweep_timestamp": 1762365005.456789,
"created_timestamp": "2025-11-05T20:50:07.440235",
"total_points": 1000
}

View File

@ -7,10 +7,10 @@
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "bimBimPatapim",
"calibration_name": "T_N2_noamp_451U_x2",
"standards": [
"through"
],
"created_timestamp": "2025-09-24T17:50:35.610853",
"created_timestamp": "2025-10-21T14:32:41.701864",
"is_complete": true
}

View File

@ -7,10 +7,10 @@
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "bambambum",
"calibration_name": "T_N2_noamp_451U_x2",
"standard": "through",
"sweep_number": 50,
"sweep_timestamp": 1758800474.7658994,
"created_timestamp": "2025-09-25T14:41:46.014170",
"sweep_number": 45,
"sweep_timestamp": 1761031914.1084657,
"created_timestamp": "2025-10-21T14:32:41.687603",
"total_points": 1000
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"mode": "s21",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "T_N2_tair_451U_x2_151025",
"standards": [
"through"
],
"created_timestamp": "2025-10-15T14:48:36.080061",
"is_complete": true
}

View File

@ -0,0 +1,16 @@
{
"preset": {
"filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"mode": "s21",
"start_freq": 100000000.0,
"stop_freq": 8800000000.0,
"points": 1000,
"bandwidth": 1000.0
},
"calibration_name": "T_N2_tair_451U_x2_151025",
"standard": "through",
"sweep_number": 15,
"sweep_timestamp": 1760528906.2259266,
"created_timestamp": "2025-10-15T14:48:36.078899",
"total_points": 1000
}

View File

@ -35,7 +35,7 @@ VNA_PID = 0x5740 # STM32 Virtual ComPort
# -----------------------------------------------------------------------------
# Simulator mode settings
# -----------------------------------------------------------------------------
USE_SIMULATOR = True # Set to True to use simulator instead of real device
USE_SIMULATOR = False # Set to True to use simulator instead of real device
SIMULATOR_SWEEP_FILE = BASE_DIR / "binary_input" / "sweep_example" / "example.json"
SIMULATOR_NOISE_LEVEL = 100 # Standard deviation of Gaussian noise to add to real and imaginary parts

View File

@ -171,6 +171,133 @@ class BaseProcessor:
self._sweep_history.clear()
logger.debug("History cleared")
def append_history(self, history_data: list[dict[str, Any]]) -> ProcessedResult | None:
"""
Append sweep history from external source (e.g., loaded file) to existing history.
Parameters
----------
history_data:
List of history entries in the format exported by export_history_data.
Returns
-------
ProcessedResult | None
Result after appending history, or None if history is empty.
Notes
-----
- Only history is appended, processor config is NOT updated.
- If total history exceeds max_history limit, oldest entries are dropped.
"""
if not history_data:
logger.warning("Append history called with empty data")
return None
from vna_system.core.acquisition.sweep_buffer import SweepData
from vna_system.core.settings.preset_manager import VNAMode
with self._lock:
initial_count = len(self._sweep_history)
# Convert imported data to internal format (same as import_history_data)
for idx, entry in enumerate(history_data):
sweep_points = entry.get("sweep_points", [])
calibrated_points = entry.get("calibrated_points", [])
reference_points = entry.get("reference_points", [])
raw_reference_points = entry.get("raw_reference_points", [])
# Reconstruct SweepData objects
sweep_data = SweepData(
sweep_number=initial_count + idx,
timestamp=entry.get("timestamp", 0.0),
points=sweep_points,
total_points=len(sweep_points)
) if sweep_points else None
calibrated_data = SweepData(
sweep_number=initial_count + idx,
timestamp=entry.get("timestamp", 0.0),
points=calibrated_points,
total_points=len(calibrated_points)
) if calibrated_points else None
reference_data = SweepData(
sweep_number=initial_count + idx,
timestamp=entry.get("timestamp", 0.0),
points=reference_points,
total_points=len(reference_points)
) if reference_points else None
raw_reference_data = SweepData(
sweep_number=initial_count + idx,
timestamp=entry.get("timestamp", 0.0),
points=raw_reference_points,
total_points=len(raw_reference_points)
) if raw_reference_points else None
# Reconstruct calibration standards
calibration_standards = None
cal_standards_data = entry.get("calibration_standards")
if cal_standards_data:
calibration_standards = {}
for std_name, std_data in cal_standards_data.items():
std_points = std_data.get("points", [])
if std_points:
calibration_standards[std_name] = SweepData(
sweep_number=std_data.get("sweep_number", initial_count + idx),
timestamp=std_data.get("timestamp", entry.get("timestamp", 0.0)),
points=std_points,
total_points=len(std_points)
)
# Reconstruct reference info
from vna_system.core.settings.reference_manager import ReferenceInfo
reference_info = None
ref_info_data = entry.get("reference_info")
if ref_info_data and ref_info_data.get("name"):
# Only create ReferenceInfo if we have required fields
try:
reference_info = ReferenceInfo(
name=ref_info_data.get("name", ""),
timestamp=datetime.fromtimestamp(ref_info_data.get("timestamp", 0.0)) if ref_info_data.get("timestamp") else datetime.now(),
preset_filename=ref_info_data.get("preset_filename", ""),
description=ref_info_data.get("description", ""),
metadata=ref_info_data.get("metadata")
)
except Exception:
# If ReferenceInfo creation fails, skip it
reference_info = None
# Reconstruct VNA config
vna_config = entry.get("vna_config", {})
# Append to history
self._sweep_history.append({
"sweep_data": sweep_data,
"calibrated_data": calibrated_data,
"vna_config": vna_config,
"reference_data": reference_data,
"reference_info": reference_info,
"raw_reference_data": raw_reference_data,
"calibration_standards": calibration_standards,
"timestamp": entry.get("timestamp", datetime.now().timestamp()),
})
self._trim_history()
final_count = len(self._sweep_history)
logger.info(
"History appended",
processor_id=self.processor_id,
added=len(history_data),
initial_count=initial_count,
final_count=final_count,
dropped=initial_count + len(history_data) - final_count
)
return self.recalculate()
def _trim_history(self) -> None:
"""Internal: keep only the newest `_max_history` items."""
if len(self._sweep_history) > self._max_history:
@ -636,17 +763,29 @@ class BaseProcessor:
"timestamp": getattr(std_data, "timestamp", None),
}
# Export reference info with all fields
ref_info_export = None
if reference_info:
ref_info_export = {
"name": getattr(reference_info, "name", None),
"timestamp": getattr(reference_info, "timestamp", datetime.now()).timestamp() if hasattr(reference_info, "timestamp") else None,
"preset_filename": getattr(reference_info, "preset_filename", None),
"description": getattr(reference_info, "description", None),
"metadata": getattr(reference_info, "metadata", None),
}
# Get timestamp safely
entry_timestamp = entry.get("timestamp")
timestamp_export = float(entry_timestamp) if entry_timestamp is not None else None
exported.append({
"timestamp": float(entry.get("timestamp")) if entry.get("timestamp") is not None else None,
"timestamp": timestamp_export,
"sweep_points": self._points_to_list(getattr(sweep_data, "points", [])),
"calibrated_points": self._points_to_list(getattr(calibrated_data, "points", [])),
"reference_points": self._points_to_list(getattr(reference_data, "points", [])),
"raw_reference_points": self._points_to_list(getattr(raw_reference_data, "points", [])),
"calibration_standards": cal_standards_export,
"reference_info": {
"name": getattr(reference_info, "name", None),
"description": getattr(reference_info, "description", None),
} if reference_info else None,
"reference_info": ref_info_export,
"vna_config": self._snapshot_vna_config(entry.get("vna_config")),
})
@ -671,6 +810,7 @@ class BaseProcessor:
sweep_points = entry.get("sweep_points", [])
calibrated_points = entry.get("calibrated_points", [])
reference_points = entry.get("reference_points", [])
raw_reference_points = entry.get("raw_reference_points", [])
# Reconstruct SweepData objects
# Use sequential index as sweep_number since it's not stored
@ -695,6 +835,46 @@ class BaseProcessor:
total_points=len(reference_points)
) if reference_points else None
raw_reference_data = SweepData(
sweep_number=idx,
timestamp=entry.get("timestamp", 0.0),
points=raw_reference_points,
total_points=len(raw_reference_points)
) if raw_reference_points else None
# Reconstruct calibration standards
calibration_standards = None
cal_standards_data = entry.get("calibration_standards")
if cal_standards_data:
calibration_standards = {}
for std_name, std_data in cal_standards_data.items():
std_points = std_data.get("points", [])
if std_points:
calibration_standards[std_name] = SweepData(
sweep_number=std_data.get("sweep_number", idx),
timestamp=std_data.get("timestamp", entry.get("timestamp", 0.0)),
points=std_points,
total_points=len(std_points)
)
# Reconstruct reference info
from vna_system.core.settings.reference_manager import ReferenceInfo
reference_info = None
ref_info_data = entry.get("reference_info")
if ref_info_data and ref_info_data.get("name"):
# Only create ReferenceInfo if we have required fields
try:
reference_info = ReferenceInfo(
name=ref_info_data.get("name", ""),
timestamp=datetime.fromtimestamp(ref_info_data.get("timestamp", 0.0)) if ref_info_data.get("timestamp") else datetime.now(),
preset_filename=ref_info_data.get("preset_filename", ""),
description=ref_info_data.get("description", ""),
metadata=ref_info_data.get("metadata")
)
except Exception:
# If ReferenceInfo creation fails, skip it
reference_info = None
# Restore VNAMode enum from string if needed
vna_config = entry.get("vna_config", {})
if isinstance(vna_config.get("mode"), str):
@ -707,6 +887,9 @@ class BaseProcessor:
"sweep_data": sweep_data,
"calibrated_data": calibrated_data,
"reference_data": reference_data,
"raw_reference_data": raw_reference_data,
"reference_info": reference_info,
"calibration_standards": calibration_standards,
"vna_config": vna_config,
"timestamp": entry.get("timestamp"),
})

View File

@ -1,11 +1,11 @@
{
"open_air": false,
"axis": "phase",
"cut": 0.279,
"max": 4.0,
"gain": 0.5,
"start_freq": 100.0,
"stop_freq": 8230.0,
"open_air": true,
"axis": "abs",
"cut": 0.244,
"max": 1.0,
"gain": 1.0,
"start_freq": 600.0,
"stop_freq": 6080.0,
"clear_history": false,
"data_limit": 500
}

View File

@ -3,6 +3,6 @@
"y_max": 40,
"autoscale": true,
"show_magnitude": true,
"show_phase": false,
"open_air": true
"show_phase": true,
"open_air": false
}

View File

@ -144,6 +144,51 @@ class BScanProcessor(BaseProcessor):
self._plot_history.clear()
logger.info("Plot and sweep history cleared completely", processor_id=self.processor_id)
def delete_column(self, column_index: int) -> bool:
"""
Delete a specific column (sweep) from the plot history.
Parameters
----------
column_index : int
The 1-based column index to delete (matching the sweep number displayed to the user).
Returns
-------
bool
True if deletion was successful, False otherwise.
"""
try:
with self._lock:
# Convert 1-based index to 0-based
array_index = column_index - 1
if array_index < 0 or array_index >= len(self._plot_history):
logger.warning(
"Invalid column index for deletion",
column_index=column_index,
history_length=len(self._plot_history)
)
return False
# Delete from plot history
del self._plot_history[array_index]
# Also delete from sweep history if indices match
if array_index < len(self._sweep_history):
del self._sweep_history[array_index]
logger.info(
"Column deleted successfully",
column_index=column_index,
remaining_columns=len(self._plot_history)
)
return True
except Exception as exc:
logger.error("Column deletion failed", error=repr(exc), column_index=column_index)
return False
# -------------------------------------------------------------------------
# Processing
# -------------------------------------------------------------------------

View File

@ -206,6 +206,47 @@ class ProcessorManager:
logger.error("History load error", processor_id=processor_id, error=repr(exc))
raise
def append_processor_history(self, processor_id: str, history_data: list[dict[str, Any]]) -> ProcessedResult | None:
"""
Append sweep history to existing processor history from JSON data and recalculate.
Does NOT update processor configuration - only appends history.
Parameters
----------
processor_id : str
The processor to append history to.
history_data : list[dict]
History records in the format exported by export_history_data.
Returns
-------
ProcessedResult | None
The result of recalculation after appending history.
"""
processor = self.get_processor(processor_id)
if not processor:
raise ValueError(f"Processor {processor_id} not found")
try:
result = processor.append_history(history_data)
if result:
with self._lock:
callbacks = list(self._result_callbacks)
for cb in callbacks:
try:
cb(processor_id, result)
except Exception as exc: # noqa: BLE001
logger.error("Result callback failed", processor_id=processor_id, error=repr(exc))
logger.info("History appended and recalculated", processor_id=processor_id, records=len(history_data))
return result
except Exception as exc: # noqa: BLE001
logger.error("History append error", processor_id=processor_id, error=repr(exc))
raise
def build_processor_state(self, processor_id: str) -> dict[str, Any]:
"""Return a JSON-ready snapshot of processor state and current result."""
processor = self.get_processor(processor_id)

View File

@ -104,6 +104,10 @@ class ProcessorWebSocketHandler:
await self._handle_load_history(websocket, message)
elif mtype == "get_processor_state":
await self._handle_get_processor_state(websocket, message)
elif mtype == "delete_column":
await self._handle_delete_column(websocket, message)
elif mtype == "append_history":
await self._handle_append_history(websocket, message)
else:
await self._send_error(websocket, f"Неизвестный тип сообщения: {mtype!r}")
except json.JSONDecodeError as json_error:
@ -202,6 +206,33 @@ class ProcessorWebSocketHandler:
logger.error("History load failed", processor_id=processor_id, error=repr(exc))
await self._send_error(websocket, f"Загрузка истории не удалась: {exc}")
async def _handle_append_history(self, websocket: WebSocket, message: dict[str, Any]) -> None:
"""
Append sweep history from JSON data to existing processor history and recalculate.
Does NOT update processor configuration - only appends history.
"""
processor_id = message.get("processor_id")
history_data = message.get("history_data")
if not processor_id:
await self._send_error(websocket, "Требуется processor_id")
return
if not history_data or not isinstance(history_data, list):
await self._send_error(websocket, "Требуется history_data (список)")
return
try:
result = self.processor_manager.append_processor_history(processor_id, history_data)
if result:
await websocket.send_text(json.dumps(self._result_to_message(processor_id, result)))
else:
await self._send_error(websocket, f"Нет результата от процессора {processor_id} после дополнения истории")
except Exception as exc: # noqa: BLE001
logger.error("History append failed", processor_id=processor_id, error=repr(exc))
await self._send_error(websocket, f"Дополнение истории не удалось: {exc}")
async def _handle_get_processor_state(self, websocket: WebSocket, message: dict[str, Any]) -> None:
"""
Fetch complete processor state including sweep history and current data.
@ -222,6 +253,58 @@ class ProcessorWebSocketHandler:
logger.error("Error getting processor state", processor_id=processor_id, error=repr(exc))
await self._send_error(websocket, f"Ошибка получения состояния процессора: {exc}")
async def _handle_delete_column(self, websocket: WebSocket, message: dict[str, Any]) -> None:
"""
Delete a specific column (sweep) from the bscan processor plot history.
"""
processor_id = message.get("processor_id")
column_index = message.get("column_index")
if not processor_id:
await self._send_error(websocket, "Требуется processor_id")
return
if column_index is None or not isinstance(column_index, int):
await self._send_error(websocket, "Требуется column_index (целое число)")
return
try:
processor = self.processor_manager.get_processor(processor_id)
if processor is None:
await self._send_error(websocket, f"Процессор {processor_id} не найден")
return
# Check if processor has delete_column method (only BScanProcessor)
if not hasattr(processor, "delete_column"):
await self._send_error(
websocket,
f"Процессор {processor_id} не поддерживает удаление столбцов"
)
return
# Execute deletion
success = processor.delete_column(column_index)
if not success:
await self._send_error(
websocket,
f"Не удалось удалить столбец {column_index}"
)
return
# Recalculate and send updated result to all clients
result = processor.recalculate()
if result:
# Broadcast to all connected clients
message_str = json.dumps(self._result_to_message(processor_id, result))
await self._send_to_connections(message_str)
else:
await self._send_error(websocket, "Пересчёт после удаления не удался")
except Exception as exc: # noqa: BLE001
logger.error("Column deletion failed", processor_id=processor_id, error=repr(exc))
await self._send_error(websocket, f"Удаление столбца не удалось: {exc}")
def _result_to_message(self, processor_id: str, result: ProcessedResult) -> dict[str, Any]:
"""
Convert a `ProcessedResult` into a lightweight JSON-serializable message for broadcasting.

View File

@ -1,11 +1,11 @@
{
"name": "qweqwe",
"timestamp": "2025-10-16T19:41:41.209674",
"name": "20.10.25_point1",
"timestamp": "2025-10-20T11:12:35.907329",
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"description": "qweqwqwe",
"description": "",
"metadata": {
"calibration": {
"calibration_name": "bambambum",
"calibration_name": "T_N1_tair_451U_x2",
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin"
}
}

View File

@ -0,0 +1,12 @@
{
"name": "231025_N2_noamp_blue",
"timestamp": "2025-10-23T11:40:40.463989",
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"description": "",
"metadata": {
"calibration": {
"calibration_name": "20251023_n2_451u_noamp_through",
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin"
}
}
}

View File

@ -0,0 +1,12 @@
{
"name": "241025_N2_noamp_blue",
"timestamp": "2025-10-24T12:42:24.263579",
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin",
"description": "",
"metadata": {
"calibration": {
"calibration_name": "20251023_n2_451u_noamp_through",
"preset_filename": "s21_start100_stop8800_points1000_bw1khz.bin"
}
}
}

Some files were not shown because too many files have changed in this diff Show More