Domanda:
Come posso leggere i file FCS utilizzando le librerie open source?
WYSIWYG
2017-06-30 15:37:39 UTC
view on stackexchange narkive permalink

FCS è un formato dati brevettato utilizzato per memorizzare i dati della citometria a flusso. La versione più recente è FCS3.1. C'è della documentazione sul formato, ma non ci sono informazioni su come leggere questi file. Ci sono alcuni pacchetti R e un codice MATLAB per leggere un file FCS, ma sto cercando librerie standard sviluppate dal consorzio FCS o da qualsiasi altro gruppo. Vorrei anche sapere se FCS è un sottoinsieme di un formato di dati standard esistente che può essere letto da una libreria standard utilizzando qualsiasi linguaggio di programmazione.

Infine, vorrei convertire questi file in un formato facilmente leggibile come HDF5.

Trovo strano che tu chieda librerie standard ma escludi gli strumenti standard esistenti.
@Llopis l'OP non rifiuta gli strumenti standard, al contrario, sta cercando librerie standard.
@terdon Non sono sicuro di come vengano decise le librerie standard, ma un pacchetto R / Bioconductor o MATLAB mi sembra abbastanza standard (tranne se il consorzio FCS ne fornisce uno ovviamente).
@Llopis Per standard, intendo che esiste un'interfaccia indipendente dal sistema operativo e dalla lingua che consente la lettura di questi file. Ancora più importante, voglio sapere come i file FCS possono essere letti da qualsiasi lingua generale. Mi aspetto qualcosa come uno pseudocodice, per questo scopo.
Non sono ancora proprio sicuro di quello che vuoi: la documentazione a cui ti colleghi è il più vicino possibile a uno pseudocodice generale: contiene una specifica dettagliata e concisa del formato. Questa è la stessa informazione che trasmetterebbe uno pseudocodice ed è il modo convenzionale in cui vengono descritti i formati dei dati (lo pseudocodice non viene praticamente mai utilizzato per questo). Ciò, oltre all'esistenza di librerie per linguaggi di analisi comuni (R, Python, Matlab), dovrebbe essere sufficiente per lavorare con il formato.
@WYSIWYG Oltre a quanto affermato da Konrad, flowCore in Bioconductor è disponibile per Windows, iOS e Linux.
@KonradRudolph Quello che voglio è un'istruzione su come leggere questi file. La documentazione descrive il formato ma non sono riuscito a capire la procedura generale per leggere il formato che è ciò che intendevo per pseudocodice. Assumi solo che ** non ** voglio usare il bioconduttore; diciamo che voglio leggere questi file in C. Come devo procedere? Le macchine FACS usano un meccanismo standard / libreria io per leggere / scrivere file FCS o usano i propri codici? Ho pensato che se un formato fosse stato definito da un consorzio, avrebbero fornito un'interfaccia standard per il funzionamento rw.
Perché dici .fcs è un formato brevettato? Il disclaimer nella documentazione collegata afferma semplicemente "Si richiama l'attenzione sulla possibilità che l'implementazione di questo standard possa richiedere l'uso di materiale coperto da diritti di brevetto". Potrebbe non essere nemmeno possibile brevettarlo, vedere: https: // brevetti. stackexchange.com/questions/11968/can-patents-on-computer-file-formats-be-obtained
Tre risposte:
bli
2017-06-30 17:51:15 UTC
view on stackexchange narkive permalink

Alcuni anni fa, ho scritto uno script Python per convertire i file FCS in un formato separato da tabulazioni. Era ben lungi dal gestire tutte le possibilità offerte dalla descrizione del formato, ma almeno ha funzionato per alcuni dei file prodotti su una delle nostre macchine: http://www.igh.cnrs.fr/equip/Seitz/ en_equipe-programmes.html

La documentazione del formato che ho trovato abilita la decodifica (vedere la sezione 3 del pdf di cui parli), ma richiede la lettura dei dati in modalità binaria.

L'idea generale di questo formato (e, immagino, molti altri formati binari) è che c'è una zona di intestazione all'inizio del file con un numero definito di campi che codificano numeri che indicano come è strutturato il resto del file. Quindi una prima fase è analizzare questa intestazione, seguendo la descrizione data nella documentazione del formato. Le informazioni estratte dall'intestazione indicano dove trovare i dati e come sono codificati, sempre secondo le regole descritte nella documentazione del formato.

Nel caso questo possa essere utile, e per la cronaca, ecco il codice dallo script sopra menzionato (dopo aver rimosso i commenti, alcuni dei quali sono semplicemente copiati dalla documentazione del formato, e aggiungendone alcuni):

  #! / usr / bin / env python "" "Questo script cerca di leggere i dati della citometria a flusso FCS. Analisi del formato ispirata alle informazioni trovate qui: http: //isac-net.org/Resources-for-Cytometrists/Data-Standards/ Data-File-Standards / Flow-Cytometry-Data-File-Format-Standards.aspx "" "import re # Per decodificare dataimport con codifica binaria structimport sysclass Parametro (oggetto):" "" Questo oggetto rappresenta uno dei tipi di parametro che sono presenti in un segmento DATA di un file FCS. "" "__slots__ = (" p_name "," p_bits "," p_range "," p_ampl "," parser ") def __init __ (self, p_name, p_bits, p_range, p_am pl): self.p_name = p_name self.p_bits = p_bits self.p_range = p_range self.p_ampl = p_ampl
# Funzione per analizzare un valore del parametro nel segmento dati self.parser = Nessuno ############################### ############### Qui inizia l'analisi della parte dell'intestazione ## che indica dove sono le altre parti. ############################################## f = aperto (sys.argv [1], "rb") # Il nome del formato è codificato in 6 lettere # Una lettera ASCII è codificata con un octetfile_format = "" .join ([f.read (1) for __ nell'intervallo (6) ]) sys.stdout.write ("Formato:% s \ n"% file_format) # Le descrizioni del formato riservano 4 ottetti che saltiamo = f.read (4) # 8 blocchi di ottetti codificano le posizioni di inizio e fine # di parti diverse del datatext_start = int (f.read (8) .strip ("")) text_end = int (f.read (8) .strip ("")) data_start = int (f.read (8) .strip (" ")) data_end = int (f.read (8) .strip (" ")) analysis_start = int (f.read (8) .strip (" ")) analysis_end = int (f.read (8) .strip ( "")) if (analysis_start e analysis_end): sys.stderr.write ("Impossibile gestire il segmento ANALYSIS di un file FCS. \ n") ################## ################################## Qui inizia l'analisi della parte "TEXT" ## che descrive come i dati corretti sono organizzati ########################################### ######## f.seek (text_start) # Il primo carattere nel segmento TEXT principale è il carattere delimitatore ASCII.sep = f.read (1) se sep non è in ["_", "@"]: alt_sep = "_ @ _" elif sep non in ["_", " | "]: alt_sep =" _ | _ "else: assert sep non in [" + "," | "] alt_sep =" + | + "text_segment = f.read (text_end - text_start) fields = text_segment.split (sep ) info = {} i = 0 while i < len ​​(fields) - 1: key = fields [i] i + = 1 val = fields [i] i + = 1 # Le parole chiave non fanno distinzione tra maiuscole e minuscole, possono essere scritte in un file in lettere minuscole, maiuscole o un # misto dei due. Tuttavia, un lettore di file FCS deve ignorare le maiuscole / minuscole. Il valore di una parola chiave può # essere in lettere minuscole, maiuscole o una combinazione delle due. I valori delle parole chiave fanno distinzione tra maiuscole e minuscole. info [key.upper ()] = val
print "Sono stati rilevati% s eventi." % info ["$ TOT"] print "Ogni evento è caratterizzato da% s parametri"% info ["$ PAR"] if info ["$ NEXTDATA"]! = "0": sys.stderr.write ("Some other i dati esistono nel file ma non sono stati analizzati. \ n ") # L - Modalità elenco. Per ogni evento, il valore di ogni parametro viene memorizzato nell'ordine in cui sono descritti i parametri #. Il numero di bit riservati per il parametro 1 è descritto utilizzando la parola chiave # $ P1B. Può esserci un solo set di dati in modalità elenco per set di dati. La parola chiave $ DATATYPE # descrive il formato dei dati. Questa è la modalità più versatile per la memorizzazione dei dati di citometria a flusso # perché i dati della modalità C e della modalità U possono essere creati dalla modalità L data.assert info ["$ MODE"] == "L" parameters = [] # indici del parametersp_indices = range (1, int (info ["$ PAR"]) + 1) for i in p_indices: p_name = info ["$ P% dN"% i] p_bits = info ["$ P% dB"% i] p_range = info ["$ P% dR"% i] p_ampl = info ["$ P% dE"% i] parameters.append (Parameter (p_name, p_bits, p_range, p_ampl)) sys.stdout.write ("I parametri sono: \ n% s \ n "%" \ t ".join ([par.p_name for par in parameters])) # Come sono organizzate le parole a 32 bit se info [" $ BYTEORD "] ==" 4,3,2 , 1 ": endianness =" > "else: endianness =" < "assert info [" $ BYTEORD "] ==" 1,2,3,4 "# Ho rimosso un lungo commento che è solo una copia della documentazione # Tipo di dati: if info ["$ DATATYPE"] == "I": per par nei parametri: nb_bits = int (par.p_bits) asserire nb_bits% 8 == 0 nb_bytes = nb_bits / 8 # Determina la stringa di formato per unpacki ng (vedi https://docs.python.org/2/library/struct.html) if nb_bytes == 1: c_type = "B" # char elif unsigned nb_bytes == 2: c_type = "H" # unsigned short elif nb_bytes == 4: c_type = "L" # unsigned long elif nb_bytes == 8: c_type = "Q" # unsigned long long else:
raise ValueError, "Numero di byte (% d) non valido per un intero (vedi https://docs.python.org/2/library/struct.html#byte-order-size-and-alignment)." % nb_bytes fmt = "% s% s"% (endianness, c_type) p_range = int (par.p_range) def parser (data): value = struct.unpack (fmt, data.read (nb_bytes)) [0] prova: asserisci valore < p_range eccetto AssertionError: print "Valore% s maggiore di% d"% (str (value), p_range) valore restituito par.parser = parser passelse: raise NotImplementedError, "Finora è stata implementata solo l'analisi del valore intero . "out_file = open (sys.argv [2]," w ") out_file.write (" # amplification_types \ t "+" \ t ".join ([par.p_ampl per par in parametri]) +" \ n " ) out_file.write ("parameters \ t" + "\ t" .join ([par.p_name for par in parameters]) + "\ n") i = 1 ############# ################################# Qui inizia l'analisi dei dati propri ######## ###################################### f.seek (data_start) mentre f.tell ( ) < data_end: values ​​= [] for par in parameters: values.append (par.parser (f)) out_f ile.write ("% d \ t"% i + "\ t" .join (map (str, values)) + "\ n") i + = 1out_file.close () f.close ()  
L'idea generale di questo formato (e, immagino, molti altri formati binari) è che c'è una zona di intestazione all'inizio del file con un numero definito di campi che codificano numeri che indicano come è strutturato il resto del file. Quindi inizio analizzando questa intestazione, seguendo la descrizione fornita nella documentazione del formato. Le informazioni estratte dall'header mi dicono dove trovare i dati e come sono codificati, sempre secondo le regole descritte nella documentazione del formato. Non sono bravo a scrivere pseudocodice, ma posso provare ad aggiungere commenti nel codice Python.
Fiver
2019-02-03 08:49:29 UTC
view on stackexchange narkive permalink

