Files
obitools4/blackboard/architechture/obisuperkmer-implementation.md

269 lines
8.3 KiB
Markdown
Raw Normal View History

# Implémentation de la commande obisuperkmer
## Vue d'ensemble
La commande `obisuperkmer` a été implémentée en suivant l'architecture standard des commandes OBITools décrite dans `architecture-commande-obitools.md`. Cette commande permet d'extraire les super k-mers de fichiers de séquences biologiques.
## Qu'est-ce qu'un super k-mer ?
Un super k-mer est une sous-séquence maximale dans laquelle tous les k-mers consécutifs partagent le même minimiseur. Cette décomposition est utile pour :
- L'indexation efficace de k-mers
- La réduction de la redondance dans les analyses
- L'optimisation de la mémoire pour les structures de données de k-mers
## Structure de l'implémentation
### 1. Package `pkg/obitools/obisuperkmer/`
Le package contient trois fichiers :
#### `obisuperkmer.go`
Documentation du package avec une description de son rôle.
#### `options.go`
Définit les options de ligne de commande :
```go
var _KmerSize = 21 // Taille des k-mers (par défaut 21)
var _MinimizerSize = 11 // Taille des minimiseurs (par défaut 11)
```
**Options CLI disponibles :**
- `--kmer-size` / `-k` : Taille des k-mers (entre m+1 et 31)
- `--minimizer-size` / `-m` : Taille des minimiseurs (entre 1 et k-1)
**Fonctions d'accès :**
- `CLIKmerSize()` : retourne la taille des k-mers
- `CLIMinimizerSize()` : retourne la taille des minimiseurs
- `SetKmerSize(k int)` : définit la taille des k-mers
- `SetMinimizerSize(m int)` : définit la taille des minimiseurs
#### `superkmer.go`
Implémente la logique de traitement :
```go
func CLIExtractSuperKmers(iterator obiiter.IBioSequence) obiiter.IBioSequence
```
Cette fonction :
1. Récupère les paramètres k et m depuis les options CLI
2. Valide les paramètres (m < k, k <= 31, etc.)
3. Crée un worker utilisant `obikmer.SuperKmerWorker(k, m)`
4. Applique le worker en parallèle sur l'itérateur de séquences
5. Retourne un itérateur de super k-mers
### 2. Exécutable `cmd/obitools/obisuperkmer/main.go`
L'exécutable suit le pattern standard minimal :
```go
func main() {
// 1. Génération du parser d'options
optionParser := obioptions.GenerateOptionParser(
"obisuperkmer",
"extract super k-mers from sequence files",
obisuperkmer.OptionSet)
// 2. Parsing des arguments
_, args := optionParser(os.Args)
// 3. Lecture des séquences
sequences, err := obiconvert.CLIReadBioSequences(args...)
obiconvert.OpenSequenceDataErrorMessage(args, err)
// 4. Extraction des super k-mers
superkmers := obisuperkmer.CLIExtractSuperKmers(sequences)
// 5. Écriture des résultats
obiconvert.CLIWriteBioSequences(superkmers, true)
// 6. Attente de la fin du pipeline
obiutils.WaitForLastPipe()
}
```
## Utilisation du package `obikmer`
L'implémentation s'appuie sur le package `obikmer` qui fournit :
### `SuperKmerWorker(k int, m int) obiseq.SeqWorker`
Crée un worker qui :
- Extrait les super k-mers d'une BioSequence
- Retourne une slice de BioSequence, une par super k-mer
- Chaque super k-mer contient les attributs suivants :
```go
// Métadonnées ajoutées à chaque super k-mer :
{
"minimizer_value": uint64, // Valeur canonique du minimiseur
"minimizer_seq": string, // Séquence ADN du minimiseur
"k": int, // Taille des k-mers utilisée
"m": int, // Taille des minimiseurs utilisée
"start": int, // Position de début (0-indexé)
"end": int, // Position de fin (exclusif)
"parent_id": string, // ID de la séquence parente
}
```
### Algorithme sous-jacent
Le package `obikmer` utilise :
- `IterSuperKmers(seq []byte, k int, m int)` : itérateur sur les super k-mers
- Une deque monotone pour suivre les minimiseurs dans une fenêtre glissante
- Complexité temporelle : O(n) où n est la longueur de la séquence
- Complexité spatiale : O(k-m+1) pour la deque
## Exemple d'utilisation
### Ligne de commande
```bash
# Extraction avec paramètres par défaut (k=21, m=11)
obisuperkmer sequences.fasta > superkmers.fasta
# Spécifier les tailles de k-mers et minimiseurs
obisuperkmer -k 25 -m 13 sequences.fasta -o superkmers.fasta
# Avec plusieurs fichiers d'entrée
obisuperkmer --kmer-size 31 --minimizer-size 15 file1.fasta file2.fasta > output.fasta
# Format FASTQ en entrée, FASTA en sortie
obisuperkmer sequences.fastq --fasta-output -o superkmers.fasta
# Avec compression
obisuperkmer sequences.fasta -o superkmers.fasta.gz --compress
```
### Exemple de sortie
Pour une séquence d'entrée :
```
>seq1
ACGTACGTACGTACGTACGTACGT
```
La sortie contiendra plusieurs super k-mers :
```
>seq1_superkmer_0_15 {"minimizer_value":123456,"minimizer_seq":"acgtacgt","k":21,"m":11,"start":0,"end":15,"parent_id":"seq1"}
ACGTACGTACGTACG
>seq1_superkmer_8_24 {"minimizer_value":789012,"minimizer_seq":"gtacgtac","k":21,"m":11,"start":8,"end":24,"parent_id":"seq1"}
TACGTACGTACGTACGT
```
## Options héritées de `obiconvert`
La commande hérite de toutes les options standard d'OBITools :
### Options d'entrée
- `--fasta` : forcer le format FASTA
- `--fastq` : forcer le format FASTQ
- `--ecopcr` : format ecoPCR
- `--embl` : format EMBL
- `--genbank` : format GenBank
- `--input-json-header` : en-têtes JSON
- `--input-OBI-header` : en-têtes OBI
### Options de sortie
- `--out` / `-o` : fichier de sortie (défaut : stdout)
- `--fasta-output` : sortie en format FASTA
- `--fastq-output` : sortie en format FASTQ
- `--json-output` : sortie en format JSON
- `--output-json-header` : en-têtes JSON en sortie
- `--output-OBI-header` / `-O` : en-têtes OBI en sortie
- `--compress` / `-Z` : compression gzip
- `--skip-empty` : ignorer les séquences vides
- `--no-progressbar` : désactiver la barre de progression
## Compilation
Pour compiler la commande :
```bash
cd /chemin/vers/obitools4
go build -o bin/obisuperkmer ./cmd/obitools/obisuperkmer/
```
## Tests
Pour tester la commande :
```bash
# Créer un fichier de test
echo -e ">test\nACGTACGTACGTACGTACGTACGTACGTACGT" > test.fasta
# Exécuter obisuperkmer
obisuperkmer test.fasta
# Vérifier avec des paramètres différents
obisuperkmer -k 15 -m 7 test.fasta
```
## Validation des paramètres
La commande valide automatiquement :
- `1 <= m < k` : le minimiseur doit être plus petit que le k-mer
- `2 <= k <= 31` : contrainte du codage sur 64 bits
- `len(sequence) >= k` : la séquence doit être assez longue
En cas de paramètres invalides, la commande affiche une erreur explicite et s'arrête.
## Intégration avec le pipeline OBITools
La commande s'intègre naturellement dans les pipelines OBITools :
```bash
# Pipeline complet d'analyse
obiconvert sequences.fastq --fasta-output | \
obisuperkmer -k 21 -m 11 | \
obiuniq | \
obigrep -p "minimizer_value>1000" > filtered_superkmers.fasta
```
## Parallélisation
La commande utilise automatiquement :
- `obidefault.ParallelWorkers()` pour le traitement parallèle
- Les workers sont distribués sur les séquences d'entrée
- La parallélisation est transparente pour l'utilisateur
## Conformité avec l'architecture OBITools
L'implémentation respecte tous les principes de l'architecture :
✅ Séparation des responsabilités (package + commande)
✅ Convention de nommage cohérente (CLI*, Set*, _variables)
✅ Réutilisation de `obiconvert` pour l'I/O
✅ Options standard partagées
✅ Pattern Worker pour le traitement
✅ Validation des paramètres
✅ Logging avec `logrus`
✅ Gestion d'erreurs cohérente
✅ Documentation complète
## Fichiers créés
```
pkg/obitools/obisuperkmer/
├── obisuperkmer.go # Documentation du package
├── options.go # Définition des options CLI
└── superkmer.go # Implémentation du traitement
cmd/obitools/obisuperkmer/
└── main.go # Point d'entrée de la commande
```
## Prochaines étapes
1. **Compilation** : Compiler la commande avec `go build`
2. **Tests unitaires** : Créer des tests dans `pkg/obitools/obisuperkmer/superkmer_test.go`
3. **Documentation utilisateur** : Ajouter la documentation de la commande
4. **Intégration CI/CD** : Ajouter aux tests d'intégration
5. **Benchmarks** : Mesurer les performances sur différents jeux de données
## Références
- Architecture des commandes OBITools : `architecture-commande-obitools.md`
- Package `obikmer` : `pkg/obikmer/`
- Tests du package : `pkg/obikmer/superkmer_iter_test.go`