Filtrage des reads selon le phred quality d'une position génomique
Cet outil filtre les reads provenant d'un fichier BAM en fonction des scores de qualité Phred à des positions génomiques spécifiques. Il est conçu pour s'assurer que les reads conservés dans le fichier de sortie respectent un seuil de qualité spécifié à deux positions distinctes.
Utilisation
Pour utiliser ce script, vous devez avoir Python et la bibliothèque pysam installés. Vous pouvez exécuter le script depuis la ligne de commande en utilisant la syntaxe suivante :
python bam_quality_filter.py <chemin_bam_entree> <chemin_bam_sortie> <chromosome> <position1> <position2> <qualite_min> <chemin_fichier_log>
Paramètres
chemin_bam_entree
: Chemin vers le fichier BAM d'entrée.chemin_bam_sortie
: Chemin vers le fichier BAM de sortie où les reads filtrés seront sauvegardés.chromosome
: Chromosome à partir duquel les reads sont analysés (ex. :chr1
).position1
: Première position génomique (base 1) pour vérifier la qualité du read.position2
: Seconde position génomique (base 1) pour vérifier la qualité du read.qualite_min
: Qualité Phred minimale requise aux deux positions pour conserver un read.chemin_fichier_log
: Chemin vers le fichier log où les résultats du filtrage seront écrits.
Sortie
Le script créera un fichier BAM de sortie avec les reads ayant un score de qualité Phred supérieur au minimum spécifié aux deux positions indiquées. Il génère également un fichier log détaillant le statut de traitement de chaque read.
Dépendances
Python 3.x
pysam
Installez pysam via pip :
pip install pysam
Exemple
Exécutez le script avec la commande suivante :
python bam_quality_filter.py exemple.bam filtre.bam chr1 100000 100500 30 log_qualite.log
Cette commande filtre les reads en fonction de leur qualité aux positions 100000 et 100500 sur le chromosome 1, en exigeant une qualité Phred minimale de 30.
Le programme python
import pysam
import sys
input_bam_path = sys.argv[1]
output_bam_path = sys.argv[2]
chromosome = sys.argv[3]
position1 = int(sys.argv[4]) # Première position génomique, base 1
position2 = int(sys.argv[5]) # Seconde position génomique, base 1
min_quality = int(sys.argv[6]) # Qualité Phred minimale pour conserver un read
log_file_path = sys.argv[7]
input_bam = pysam.AlignmentFile(input_bam_path, "rb")
output_bam = pysam.AlignmentFile(output_bam_path, "wb", template=input_bam)
with open(log_file_path, 'w') as log_file:
log_file.write("ReadName\tBaseAtPosition1\tQuality1\tBaseAtPosition2\tQuality2\tStatus\n")
# Parcourir tous les reads qui couvrent au moins une des positions
start = min(position1, position2) - 1
end = max(position1, position2)
for read in input_bam.fetch(chromosome, start, end):
if not read.is_unmapped:
qualities = []
bases = ['N', 'N']
positions = [position1, position2]
status = "Kept"
for i, pos in enumerate(positions):
read_pos = None
for qpos, rpos in read.get_aligned_pairs():
if rpos == pos - 1:
read_pos = qpos
break
if read_pos is not None:
if read.query_qualities is not None and 0 <= read_pos < len(read.query_qualities):
qualities.append(read.query_qualities[read_pos])
else:
qualities.append(None)
if read.query_sequence is not None and 0 <= read_pos < len(read.query_sequence):
bases[i] = read.query_sequence[read_pos]
else:
qualities.append(None)
if any(q is not None and q < min_quality for q in qualities):
status = "Removed"
else:
output_bam.write(read)
log_file.write(f"{read.query_name}\t{bases[0]}\t{qualities[0]}\t{bases[1]}\t{qualities[1]}\t{status}\n")
input_bam.close()
output_bam.close()
Last updated