Gestisco diverse librerie Python per l'interazione con i dati della citometria a flusso (file FCS). Il più recente dei quali, FlowKit, fornisce funzionalità per esportare i dati degli eventi come array NumPy, Pandas DataFrame o testo CSV. Utilizzando la libreria h5py , è banale esportare come file HDF5

gringer
2017-06-30 16:56:45 UTC
view on stackexchange narkive permalink

R / Bioconductor dispone di diversi pacchetti di elaborazione della citometria a flusso. Un punto di partenza per esaminare i dati citometrici da un livello elevato sarebbe openCyto (o la sua vignetta), che è un ampio set di strumenti per l'estrazione e l'analisi di base di FCS file.

In passato ho esaminato i file FCS come una struttura R utilizzando flowCore. Il caricamento di un singolo file FCS è abbastanza semplice e segue un modello R familiare:

  file.name <- "/dir/file.fcs"x <- read.FCS (file.name, transformation = FALSE) summary (x)  

Chiedere di convertire i file FCS in un "formato facilmente leggibile come HDF5" non sembra la domanda giusta. HDF5 è un formato contenitore e condivide molte somiglianze con i file system. Ho trovato la soluzione migliore per mantenere i file FCS così come sono, poiché è un formato binario compatto e standardizzato.

HDF5 non è una preoccupazione importante (mi piace e basta). Sono ancora curioso di sapere come funziona qualcosa come `read.FCS`. Credo che se FCS è un formato standard, dovrebbero esserci librerie standard (non proprietarie) per leggere / scrivere file FCS. Per ora sono costretto a usare R o Matlab (e ancora non ci sono librerie standard anche qui. Immagino che ci siano solo diversi pacchetti / programmi creati da diversi gruppi / individui; nessuno standard unico). E se volessi analizzare un file FCS su C, Fortran o Python (ecc.)?


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...