IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bioinformatique Perl Discussion :

Supprimer la redondance dans des sequences


Sujet :

Bioinformatique Perl

  1. #21
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    un last en ligne 46 serait une amélioration oui

  2. #22
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    ah il y a un problème d'accolade !
    il en manque une à la ligne 47, du coup le if de la ligne 49 est répété pour chaque séquence unique testée !!! au lieu de l'être uniquement si il n'a rien trouvé après avoir parcouru toutes les séquences uniques.

    donc tu te retrouves avec une augmentation exponentielle de tes séquences uniques, ce qui doit causer tes problèmes ^^

    au temps pour moi j'ai mal lu l'indentation

    ensuite vu que tu as trié tes séquences par taille, aucune des séquences testées ne sera contenue dans une séquence unique, à la limite tu pourras avoir 2 séquences identiques en cas de duplicat, mais pas plus => plus besoin de remplacer les séquences.
    tu peux donc commenter/effacer le premier if, du coup il faut ajouter un last dans le if restant
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #23
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    je viens de relire ton code brièvement et il me semble qu'il y a une erreur :
    ligne 39 :
    or si j'ai bien suivi, $_ correspond à ton jeu de séquences uniques. Par conséquent c'est le motif que tu cherches. Tu devrais par conséquent faire le contraire non ?

  4. #24
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par trex7g2 Voir le message
    Il y a des chances que tu passes/aies passé beaucoup de temps dans le sort... Trier 2 millions de valeurs c'est assez long. Et cette fonction est en C donc impossible d'améliorer/optimiser cette étape.
    Je n'ai pas cherché à comprendre le code, mais trier 2 millions d'enregistrements, ce n'est pas si long. Aujourd'hui, au boulot, j'avais 35 millions d'enregistrements, le tri dure moins de 15 minutes. Pour moi, le problème n'est pas là.

  5. #25
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    J'ai essayé de supprimer le premier if, mais cela ne me retourne pas le bon résultat, donc je pense qu'il est indispensable ...
    Cela me renvoit seulement la séquence n°7 de mon exemple ...

  6. #26
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bonjour,

    Après lecture très rapide, pourquoi ne pas procéder en deux fois ?
    C'est-à-dire lire le fichier deux fois.
    Une première fois pour trouver les séquences les plus courtes (en stockant les id) et une seconde lecture pour les récupérer et mettre dans un autre fichier.

    Cela permet de ne pas stocker en mémoire les séquences car je ne connais pas la taille de tes fichiers.

  7. #27
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Bonjour,
    Je ne suis pas sure de bien comprendre, tu suggères de couper le script en deux ? Mais cela serait plus rapide ?
    j'ai plus de 2 millions de séquences à analyser

  8. #28
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Heu, j'avais pas bien lu l'énoncé, tu ne connais pas par avance la similarité entre tes séquences ?

    Dans ce cas, je ne comprends pas très bien ton exemple ? Tu peux reexpliquer ?

  9. #29
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Bonjour,
    Non je ne connais pas la similarité entre mes séquences;
    J'ai un jeu de données, parmi lequel certaines séquences partagent un morceau de séquence en commun comme l'exemple que j'avais donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    >seq1
    ACTTTCCACAACGATGGAAGATGATGA
    >seq2
    ACTTTCCACAACGATGGAAGATGATGAA
    >seq3
    ATTCCACAACGATGGAAGATGATGAA
    >seq4
    CTTTCCACAACGATGGAAGATGATGAA
    >seq5
    NTCCACAACGATGGAAGATGATGAAGA
    >seq6
    TACTTTCCACAACGATGGAAGATGATGA
    >seq7
    TACTTTCCACAACGATGGAAGATGATGAA
    >seq8
    TCCACAACGATGGAAGATGATGA
    >seq9
    AAAGAAGAAATTGAATAAATATATGTC
    >seq10
    AAAGAAGAAATTGAATAAATATATGT
    >seq11
    AAAGAAGAAATTGAATAAATATATGTCA
    >seq12
    AAAGAAGAAATTGAATAAATATAT
    >seq13
    AAAGAAGAAATTGAATAAATATATG
    >seq14
    AAAGAAGAAATTGAATAAATATA
    Je souhaiterai trouver la séquence la plus petite que toutes ces séquences partagent entre elle (en gras dans mon exemple), et donc les seules séquences que j'aimerai récupérer sont les seq 8 et seq14
    >seq8
    TCCACAACGATGGAAGATGATGA
    >seq14
    AAAGAAGAAATTGAATAAATATA

  10. #30
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Entre la séquence 8 et 14, y a rien en commun. Donc, comment tu différencies ?
    Pour moi, soit tu cherches une similarité entre toutes les séquences, soit on trouvera tout et n'importe quoi.

  11. #31
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Non il n'y a rien entre la séquence 8 et 14 , mais ce sont les plus petites séquences, la séquence 8 est contenue dans les séquences 1 à 7 et la séquence 14 est contenu dans les séquence 9 à 13 ...

  12. #32
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    ça j'avais compris !

    Je suis juste en train de te demander ton algorithme .
    Car de ce que je vois de ton exemple, si ton fichier contient 10 séquences complétement différentes, tu aura donc 10 séquences en résultat, on est bien d'accord ?

    Car pour faire ça, il faut comparer les séquences deux par deux, c'est ce que tu fais ?

  13. #33
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    Bonjour,

    Donc si je comprends bien, tu veux récupérer un nombre minimal de séquences dans ton jeu de données. Et pas
    plus petite que toutes ces séquences partagent entre elle
    .... Car dans ce cas, et comme le dit djibril, tu ne récupérerais aucune des séquences.

    Si j'ai bien compris ce que tu cherches à faire, voici comment je procèderai :
    - Lecture ligne à ligne des séquences ;
    - Stockage de la première séquence dans un hash $1;
    - Passage à la deuxième ligne : comparaison de la séquence $2 avec celle(s) stockée(s) ;
    - Si la séquence $2 est plus courte et comprise dans celle stockée, ajout de s2 dans le hash et suppression de $1;
    - Si la séquence $1 est plus longue et comprise dans $2, conservation de $1 et passage à la ligne suivante ;
    - Si les séquences sont différentes, stockage de $2.

    Cela te permet d'effectuer les comparaisons ligne à ligne sans stocker l'ensemble des séquences.
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

  14. #34
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    si j'ai bien compris dans ton fichier tu as des "familles" de séquences ayant toutes un bot en commun, et tu cherches à n'avoir que la signature de ces familles, c'est à dire la partie commune.

    Dans l'algo que l'on tentait de faire avec gardyen, le but était donc de trier les séquences par taille, de manière a avoir au début les séquences les plus courtes, c'est à dire celles qui ne contiennent que la signature de leur famille respective. Puis on vérifie que toutes les autres séquences appartiennent à une famille que l'on connait déjà.

    je ne suis pas sur que ce soit beaucoup plus clair

  15. #35
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    j'ai réécrit le premier script que j'avais donné, à la rigueur tu peux changer la ligne avec le grep avec le foreach/last pour éviter de parcourir toutes les séquences uniques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Carp qw(confess);
    use Getopt::Long;
    use List::MoreUtils qw(uniq);
    use Bio::SeqIO;
     
    my %hash;
    my ($fasta_file,$out_file);
    GetOptions("fasta=s" => \$fasta_file,"out=s" => \$out_file);
    open(my $out,'>',$out_file) or die "$out_file : $!\n\n";
    my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
     
    # read file in hash
    while ( my $seq = $in->next_seq()){
    	my $id = $seq->id();
    	my $sequence = uc($seq->seq) ;
    	$hash{$sequence}=$id;
     }
     
    my @all_seq=sort {length($a) <=> length($b)} keys (%hash); # @seq contient toutes les sequences
    my @uniqueseq = ();
     
    foreach my $seqs (@all_seq){
    	my $seq=uc($seqs);  #uppercase
     
    	my @found = grep {$seq =~ /$_/} @uniqueseq;
    	if (!@found) {
    		push @uniqueseq, $seq;
    	}
    }
     
    foreach (@uniqueseq){
    	print ">$hash{$_}\n$_\n";
    }
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  16. #36
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Merci Gardyen, j'ai mit le script a tourner, wait and see !
    stoyak, je vais essayer d’écrire le script correspondant à l'algo et voir si c'est plus court en terme de temps !

Discussions similaires

  1. Requête pour supprimer caractères spéciaux dans des champs
    Par Laureoz dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/02/2012, 16h58
  2. [MySQL] supprimer les blancs dans des données
    Par lousa005 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2011, 14h56
  3. Eviter la redondance dans des fichiers
    Par Baptiste Wicht dans le forum ANT
    Réponses: 2
    Dernier message: 05/06/2009, 14h39
  4. [Turbo Pascal] Supprimer la redondance des caractères dans un texte
    Par achrefchouchou dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 28/01/2009, 22h10
  5. Supprimer un fichier dans un des repertoires du site?
    Par Death83 dans le forum Langage
    Réponses: 5
    Dernier message: 03/12/2005, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo