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

Programmation et administration système Perl Discussion :

Besoin d'un peu d'aide


Sujet :

Programmation et administration système Perl

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 9
    Points
    9
    Par défaut Besoin d'un peu d'aide
    Bonjour à tous,

    Je suis Célia, étudiante en thèse de cancérologie sur Toulouse. Dans le cadre de ma thèse, j'étudie de phosphoprotéome de cellules cancéreuses pancréatiques traitées avec différentes drogues. Nous avons par conséquent généré beaucoup données et j'essaye de les traiter afin de trouver de nouvelles cibles thérapeutiques.

    Je me retrouve bloquer depuis quelques semaines sur une étape de tri des données impossible à la main car j'ai plus de 20 tableaux avec 8000 lignes chacun. Plus précisément, le tri consiste a apparié deux séquences (lignes) identiques : une séquence non marquée et une séquence marquée présentant l'information "Label" dans la partie Modification2 - Voir l'exemple. Ce que j'entends pas identique concerne l'information contenu dans les parties Séquence et la Modification1. Sachant que la comparaison ne doit pas prendre en compte la case de la séquence.

    Mes données ont la forme suivante:
    Sequence_Modification1_Modification2

    L'information "Label" est présente dans la modification2 si la séquence est marquée.

    Exemple:
    AGTLSITEFADmLSGNAGGFrsr_S22(Phospho);M12(Oxidation)_M12(Oxidation);R21(Label:13C(6)15N(4));S22(Phospho);R23(Label:13C(6)15N(4))
    AGmSSNQSISsPVLDAVPR_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho)
    AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    AGAGmITQHSSNAsPINR_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho)
    AHLsENELEALEK_S4(Phospho)_S4(Phospho)
    AGTLSITEFADMLSGNAGGFRsR_S22(Phospho)_S22(Phospho)
    AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    AHLTVGQAAAGGsGNLLTER_S13(Phospho)_S13(Phospho)
    AHLTVGQAAAGGsGNLLTEr_S13(Phospho)_S13(Phospho);R20(Label:13C(6)15N(4))
    AGAGmITQHSSNAsPINr_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho);R18(Label:13C(6)15N(4))
    Résultat attendu:
    --> Séquences appariées:
    AGmSSNQSISsPVLDAVPR_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho)
    AGmSSNQSISsPVLDAVPr_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho);R19(Label:13C(6)15N(4))
    AGAGmITQHSSNAsPINR_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho)
    AGAGmITQHSSNAsPINr_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho);R18(Label:13C(6)15N(4))
    AHLsENELEALEK_S4(Phospho)_S4(Phospho)
    AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    AHLTVGQAAAGGsGNLLTER_S13(Phospho)_S13(Phospho)
    AHLTVGQAAAGGsGNLLTEr_S13(Phospho)_S13(Phospho);R20(Label:13C(6)15N(4))
    --> Séquences non appariées :
    AGTLSITEFADMLSGNAGGFRsR_S22(Phospho)_S22(Phospho)
    AGTLSITEFADmLSGNAGGFrsr_S22(Phospho);M12(Oxidation)_M12(Oxidation);R21(Label:13C(6)15N(4));S22(Phospho);R23(Label:13C(6)15N(4))
    Avec mon collègue, nous avons écrit un script. Il fonctionne très bien pour les lignes ne contenant par l'information oxidation. Le voici :

    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
    37
    38
    my %copy_peptides_labeled =  %peptides_labeled ;
    my $motif = "" ;
    my $motif_ox = "" ;
    my $oxydation = 0 ;
     
    foreach my $k (keys(%peptides)) {
     
    	foreach my $labelled (keys(%peptides_labeled)) {
     
    		$oxydation = 0 ;
     
    		if ($k =~ /Oxidation/){
    			$k =~ /^([a-zA-Z]{4,}_[A-Z][0-9]+\(Phospho\);[A-Z][0-9]+\(Oxidation\))/i ;
    			$motif_ox = $1 ;
    			$oxydation = 1 ;
    		} else {
    			$k =~ /^([a-zA-Z]{4,}_[A-Z][0-9]+)/i ;
    			$motif = $1 ;
    		}
     
     
    			if  ($oxydation == 0 and $labelled =~ m/^$motif/i){
    				print "$k\n" ;
    				print "$labelled\n" ;	
    				delete $peptides_labeled{ $labelled } ;
    				delete $copy_peptides_labeled{ $labelled } ;
    			last ;
    			} 
     
    			if  ($oxydation == 1 and $labelled =~ m/^$motif_ox/i){
    			print "$k\n" ;
    			print "$labelled\n" ;
    			delete $peptides_labeled{ $labelled } ;
    			delete $copy_peptides_labeled{ $labelled } ;
    			last ;
    			}
     
    	}
    J'espère que vous avez compris mon problème et que vous arriverez à m'aider.

    Merci par avance

  2. #2
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Bonjour,

    Pour la prochaine fois, le forum "langage" est mieux adapté à ce type de question que "Programmation et administration système". Essaie par ailleurs d'utiliser les balises (en particulier la balise CODE).

    Sauf erreur de ma part il manque la ligne
    AGmSSNQSISsPVLDAVPr_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho);R19(Label:13C(6)15N(4))
    dans ta partie "Exemple:".

    de plus la ligne
    AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    est en double... Est-ce normal ?

    Moyennant cette correction, i.e. en prenant comme fichier d'entrée celiac.dat contenant
    AGTLSITEFADmLSGNAGGFrsr_S22(Phospho);M12(Oxidation)_M12(Oxidation);R21(Label:13C(6)15N(4));S22(Phospho);R23(Label:13C(6)15N(4))
    AGmSSNQSISsPVLDAVPR_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho)
    AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    AGAGmITQHSSNAsPINR_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho)
    AHLsENELEALEK_S4(Phospho)_S4(Phospho)
    AGTLSITEFADMLSGNAGGFRsR_S22(Phospho)_S22(Phospho)
    AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    AHLTVGQAAAGGsGNLLTER_S13(Phospho)_S13(Phospho)
    AHLTVGQAAAGGsGNLLTEr_S13(Phospho)_S13(Phospho);R20(Label:13C(6)15N(4))
    AGAGmITQHSSNAsPINr_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho);R18(Label:13C(6)15N(4))
    AGmSSNQSISsPVLDAVPr_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho);R19(Label:13C(6)15N(4))
    
    et avec le script celiac.pl suivant
    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
    37
    38
    39
    40
    41
    42
    43
    use strict;
    use warnings;
     
    my %unlabeled;
    my %labeled;
     
    # lecture du (ou des) fichier(s) contenant les séquences (marquées et non marquées). 
    while (defined(my $line = <>)) {
        $line =~ s/[\r\n]*$//;    
        next if $line =~ /^\s*$/;
        my ($cased_seq, $cased_mod1, $cased_mod2) = split /_/, $line;
        my ($lower_seq, $lower_mod1, $lower_mod2) = map { lc } ($cased_seq, $cased_mod1, $cased_mod2);
        # pour être indépendant de la casse on prend comme clé la version "en minuscules" de ${seq}_${mod1}
        my $key = $lower_seq . "_" . $lower_mod1;
        if ($lower_mod2 =~ /label/) {
    	# la séquence est marquée
    	warn "une sequence marquee existe deja pour la cle '$key'\n",
    	     "existante : $labeled{$key}\n",
    	     "courante  : $line\n" 
    		 if exists $labeled{$key};
    	$labeled{$key} = $line;
        } else {
    	# la séquence n'est pas marquée
    	warn "une sequence non marquee existe deja pour la cle '$key'\n",
    	     "existante : $unlabeled{$key}\n",
    	     "courante  : $line\n" 
    		 if exists $unlabeled{$key};
    	$unlabeled{$key} = $line;
        }
    }
     
    print "--> Sequences appariees:\n";
    for my $key (keys %unlabeled) {
        if (exists $labeled{$key}) {
    	print "$unlabeled{$key}\n";
    	print "$labeled{$key}\n";
    	delete $unlabeled{$key};
    	delete $labeled{$key};
        }
    }
    print "--> Sequences non appariees:\n";
    print "$_\n" for values(%unlabeled);
    print "$_\n" for values(%labeled);
    j'obtiens le résultat suivant :
    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
    Taisha:~/perl/forum $ perl celiac.pl celiac.dat
    une sequence marquee existe deja pour la cle 'ahlsenelealek_s4(phospho)'
    existante : AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    courante  : AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    --> Sequences appariees:
    AHLTVGQAAAGGsGNLLTER_S13(Phospho)_S13(Phospho)
    AHLTVGQAAAGGsGNLLTEr_S13(Phospho)_S13(Phospho);R20(Label:13C(6)15N(4))
    AHLsENELEALEK_S4(Phospho)_S4(Phospho)
    AHLsENELEALEk_S4(Phospho)_S4(Phospho);K13(Label:13C(6)15N(2))
    AGmSSNQSISsPVLDAVPR_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho)
    AGmSSNQSISsPVLDAVPr_S11(Phospho);M3(Oxidation)_M3(Oxidation);S11(Phospho);R19(Label:13C(6)15N(4))
    AGAGmITQHSSNAsPINR_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho)
    AGAGmITQHSSNAsPINr_S14(Phospho);M5(Oxidation)_M5(Oxidation);S14(Phospho);R18(Label:13C(6)15N(4))
    --> Sequences non appariees:
    AGTLSITEFADMLSGNAGGFRsR_S22(Phospho)_S22(Phospho)
    AGTLSITEFADmLSGNAGGFrsr_S22(Phospho);M12(Oxidation)_M12(Oxidation);R21(Label:13C(6)15N(4));S22(Phospho);R23(Label:13C(6)15N(4))
    Taisha:~/perl/forum $
    qui semble faire ce que tu veux (au warning près...). Mais je ne suis pas certain de comprendre quel est ton problème avec Oxidation.
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Celiac, ton script fait un cas particulier des séquences contenant "oxydation", et comme le dit cmcmc, tu ne spécifies rien de particulier dans ta question à propos de cela.

    De manière plus générale : qu'attends-tu en résultat et comment lis-tu les fichiers de 8000 lignes ? lecture des fichiers comme si concaténés ? ou chaque fichier doit être traité séparément ? ou certains des fichiers ont des fonctions particulières ? ...
    Pour le résultat : que faire si plus de 2 séquences identiques sont trouvées ? Comment ordonner les séquences appairées : d'abord la séquence avec label, et ensuite là ou les autres ? l'inverse ? l'ordre du fichier d'origine ? ...

    La question pouvait aussi avoir sa place en "bio-informatique".
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Bonsoir cmcmc,

    Merci pour votre réponse. C'est super, le tri s'effectue exactement comme je le souhaitais.

    Merci beaucoup pour votre aide!

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Bonsoir Philou,

    Effectivement, mon script n'arrivait pas à comparer les séquences contenant "oxydation". Je ne suis pas arrivée à trouver l'erreur/le problème. Le script de cmcmc fonctionne très bien et compare correctement ces séquences là.

    En résultat, j'attendais un premier groupe de séquences appariées : la séquence non marquée suivie en-dessous de la séquence identique marquée; et dans une deuxième groupe les séquences restantes non appariées.

    Oui, chaque fichier est lu et traité séparément. Un fichier représente une condition. Les fichiers n'ont pas de fonctions particulières.

    Pour obtenir les séquences précisées dans mon exemple, j'ai procédé à différentes étapes de concaténation afin d'avoir une organisation des différents éléments identiques. La machine m'a généré des infos dans des ordres complètement différents.

    Normalement, c'est impossible de trouver 2 séquences identiques. L'erreur dans l'exemple, c'est ma faute, erreur de copier/coller.

    Cmcmc a repondu à mon problème. Le tri est parfait.

    Merci pour votre réponse

  6. #6
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par celiac Voir le message
    Bonsoir cmcmc,

    Merci pour votre réponse. C'est super, le tri s'effectue exactement comme je le souhaitais.

    Merci beaucoup pour votre aide!
    Bonjour Celia,

    je suis content pour toi. Je serai encore plus content si toi (et ton collègue ) vous assurez que vous comprenez comment le programme fonctionne

    Parce qu'il y a quand même quelques trucs dans ton script initial qui font dresser les cheveux sur la tête ...

    Si vous comprenez tout, tant mieux, et encore plus tant mieux si vous pouvez le réutiliser dans d'autres cas de figure. Mais si vous avez des doutes, n'hésitez pas à poser des questions, soit dans ce fil soit dans le forum "langage" qui comme je te le disais sera probablement plus approprié.

    Enfin n'oublie pas que toi seule peut marquer cette question comme résolue (ce qui ne t'empêche pas d'y revenir si tu as plus tard une question à poser).

    Bonne continuation
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  7. #7
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Incidemment, je viens de mettre à jour (pour la troisième fois je crois) ma réponse initiale (ici). C'est une mise à jour mineure, mais comme une des précédente elle s'est avérée nécessaire suite à une erreur de copier/coller dans la partie
    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
        if ($lower_mod2 =~ /label/) {
    	# la séquence est marquée
    	warn "une sequence marquee existe deja pour la cle '$key'\n",
    	     "existante : $labeled{$key}\n",
    	     "courante  : $line\n" 
    		 if exists $labeled{$key};
    	$labeled{$key} = $line;
        } else {
    	# la séquence n'est pas marquée
    	warn "une sequence non marquee existe deja pour la cle '$key'\n",
    	     "existante : $unlabeled{$key}\n",
    	     "courante  : $line\n" 
    		 if exists $unlabeled{$key};
    	$unlabeled{$key} = $line;
        }
    En fait le code ci-dessus ne me ressemble pas. Je l'ai délayé pour le rendre plus intelligible mais cela a produit tellement de duplications que quand j'ai voulu le nettoyer un peu (en introduisant la déclaration et l'initialisation de $key par exemple) j'ai oublié de propager certaines modifications. C'est une des raisons pour lesquelles j'essaie normalement de produire un code aussi DRY (Don't Repeat Yourself) que possible... Et le code que j'écrirais normalement sur ce problème est le suivant :

    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
    use strict;
    use warnings;
     
    my %unlabeled;
    my %labeled;
     
    while (<>) {
        my @lf = map { lc } split /_/;
        ($lf[2] =~ /label/ ? \%labeled : \%unlabeled)->{"$lf[0]_$lf[1]"} = $_ 
    }
     
    print "--> Sequences appariees:\n";
    for my $key (keys %unlabeled) {
        if (exists $labeled{$key}) {
    	print "$unlabeled{$key}";
    	print "$labeled{$key}";
    	delete $unlabeled{$key};
    	delete $labeled{$key};
        }
    }
    print "--> Sequences non appariees:\n";
    print for values(%unlabeled);
    print for values(%labeled);
    Petite question pour Célia : est-ce que le code ci-dessus t'aurait convenu, ou au contraire rebuté ? Est-ce que tu le comprends ?
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par celiac Voir le message
    Pour obtenir les séquences précisées dans mon exemple, j'ai procédé à différentes étapes de concaténation afin d'avoir une organisation des différents éléments identiques. La machine m'a généré des infos dans des ordres complètement différents.
    Il y avait peut-être quelque chose à faire dès cette étape de "concaténation" ? Ce programme était écrit en perl ?
    Normalement, c'est impossible de trouver 2 séquences identiques. L'erreur dans l'exemple, c'est ma faute, erreur de copier/coller.
    J'ai déjà travaillé sur des données biologiques, et pour tous les cas non nominaux que j'avais identifiés au préalable, "on" m'avais assuré qu'ils n'étaient pas possible. Pourtant, il s'est trouvé que la plupart du temps, ces cas existaient bien dans les données d'entrée et devaient être pris en considération. Je ne doute pas de ta bonne foi sur ce cas, mais personnellement, je mettrais toujours en doute ce genre de réponse, et je traiterai toujours ces cas comme des exceptions (par défaut, si l'utilisateur de définit pas de traitement particulier, alors ce sera des exceptions fatales).

    Bonne journée.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Il y avait peut-être quelque chose à faire dès cette étape de "concaténation" ? Ce programme était écrit en perl ?
    J'ai déjà travaillé sur des données biologiques, et pour tous les cas non nominaux que j'avais identifiés au préalable, "on" m'avais assuré qu'ils n'étaient pas possible. Pourtant, il s'est trouvé que la plupart du temps, ces cas existaient bien dans les données d'entrée et devaient être pris en considération. Je ne doute pas de ta bonne foi sur ce cas, mais personnellement, je mettrais toujours en doute ce genre de réponse, et je traiterai toujours ces cas comme des exceptions (par défaut, si l'utilisateur de définit pas de traitement particulier, alors ce sera des exceptions fatales).
    a priori assez d'accord, quoique je me demande si ça aurait vraiment de l'importance ici. Si les deux séquences (labellisée et non-labellisée) apparaissent à l'identique chacune plusieurs fois dans le fichier, on n'en retrouvera qu'une de chaque dans le résultat. Est-ce grave ? Ce qui poserait vraiment problème c'est le cas de séquences avec les mêmes "$seq_mod1" mais des $mod2 différents.

    Peut-être suffit-il de tester que le nombre de lignes produites est identique au nombre de lignes d'entrée (aux titres près), et si ce n'est pas le cas, d'inspecter les données d'entrée de plus près ?
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Bonjour Cmcmc,

    J'ai quelques bases en programmation mais rien de très solide. En 2009, j'ai appris en cours à programmer en C, mais depuis, je n'ai jamais refait de programmation. Du coup, j'arrive à comprendre ton 1er code. Par contre ton 2ème code est beaucoup plus difficile à comprendre. Il me semble que l'essentiel de ce code est dans la ligne 9 qui commence par ($lf[2] = .......... Je ne comprends pas du tout cette ligne.

    Concernant ton 1er code, peux-tu stp m'expliquer que signifie exactement chaque symbole de "s/[\r\n]*$//"?

  11. #11
    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 celiac Voir le message
    Concernant ton 1er code, peux-tu stp m'expliquer que signifie exactement chaque symbole de "s/[\r\n]*$//"?
    Cette instruction retire les retours à la ligne (Windows et/ou Unix) en fin de ligne.

    Retour à la ligne Windows: \r\n
    Retour à la ligne Unix: \n
    [\r\n] : classe de caractères reconnaissant soit \n, soit \r
    [\r\n]* : reconnaît un nombre quelconque (0 ou plus) de caractères appartenant à la classe précédemment décrite
    $ : spécifie que ce ne doit être reconnu qu'en fin de ligne
    s/[\r\n]*$// : remplace les caractères reconnus de la classe, en fin de ligne, par rien (donc les élimine).

  12. #12
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Concernant ton 1er code, peux-tu stp m'expliquer que signifie exactement chaque symbole de "s/[\r\n]*$//"?
    Cette instruction retire les retours à la ligne (Windows et/ou Unix) en fin de ligne.

    Retour à la ligne Windows: \r\n
    Retour à la ligne Unix: \n
    [\r\n] : classe de caractères reconnaissant soit \n, soit \r
    [\r\n]* : reconnaît un nombre quelconque (0 ou plus) de caractères appartenant à la classe précédemment décrite
    $ : spécifie que ce ne doit être reconnu qu'en fin de ligne
    s/[\r\n]*$// : remplace les caractères reconnus de la classe, en fin de ligne, par rien (donc les élimine).
    Tu peux ajouter : Retour à la ligne sur les vieux Mac: \r

    A noter également, si cette forme apparaît comme une instruction complète, comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...;
    s/[\r\n]*$//;
    ...
    la substitution opère sur le topic par défaut ($_), c'est équivalent à $_ =~ s/[\r\n]*$//;Dans mon premier code la ligne complète était $line =~ s/[\r\n]*$//; et la substitution portait donc sur la variable $line.
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  13. #13
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par celiac Voir le message
    Par contre ton 2ème code est beaucoup plus difficile à comprendre.
    Hélas
    Citation Envoyé par celiac Voir le message
    Il me semble que l'essentiel de ce code est dans la ligne 9 qui commence par ($lf[2] = .......... Je ne comprends pas du tout cette ligne.
    Ok reprenons la boucle complète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (<>) {
        my @lf = map { lc } split /_/;
        ($lf[2] =~ /label/ ? \%labeled : \%unlabeled)->{"$lf[0]_$lf[1]"} = $_ 
    }
    Contrairement au premier code, on ne déclare pas de variable d'itération ($line) pour la boucle while. C'est donc le topic par défaut ($_) qui va contenir la ligne courante à l'intérieur de la boucle.

    La structure générale de chaque ligne est SEQ_MOD1_MOD2\n (ou peut être SEQ_MOD1_MOD2\r\n sous windows). Comme on est en fait indifférent la présence de \n ou \r\n en fin de ligne on ne se donne pas la peine de les enlever. Par contre on va décomposer la ligne en utilisant _ comme séparateur pour isoler SEQ, MOD1 et MOD2\n. En l'absence de second argument, split opère sur $_, dont on a vu qu'il contient la ligne courante. La forme split /_/ va donc retourner la liste (SEQ, MOD1, MOD2\n). La forme map { lc } va appliquer lc sur chaque élément de cette liste et renvoyer la liste des résultats, en l'occurrence les versions en minuscules de SEQ, MOD1 et MOD2\n. Plutôt que nommer explicitement les résultats comme on l'avait fait dans le premier code, on les stocke dans la liste @lf. $lf[0] contient donc la version en minuscules de SEQ, $lf[1] celle de MOD1, et $lf[2] celle de MOD2\n.

    L'interprétation de la ligne ($lf[2] =~ /label/ ? \%labeled : \%unlabeled)->{"$lf[0]_$lf[1]"} = $_ est affaire de méthode:

    • Cette ligne est de la forme A->{B} = $_, il s'agit donc de l'affectation du contenu de la ligne courante (porté par $_) dans l'élément de clé B du hash référencé par A.

    • Quelle est cette clé B ? Il s'agit de "$lf[0]_$lf[1]", que l'on aurait aussi pu écrire $lf[0] . "_" . $lf[1], c'est à dire la concaténation des versions en minuscules de SEQ et de MOD1, séparées par un underscore.

    • Et quelle est cette référence à un hash A ? Il s'agit de l'expression ($lf[2] =~ /label/ ? \%labeled : \%unlabeled), de la forme ( X ? Y : Z) qui retourne Y si X est vrai et Z sinon.

      • l'expression X est $lf[2] =~ /label/ qui teste si la valeur $lf[2] (la valeur en minuscules de MOD2\n) contient la chaîne "label"

      • si c'est le cas, on retourne Y, qui est définie comme \%labeled, à savoir une référence sur le hash %labeled

      • sinon on retourne Z, qui est définie comme \%unlabeled, à savoir une référence sur le hash %unlabeled


      autrement dit, on va alimenter le hash %labeled ou le hash %unlabeled selon que la valeur en minuscules de MOD2\n contienne ou non la chaîne "label"


    Avec un peu de pratique ce n'est pas difficile...
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  14. #14
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Bonjour Cmcmc,

    Merci pour ton explication détaillée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'un peu d'aide
    Par Alexis35 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 17/01/2012, 16h24
  2. Besoin d'un peu d'aide sur les pointeurs.
    Par techz dans le forum Débuter
    Réponses: 9
    Dernier message: 18/04/2009, 16h32
  3. strcpy () besoin d'un peu d'aide
    Par Panaméen dans le forum C
    Réponses: 12
    Dernier message: 03/12/2007, 09h05
  4. besoin d'un peu d'aide
    Par etpaflechien dans le forum Langage
    Réponses: 1
    Dernier message: 13/04/2006, 10h38

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