Curve Digitizer in GX-TXT: le curve dei datasheet diventano Dataset
Dal programma a sé al viewer di GX-TXT
Nell’articolo di presentazione di GX-TXT avevo detto che sarei entrato nei singoli strumenti. Comincio dal Curve Digitizer, perché è da lì che entrano nel framework molti dei miei dati: le curve dei datasheet vecchi, che esistono solo come disegno.
Il Curve Digitizer esiste già come programma a sé: si apre l’immagine, si calibrano gli assi, si clicca sulla curva e si esce con un CSV. Dentro GX-TXT lo stesso lavoro cambia natura. L’immagine non si apre da file: è un Dataset importato nella Session. Il lavoro di digitalizzazione non è un file di progetto: è stato della Session. Il risultato non è un CSV da tenere in una cartella: è un Dataset con la sua provenienza, che i grafici, il fitter e gli altri moduli leggono senza riaprire il digitizer.
Il modello di calibrazione è quello del programma originale, quattro punti e trasformazione proiettiva. Attorno è cambiato quasi tutto il resto.
Versione e stato
Il viewer sarà disponibile nella release 0.9.8.10-dev-98 ed è compatibile anche con la dev-96. Non è completo al 100%, ma salvo bug è la versione con cui uscirà il framework. Il manuale allegato in fondo descrive la versione 1.2.17 del viewer.
Niente workspace: si lavora per configurazioni
Questa è la prima cosa da sapere per chi conosce già GX-TXT: il Curve Digitizer non supporta i workspace. Al loro posto usa le configurazioni.
Una configurazione è l’oggetto di lavoro del digitizer e lega una sola immagine sorgente a tutto quello che ci si costruisce sopra:
- l’ID del Dataset sorgente e l’impronta SHA-256 dei suoi byte;
- la definizione degli assi X e Y: etichetta, unità, ruolo semantico, minimo, massimo, scala lineare o logaritmica;
- le misure di calibrazione;
- le curve con i loro punti, nell’ordine in cui sono stati presi;
- l’eventuale definizione della famiglia di curve;
- le impostazioni di pubblicazione e le note.
Ogni configurazione ha un nome e un ID stabile, ed è salvata nella Session come documento interattivo. Si chiude GX-TXT, si riapre la Session, si riapre il viewer e si sceglie la configurazione dal selettore in alto: non c’è un file di progetto da salvare a parte. Dal menu Configuration si creano, rinominano, duplicano ed eliminano; eliminare una configurazione non cancella i Dataset già pubblicati.
La stessa immagine può reggere più configurazioni indipendenti. Una pagina di datasheet con le caratteristiche di placca, quelle di trasferimento e la corrente di griglia diventa tre configurazioni, ciascuna con la sua calibrazione e il suo Dataset di uscita. Il contrario è bloccato: una configurazione già calibrata non si sposta su un’altra immagine, perché la calibrazione vale solo per quei pixel. Per un’immagine nuova si crea una configurazione nuova.
Un’avvertenza per non confondersi: nel viewer c’è anche un menu Namespace. Serve a filtrare i Dataset immagine per gruppo organizzativo, non è un workspace, e cambiare filtro non cambia la sorgente di una configurazione.

Il flusso, in breve
- Si importa l’immagine (PNG, JPEG, BMP o TIFF) con l’acquisizione immagini di GX-TXT: diventa un Dataset
image.raster. - Si apre il Curve Digitizer dal menu Viewers, si crea una configurazione e si sceglie l’immagine.
- Si dichiarano gli assi: nome, unità, ruolo, minimo, massimo, scala.
- Si cliccano i quattro angoli dell’area dati e si verifica la calibrazione su un punto noto.
- Si creano le curve, con il valore del parametro se sono una famiglia, e si cliccano i punti.
- Si scrivono le note e si pubblica: il risultato è un Dataset di GX-TXT.
Calibrazione: quattro angoli e un controllo indipendente
Gli assi possono essere lineari o logaritmici in tutte e quattro le combinazioni; per un asse logaritmico i limiti devono essere positivi. I quattro angoli (basso-sinistra, basso-destra, alto-sinistra, alto-destra) definiscono un’omografia, quindi una scansione storta o leggermente in prospettiva si calibra senza raddrizzarla prima.
Quando il viewer dice che la calibrazione è pronta, vuol dire solo che la trasformazione è geometricamente valida. Il controllo vero si fa con Verify calibration: si clicca un incrocio della griglia di cui si conoscono le coordinate, si scrivono i valori attesi e il viewer riporta i valori calcolati e gli scarti. Nell’esempio del manuale, sul punto (1 V; 2 mA) gli scarti sono −0,012 V e −0,027 mA. La verifica non modifica la calibrazione.

