## Registrare e calcolare coppie di letture di bassa resistenza

Usa `blank-readings.csv` per letture reali e contesto; sostituisci `FILL_REAL_ID` con l’identificativo del campione. Le tre righe di `demo-readings.csv` sono inventate, non misure MTTJ o campioni di accettazione. `kelvin_pair_calc.py` calcola resistenza e offset da ciascuna coppia di correnti e tensioni con segno.

Python funziona offline con la sola libreria standard, senza pacchetti aggiuntivi. Non controlla strumenti, non verifica il circuito secco e non decide l’accettazione. Conferma separatamente ipotesi e specifica come nel testo.

## Le 16 colonne di ingresso

Non cambiare i nomi. Lo script usa quattro colonne di lettura per il calcolo; conserva le altre come contesto senza controllarne i valori.

| Colonna | Significato e unità |
| --- | --- |
| `sample_id` | Identificativo del campione della riga |
| `sample_state` | Stato al momento della misura |
| `spec_revision` | Revisione della specifica usata |
| `sense_A_B_drawing_ref` | Riferimento allo schema Sense A/B |
| `fixture_id` | Identificativo dell’attrezzatura |
| `method` | Metodo registrato; i modelli usano `four_wire_current_pair` |
| `range` | Portata dello strumento |
| `source_limit_mV` | Limite sorgente registrato, in mV |
| `sample_history` | Storia, incluse prove meccaniche, ambientali o elettriche precedenti |
| `i_plus_mA` | Corrente positiva misurata con segno, in mA; maggiore di 0 per calcolare |
| `i_minus_mA` | Corrente negativa misurata con segno, in mA; minore di 0 per calcolare |
| `v_plus_uV` | Tensione rilevata con segno abbinata a `i_plus_mA`, in μV |
| `v_minus_uV` | Tensione rilevata con segno abbinata a `i_minus_mA`, in μV |
| `sampled_plus_at` | Tempo della lettura positiva, conservato come testo |
| `sampled_minus_at` | Tempo della lettura negativa, conservato come testo |
| `note` | Note conservate con la riga originale |

Conserva tutti i segni. Una tensione zero è un valore numerico; un vuoto è una lettura mancante e resta vuoto. Se uno dei quattro campi manca, è vuoto o contiene solo spazi, lo script non inserisce zero. Anche i vuoti del contesto restano vuoti.

## Calcolo e quattro colonne di uscita

Ogni coppia completa e valida usa:

`R = (V+ − V−) / (I+ − I−)`

`E = V+ − I+ R`

La seconda formula ricava l’offset da `V = IR + E`. Con μV e mA, `R` è in mΩ ed `E` in μV. Si assumono linearità e offset stabile durante la coppia; un risultato non verifica le ipotesi. Le uscite hanno fino a 12 cifre significative.

| Uscita | Significato |
| --- | --- |
| `r_pair_mohm` | Resistenza calcolata in mΩ; vuota per coppie mancanti o invalide |
| `offset_pair_uV` | Offset calcolato in μV; vuoto per coppie mancanti o invalide |
| `calculation_status` | Stato: `calculated`, `missing` o `invalid` |
| `calculation_note` | Spiegazione dello stato e delle ipotesi |

| Stato | Quando viene scritto |
| --- | --- |
| `calculated` | Quattro ingressi numerici finiti, corrente positiva maggiore di 0, negativa minore di 0 e due uscite finite. Nota originale: `Assumes a linear resistor and stable offset. No acceptance judgment.` Assume linearità e offset stabile, senza giudizio di accettazione. |
| `missing` | Almeno una lettura assente o vuota; due uscite numeriche vuote. `Missing readings; no zero imputation.` segnala letture mancanti senza sostituzione con zero. |
| `invalid` | Ingresso non numerico o non finito, segni non validi o uscita non finita. Le uscite numeriche restano vuote e la nota indica la causa. |

Le note originali per `invalid` sono `Readings must be numeric.`, `Require finite readings and Iplus>0, Iminus<0.` o `Non-finite calculated output.` Richiedono valori numerici, finiti e segni corretti, oppure segnalano un’uscita non finita. Stati e note descrivono il calcolo, non l’accettazione prodotto.

## Leggere gli esempi inventati

| Riga | I+ / I− (mA) | V+ / V− (μV) | `r_pair_mohm` (mΩ) | `offset_pair_uV` (μV) | `calculation_status` |
| --- | --- | --- | ---: | ---: | --- |
| `DEMO_STABLE` | +10 / −10 | +110 / −90 | 10 | 10 | `calculated` |
| `DEMO_DRIFT` | +10 / −10 | +110 / −86 | 9.8 | 12 | `calculated` |
| `DEMO_UNEQUAL` | +12 / −8 | +130 / −70 | 10 | 10 | `calculated` |

La deriva cambia l’offset ipotizzato da 10 a 14 μV tra letture, producendo 9.8 mΩ e 12 μV. `calculated` non rileva né elimina la deriva. Correnti disuguali reali con segno +12 e −8 mA danno 10 mΩ. Con letture vuote nel modello, le due uscite numeriche sono vuote e lo stato è `missing`.

## Eseguire offline e conservare l’ingresso

Con script e CSV locali, esegui `python kelvin_pair_calc.py demo-readings.csv result.csv`. Per dati reali usa il modello compilato e un’uscita distinta. Lo script rifiuta percorsi di ingresso e uscita risolti allo stesso percorso, preservando l’originale.

Conserva le colonne originali e aggiunge quattro colonne di calcolo. Se già presenti con gli stessi nomi, le sostituisce con nuovi risultati. Scrive CSV UTF-8 con indicatore dell’ordine dei byte. I mancanti restano vuoti, senza decisione conforme/non conforme.
