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 :

[bioinfo] pbl avec code


Sujet :

Bioinformatique Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut [bioinfo] pbl avec code
    salut, j'ai encore un petit pbl,

    voici mon code ( dont vous devez reconnaître une 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
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
     
    #!/usr/bin/perl -w
    use strict;
    use Getopt::Long; 
     
    #######################################################################################
    # Declaration des variables 
     
    # Declaration des variables utilisees par Getopt
    my $GC; my $G;
    my $MOTIF; my $M;
    my $AU; my $A;
    my $LENGTH; my $L;
     
    my $sequence;
    my $longueur_ARNm;
    my $boucle=0;
    my $lim;
    my @table;
    my $pourcentage_GC;
    my $SaisieFin =0;
    my $tot=0;
    my %test;
    my $choix; # permet de choisir le type de fichier à ouvrir ou la sequence à saisir
    my $ordre; # pr afficher ds ordre croissant ou décroissant des scores
     
    # Declaration des variables utilisees pour le calcul des scores
    my $score_GC; my $score_f_GC;
    my $score_motif; my $score_f_motif;
    my $score_AU; my $score_f_AU;
    my @table_score;
    my @number; #tableau qui contient le n° du siRNA
    my $l; my $c; # pour l'affichages des résultats 
     
    my @resultat;
    my @sequence; 
    my $fichier; my $seq; my $longueur;
    my @res_dice;
    my $i=0; my $j=0;
    my $ligne=0;
     
    # Fin Declaration des variables 
     
    #######################################################################################
    # Fonction Getopt lit les options passées en ligne de commande (avec des raccourcis de commande)
    Getopt::Long::GetOptions('G=s' => \$GC,'GC=s' => \$GC, 'M=s' =>\$MOTIF, 'MOTIF=s' =>\$MOTIF,'A=s' =>\$AU, 'AU=s' =>\$AU, 'L=s' =>\$LENGTH, 'LENGTH=s' =>\$LENGTH);
     
    #######################################################################################
    # Declaration des Fonctions correspondant aux differents Tests
     
    # Calcul du pourcentage de GC : ce % doit etre compris entre 30 et 52
    sub pourcentage_GC
     
    	{
    my ($sequence)=@_;
    my $total_pb;
    my $pourcentage_GC;
    my $score;
    my $res_GC;
    my $A=0;
    my $G=0;
    my $C=0;
    my $U=0;
     
    while ( $sequence =~ /A/gi)
    { $A =$A+1; }
     
    while ( $sequence =~ /G/gi)
    { $G =$G+1; }
     
    while ( $sequence =~ /U/gi)
    { $U =$U+1; }
     
    while ( $sequence =~ /C/gi)
    { $C =$C+1; }
     
    $total_pb = $C+$G+$A+$U;
     
    $pourcentage_GC=($C+ $G)/ $total_pb *100;
     
    $pourcentage_GC = int ( $pourcentage_GC);
     
    print "\n$pourcentage_GC%\n";
     
     
    if  ( 30<= $pourcentage_GC && $pourcentage_GC <= 52) #il n'accepte pas if ( 30 <= $pourcentage_GC <= 52) 
    {$score = 1;}
    else { $score = 0;}
     
    $score_f_GC = $score * $GC;
     
    return ($score, $score_f_GC);
    	}
     
     
    #######################################################################################
    # Observation de la presence ou de l'absence de certaines bases a certaines positions ds la sequence
     
    sub MOTIF
     
    	{	
    my ($sequence)= @_; # pt de mettre $sequence en argument
    my $score = 0;
    my $score_f_motif;
     
    # "A" en position 3
    if ($sequence =~ m/^.{2}A.*/)
    { 
    $score = 1;}
     
    # "U" en position 10
    if ( $sequence =~ m/^.{9}U.*/)
    { $score = $score + 1;}
     
    # Presence de "G" en position 13
    if ( $sequence =~ m/^.{12}(G)./)
    { $score = $score - 1;}
     
    # "A" en position 19
    if ( $sequence =~ m/^.{18}A.*/)
    { $score = $score + 1;}
     
    # Presence "G" en position 19
    if ( $sequence =~ m/^.{18}(G).*/)
    { $score = $score - 1;}
     
    # Presence "C" en position 19
    if ( $sequence =~ m/^.{18}(C).*/)
    { $score = $score - 1;}
     
    $score_f_motif = $score * $MOTIF;
     
    return ($score, $score_f_motif);
     
    	}
     
    #######################################################################################
    # Calcul du nombre de paires de bases AU, pour satisfaire ce test, il faut au moins 3 paires de bases A/U 
     
    sub pb_AU
    	{
     
    my $debut=14;
    my $lgr=5;
    my $fin;
    $fin = $debut + $lgr; 
    my ($sequence)= @_; # pt de mettre $sequence en argument
    my $score = 0;
    $sequence = substr ($sequence, $debut, $lgr);
     
    while ( $sequence =~ /A|U/g )
    {$score=$score+1;}
     
    $score_f_AU = $score * $AU;
     
    return ($score, $score_f_AU);
     
    	}	
     
    #######################################################################################
    ## coupure de la seq
     
    sub DICE
    {
    my ($sequence) =@_; my $boucle=0;my $LENGTH=19; my @res_dice;
    my $longueur=length($sequence);
    my $lim= $longueur-$LENGTH+1;
     
    	while ($boucle< $lim)
    	{
    	$table[$boucle]=substr ($sequence, $boucle, $LENGTH);
    	print "$table[$boucle]\n";
    	$boucle ++;	
    	}
    return @res_dice;
    }
     
    ####################################################################################
    ## compte les lignes du fichier pour savoir si c'est un lot ou une longue sequence
    sub COMPTE_LIGNE
    {
    $ligne += tr/\n/\n/ while sysread(FIC, $_, 2 ** 16);
    print "\nLe nombre de ligne est : ";
    $ligne = $ligne+1;
    print $ligne;
    return ($ligne);
    }
     
    ####################################################################################
    # Saisie de la séquence par l'utilisateur
     
    print "Chemin du fichier a traiter : "; 
    chomp ($fichier = <STDIN>); 
    open (FIC , "$fichier") || die "Probleme d'ouverture: $!"; 
     
    COMPTE_LIGNE ();
     
    print"\n";
     
    close FIC; 
     
    open (FIC , "$fichier") || die "Probleme d'ouverture: $!"; 
     
    if ( $ligne > 1) ## Traitement d'une sequence qui n'est pas dans un fichier fasta
    {
    	while ($sequence = <FIC>) 
    	{ 
    	chomp $sequence;
    	push (@res_dice, $sequence);
    	print "$res_dice[$j]\n"; 
    	$j++;
    	}
    }
     
    elsif ( $ligne==1) ## Traitement d'une sequence qui n'est pas dans un fichier fasta
    {
     
    	while ($seq = <FIC>) 
    	{chomp $seq; 
    	$sequence=$sequence.$seq; 
    	@res_dice = DICE ($sequence);
    	print "$res_dice[$j]\n"; 
    	} 
    }
    close FIC; 
     
    foreach my $cutted_sequence (@res_dice) 
    {
    $cutted_sequence = uc ($cutted_sequence);
    $cutted_sequence =~tr/T/U/; 
    #print "$cutted_sequence\n";
     
    if ($GC!=0) { ($score_GC) = pourcentage_GC($cutted_sequence); } 
    else { $score_GC = 0; }
    #print "GC VAUT $score_GC\t";
     
    if ($MOTIF!=0) { ($score_motif) = MOTIF($cutted_sequence); } 
    else {$score_motif = 0;}
    #print "$score_motif\t";
     
    if ($AU!=0) { ( $score_AU) = pb_AU ($cutted_sequence); }
    else {$score_AU = 0;}
    #print "$score_AU\t";
     
    my $total= $score_GC+ $score_AU + $score_motif;
    print $total;
    print "\n";
    }
    En fait, je peux faire 3 tests sur des chaines de 19 caractères ( calculer le % en GC, compter le nb de base A ou U à partir d 15è caractère de la chaine, et voir la pasition de certaine base à certaine position) tout ceci me renvoit un score.

    je peux faire ce test à partir de 2 types de chaines:
    -- une longue chaine de 149 caractères environ ( si on opte pour cette option le programme contient une fonction DICE qui va couper cette longue séquence en 19 caractères)
    -- un lot ( = 180) de chaine de 19 caractères

    avec le code ci-dessus cela marche très bien si je lui "donne" le lot de chaine de type





    CAGGGCGGAGACUUCACCA
    AGGGCGGAGACUUCACCAG
    GGGCGGAGACUUCACCAGG
    GGCGGAGACUUCACCAGGG
    GCGGAGACUUCACCAGGGG
    CGGAGACUUCACCAGGGGA
    GGAGACUUCACCAGGGGAG
    GAGACUUCACCAGGGGAGA
    AGACUUCACCAGGGGAGAU
    GACUUCACCAGGGGAGAUG
    ACUUCACCAGGGGAGAUGG
    CUUCACCAGGGGAGAUGGC
    UUCACCAGGGGAGAUGGCA
    UCACCAGGGGAGAUGGCAC
    CACCAGGGGAGAUGGCACA
    ACCAGGGGAGAUGGCACAG
    CCAGGGGAGAUGGCACAGG
    CAGGGGAGAUGGCACAGGA
    AGGGGAGAUGGCACAGGAG
    GGGGAGAUGGCACAGGAGG
    GGGAGAUGGCACAGGAGGA
    GGAGAUGGCACAGGAGGAA
    GAGAUGGCACAGGAGGAAA
    AGAUGGCACAGGAGGAAAG
    GAUGGCACAGGAGGAAAGA
    AUGGCACAGGAGGAAAGAG
    UGGCACAGGAGGAAAGAGC

    par contre cela ne fonctionne pas avec la longue séquence de type
    GUUCCAAAAACAGUGGAUAAUUUUGUGGCCUUAGCUACAGGAGAGAAAGGAUUUGGCUACAAAAACAGCAAAUUCCAUCGUGUAAUCAAGGACUUCAUGAUC
    voici ce qui appelle mon programme

    ./lecture_seq_dice.pl -G 1 -M 1 -A 1 -L 19
    G pr le calcul en %GC
    M pr le motif
    A nb de A et U
    L pour la longueur des chaînes à couper ( 19 caractères)

    Comment puis-je régler mon erreur?

    merci

    :o

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    en fait le pbl que j'ai ai que le code me permet de couper la grande séquence en petite sequence de 19 caractères mais il ne me renvoit aucun score!

    comment faire?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    salut

    j'ai copie colle ton code pour tester

    en fait si je comprends bien, quand tu lui donne un fichier qui ne contient qu'une seule sequence, tu voudrais que celle ci soit debitee en troncons de 19 bases puis tu veux calculer le score et le pourcentage en GC pour chaque troncon.

    j'ai teste avec une seule longue sequence dans un fichier, le pb vient du fait que tu rajoutes 1 qd tu fais ton compte des lignes
    du coup, mon fichier d'une seule ligne est reconnu comme un fichier a deux lignes et comme tu testes le nombre de lignes pour executer (si le nb de ligne == 1) ou non ta fonction DICE, cela fausse le resultat

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    tu es sûr que ca vient de là le pbl ? car au tout début de l'affichage des résultats, il affiche le nb de ligne et lorsque je rentre une longue séquence, j'ai bien $ligne=1
    mais je veux bien te croire....dc j'ai changer et j'ai mis
    if ( $ligne > 2)
    et
    if ( $ligne == 2)
    et maintenant, je n'ai même plus l'affichage de la longue séquence coupéé en petites séquences!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    attention !!!
    je n'ai pas dit qu'il fallait mettre if ( $ligne == 2)

    mais si tu as un fichier 'pas propre' ,c'est a dire qui contient une seule grande sequence et 10 lignes vides, tu va compter 11 lignes et donc faire une mauvaise deduction (ton script ne va pas alors decouper cette sequence puisqu'il croit devoir traiter un fichier contenant plusieurs sequences)

    il faut peut etre revoir ta focntion qui compte les lignes et la rendre plus complexe (compter le nombre de lignes qui contiennent effectivement une sequence)

    par exemple dans l'etat actuel des choses, si tu as une erreur dans ton fichier qui est sense contenir par exemple 120 sequences de 19 bases, tu ne verras pas si ce fichier n'est pas au bon format et contient par exemple une sequence 'intruse' de 25 bases

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    je ne comprends pas pourquoi l'erreur vient du nb de ligne car à chaque fois cela m'indique le bon nb de ligne. Le code qui compte les lignes n'est pas de moi, je l'ai pris sur le forum et je pensais qu'il était correcte! ( d'ailleurs je le pense tjrs) tu maintient dc que l'erreur vient de là? je n'a aucune idée pour l'améliorer.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    en fait si je laisse mon code tel que je vous l'ai donné, j'ai le message d'erreur suivant :

    Use of uninitialized value in concatenation (.) or string at ./lecture_seq_dice.pl line 221, <FIC> line 1.
    la ligne 221 correspond à
    print "$res_dice[$j]\n";

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    je crois bien que c'est moi qui ai donne ce bout de code (issu du cookbook perl oreilly),
    ce code n'est pas en cause

    mais il faut que tu ai alors une confiance abolue dans ton fichier
    si le fichier (qui ne doit contenir qu'une seule sequence de 200 bases qui devra donc etre debitee par la fonction DICE) contient des lignes vides en fin de fichier(et ca arrive souvent), ton script ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ligne 1 qui contient ma sequence tres longue a decouper
    ligne 2 vide (mais elle entre en compte dans le calcul du nombre de lignes)
    ligne 3 vide
    avec l'exemple ci dessus, le nb de ligne est egal a trois donc tu ne traiteras pas la sequence de la ligne 1 avec la fonction DICE (et pourtant tu souhaiterais le faire)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    je t'assure que mon fichier ne contient qu'une seule ligne (198 caractères sur une seule et même ligne) , il n'y a pas de retour à la ligne en fin de ligne.!! donc que faire....?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    j'ai trouve le vrai pb

    c'est la fonction DICE
    regarde ce qu'elle fait
    tu as tu avoir un pb de copier coller
    en fait la fonction doit retourner le tableau @res_dice mais tu ne le remplis pas (tu rempli au contraire le tableau @table)

    ca marche avec ce code chez moi, il fallait remplacer table par res_dice puisque c'est ce tableau la que tu exportes

    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
    sub DICE
    {
      my ($sequence) =@_;
      my $boucle=0;
      my $LENGTH=19;
      my @res_dice;
      my $longueur=length($sequence);
      my $lim= $longueur-$LENGTH+1;
     
      while ($boucle< $lim)
        {
          $res_dice[$boucle]=substr ($sequence, $boucle, $LENGTH);
          print "$res_dice[$boucle]\n";
          $boucle ++;
        }
      return @res_dice;
    }
    ps : essaye de bien identer ton code, il n'y a pas de regles particulieres en perl mais essaye d'aller a la ligne apres chaque nouvelle instruction, ton code est plus lisible ainsi (pour toi et pour les autres, qui le relisent)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    en fait, j'ai un problème au niveau de la sequence "dicée" ( celle qui est coupée en 19 caractères, qd je tape la longue sequence) car en fait apparament les 3 dernières ne sont pas dicées en 19 caractères mais moins de 19, c'est à dire que la dernère n'a que 16 caractères, l'avant dernière 17, et celle d'avant 18 (au lieu de 19); je ne comprends pas d'où ca vient car avant avec le même code ( je lis le fichier je le ferme puis j'applique la fonction DICE et non j'ouvre le fichier, je dice et je ferme le fichier ) j'obtenais vraiment ttes les séquences de même taille (19) .

    je ne comprends vraiment pas...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    géniale!!!!!!
    ca marche! tu me sauve la vie encore une fois!!

    au fait, tu pars qd en vacance ?( juste pour savoir jusqu'à qd je peux compter sur toi (rires))


  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    je pars po
    (en fait j'chui deja parti hors saison)

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

Discussions similaires

  1. pbl de code avec formulaire
    Par nedime dans le forum Langage
    Réponses: 6
    Dernier message: 06/02/2006, 15h12
  2. Pb avec code source "lister les images d'un dossier"
    Par Mimisator dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2005, 15h25
  3. Pbl avec l'action Onselchangelist
    Par Bason_sensei dans le forum MFC
    Réponses: 1
    Dernier message: 18/10/2005, 14h52
  4. pbl avec interface
    Par Bason_sensei dans le forum MFC
    Réponses: 1
    Dernier message: 11/10/2005, 15h50
  5. Comment fermer une Fenetre Modal avec Code ?
    Par Soulama dans le forum Langage
    Réponses: 19
    Dernier message: 13/07/2005, 11h17

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