La calibrazione si può ripetere senza toccare i punti già presi. Ogni nuova scelta dei quattro angoli è una misura a sé, con ID, etichetta e impronta propri, e si può accettare, scartare o rendere attiva. Più calibrazioni dello stesso grafico fanno vedere quanto conta la mano nel piazzare gli angoli. Il viewer però non trasforma questa dispersione in un’incertezza: non calcola medie e non inventa barre d’errore.
Famiglie di curve
Quando le curve differiscono per un parametro numerico, come VGS per un FET o la tensione di griglia per una valvola, si attiva la modalità famiglia: si dichiarano grandezza e unità del parametro e ogni curva riceve il suo valore. Il risultato si pubblica con il contratto curve_family.table, che il fitter e gli altri moduli riconoscono come famiglia. Se le curve stanno solo sullo stesso grafico senza un parametro comune, la modalità famiglia resta spenta.
Nel primo esempio del manuale le sei curve ID–VDS di un datasheet, con VGS da 0 a −1,25 V, danno 193 punti.
Nota sul manuale. Il manuale attribuisce questa famiglia di curve al 2N2222, ed è un errore: il 2N2222 è un transistor bipolare, mentre queste sono le caratteristiche di un FET, con VDS, VGS e una VGS(off) di −1,8 V. Il grafico è stato preso praticamente a caso e serve solo come esempio del flusso di lavoro; il nome 2n2222 che compare negli ID dei Dataset nelle schermate viene da lì.

I punti si prendono a mano, nell’ordine naturale di X, infittendo dove la curva piega. Un punto finito sulla griglia invece che sulla traccia si sposta con Move points, senza ricominciare la curva. Lo snap al pixel più scuro c’è, ma è un aiuto locale: su una scansione con la griglia spessa può agganciare la riga sbagliata.
Pubblicare: un Dataset, non un CSV
Nella scheda Publish si scelgono le calibrazioni accettate da pubblicare e il layout:
- separate: un Dataset per ciascuna calibrazione. È il default e va bene per qualunque modulo che legge X e Y;
- combined: un solo Dataset con tutte le calibrazioni, distinte da una colonna chiave. Serve solo a chi sa gestire quella dimensione in più.
Gli ID dei Dataset nascono da un modello di nomi, di default [name].[calibration].curves, con l’anteprima prima di pubblicare. Ogni Dataset porta con sé il manifesto della calibrazione (omografia esatta, tipo di calibrazione, assi, sorgente con la sua SHA-256), scritto nella stessa transazione dei dati, e conserva le coordinate originali in pixel dei punti. Le note della configurazione vengono aggiunte alle note del Dataset pubblicato.

Il Dataset pubblicato è un dato come gli altri: il Dataset Preview del framework disegna la famiglia senza sapere che viene da un digitizer.

Se l’immagine cambia
Una calibrazione vale solo per i pixel su cui è stata fatta. Per questo la configurazione registra la SHA-256 dell’immagine e la ricontrolla a ogni apertura. Se i byte sono cambiati la sorgente diventa STALE SOURCE: punti e calibrazioni restano, ma modifiche e pubblicazione si bloccano. Se il Dataset non esiste più diventa SOURCE MISSING, e la configurazione resta comunque salvata. In nessun caso il viewer riattacca in silenzio la vecchia calibrazione a un’immagine diversa.
Fotografie e immagini SEM
La seconda parte del manuale lavora su un’immagine sintetica in stile SEM di una microfessura metallica, fatta apposta per l’esercitazione: non è una misura reale. Qui non ci sono assi stampati. Auto-calibrate full image calibra l’intera immagine in pixel, poi si rileva la barra di scala (10 µm nell’esempio), in automatico o indicandone i due estremi, e si applica la scala fisica. La scala è assunta uguale in X e in Y.
Per vedere meglio i bordi c’è l’elaborazione dell’immagine: livelli, gamma, contrasto locale (CLAHE), riduzione del rumore, nitidezza, soglia. Sono solo operazioni che non toccano la geometria (niente ritaglio, rotazione o correzione di prospettiva), così la calibrazione resta valida. Originale ed elaborata si confrontano affiancate, e l’immagine elaborata si può pubblicare come Dataset a sé, con la sequenza dei filtri e i loro parametri nei metadati.

Rendere un bordo più nitido non lo rende più preciso: l’elaborazione aiuta l’occhio, non la misura.
Cosa non fa
- non riconosce le curve da solo e non legge il testo del grafico: niente tracciamento automatico, niente OCR. I punti li sceglie chi digitalizza;
- non apre file direttamente: l’immagine deve essere prima un Dataset della Session;
- non supporta i workspace: si lavora per configurazioni;
- richiede un display Tk (desktop locale o X11 forwarding);
- grafici e fit sui Dataset pubblicati dipendono dai moduli che li usano, di norma con GNU Octave.
Il manuale
Il manuale illustrato è in inglese, 77 pagine, versione 1.2.17. Contiene due procedure complete con le schermate reali (la famiglia di curve di un datasheet e l’immagine SEM), il riferimento di tutte le impostazioni del viewer, il manuale interno del modulo per intero e le specifiche delle tre API pubbliche: calibrazione, schema dei Dataset di curve, elaborazione dell’immagine.
Scarica il manuale del Curve Digitizer (PDF, 9 MB)
Il codice di GX-TXT è su GitHub: giuxlab-hub/GX-TXT. Se provate il digitizer, mi interessa sapere cosa funziona, cosa si rompe e cosa manca per il vostro lavoro.