Salta ai contenuti

Caricamento massivo dalla riga di comando

Il comando ygg carica una cartella di immagini in un progetto. È pensato per dataset troppo grandi da selezionare in un browser: migliaia di file, molti pazienti, caricamenti che durano ore. Esegue lo stesso codice di de-identificazione e cifratura del browser, sulla tua macchina. Il server riceve ciò che invia un caricamento dal browser: file cifrati e metadati cifrati, mai i tuoi file né gli ID reali dei tuoi pazienti.

Legge i formati accettati dalle modalità del progetto (DICOM, NIfTI, NRRD, immagini, video, vetrini, mesh e segnali; vedi Formati supportati) e non converte nulla.

ygg è un singolo file senza dipendenze. Finché i rilasci non lo includono, compilalo dai sorgenti (con Deno 2.9 e pnpm):

Finestra del terminale
pnpm install
cd apps/cli
deno task compile # writes dist/ygg
Finestra del terminale
ygg login --server https://ygg.example.org --email you@example.org

Ricevi un’email con un codice di accesso; digitalo. La prima volta, il comando ha bisogno dell’approvazione di un dispositivo su cui le tue chiavi sono sbloccate, come un nuovo browser:

  1. ygg stampa un link e un codice.
  2. Sul tuo dispositivo attendibile, apri il link (oppure apri Sicurezza e digita il codice), poi Continua.
  3. Entrambi mostrano un codice di 6 cifre. Se corrispondono, scegli I codici corrispondono sul dispositivo attendibile.

Da quel momento questa macchina è uno dei tuoi dispositivi attendibili: conserva la propria chiave del dispositivo in ~/.config/yggdrasil/credentials.json, leggibile solo da te (YGG_CONFIG_DIR imposta un’altra cartella). La pagina Sicurezza la elenca insieme agli altri tuoi dispositivi. Gli accessi successivi richiedono solo il codice via email.

ygg logout termina la sessione; ygg logout --forget elimina anche la chiave del dispositivo di questa macchina. Rimuovi anche il suo slot nella pagina Sicurezza.

Finestra del terminale
ygg projects # your projects; "upload" where you may upload
ygg upload ./dataset --project my-study --mapping mapping.csv
  • Pazienti. I file DICOM sono raggruppati per Patient ID, studio e serie. Gli altri file non indicano alcun paziente: la cartella che contiene un file rappresenta il suo paziente e il suo studio (dataset/BraTS_001/BraTS_001_t1.nii.gz).
  • Gli pseudonimi provengono dal tuo file di corrispondenze, lo stesso CSV che la pagina di caricamento legge e salva (real_id,pseudonym). Resta sulla tua macchina; non viene mai inviato. Un paziente assente dal file di corrispondenze interrompe il caricamento. Con --assign <prefix>, a questi pazienti vengono assegnati nuovi pseudonimi (<prefix>0001, <prefix>0002, …), che vengono scritti nel file di corrispondenze prima di inviare qualsiasi cosa. (La pagina di caricamento invece precompila gli pseudonimi di questi pazienti dallo schema del progetto; ygg non lo legge.)
  • Centro. Carichi nel tuo centro; gli amministratori ne indicano uno con --site <name> quando il progetto ne ha più di uno.
  • Punti temporali. Ogni nuovo studio riceve il punto temporale successivo del paziente nell’ordine del manifest.
  • Serie segnalate. Alcune serie possono mostrare testo identificativo nei pixel (per esempio Burned In Annotation di DICOM, ecografie, foto). Il caricamento si ferma e le elenca. Controllale, poi carica con --include-flagged, oppure escludile con --skip-flagged. Per mascherare i pixel serve la pagina di caricamento.
  • --dry-run analizza la cartella e stampa il piano; non viene inviato nulla.

Il comando non compila i moduli clinici: i nuovi pazienti ricevono un modulo vuoto, che completi nella web app.

Interrompi un caricamento con Ctrl+C, o perdi la connessione: esegui di nuovo lo stesso comando e riprende da dove si era fermato. I file già conservati non vengono inviati di nuovo; gli altri vengono de-identificati e cifrati di nuovo. Ciò che il caricamento ha scritto viene conservato, cifrato con le tue chiavi, in ~/.config/yggdrasil/uploads/, anche dopo la fine: eseguire di nuovo il comando sulla stessa cartella invia solo i file che non ha conservato, come quelli aggiunti nel frattempo, e scrive di nuovo ciò che qualcuno ha eliminato dal progetto.

--restart dimentica ciò che i caricamenti precedenti della cartella hanno conservato e ricomincia da capo. Le istanze DICOM che le serie del paziente contengono già non vengono comunque inviate di nuovo: sono riconosciute dai loro UID de-identificati, anche quando la cartella è stata caricata da un altro computer o dall’app web. Gli altri formati non hanno nulla con cui confrontarli, quindi senza lo stato conservato creano nuove serie.

  • Il registro firmato del progetto viene ripercorso e verificato come fa un browser: il primo contatto lo fissa, e le esecuzioni successive rifiutano un registro che non contiene più ciò che questa macchina ha verificato.
  • Il manifest deve corrispondere al registro firmato del progetto.
  • I caricamenti vanno solo ai progetti in cui puoi caricare, con la chiave corrente del progetto.

Che cosa il comando non fa ancora: eseguire processori al caricamento (avviali dalla pagina Processori) e creare le miniature delle immagini (le serie DICOM hanno le loro). Il sorgente del comando si trova in apps/cli.