[perl] Probleme double lecture

Probleme double lecture [perl] - Perl - Programmation

Marsh Posté le 16-03-2011 à 14:12:19    

Bonjour,  
 
J'ai deux tables ,my @positions=(24,48,54,92,137,235,275,324) my @positions=(25,60,54,192) pour la premiere sequence et une autre table pour la deuxieme sequence comme ca javais deux positions pour chaque lettre , et ce que je verifie c'est que est ce que pour chaque position des deux cotes ils correspondaient, cest a dire pour par exemple javais une correspondance du 24 eme lettre qui est en face d'une position de 'lautre sequence .
En faisant attention aux X et ---
En fait c'est pas les lettres qui doivent etre identiques , mais c'est surtout que dans ma collection de position, j'en ai une qui est en face de l'autre.
Par exemple: si j'ai une position 24 pour la premiere sequence et que dans l'autre sequence j'ai une position 60 mais qui sont en face l'une a lautre c'est bon.
merci
voci le fichier blast:
 
 
merci
 
Je dois par exemple si je suis a la position 24 de la premiere sequence je verifie a quelle position je suis dans l'autre sequence si par exemple je suis a une position qui n'est pas dans la collection my @positions=(26,65,145,189); ben je passe a la position suivante pour les deux sequences jusqua ce que , si je suis a la position 65 seq 1 et qu'en face je sois a la position 145 , les deux lettres sont en face la cest bon je renvoi.
 
merci


Message édité par shadow19c le 13-04-2011 à 09:16:51
Reply

Marsh Posté le 16-03-2011 à 14:12:19   

Reply

Marsh Posté le 16-03-2011 à 18:21:50    

:hello:  
Je veux bien t'aider, mais j'ai rien compris à ton problème, tes explications ne sont pas claires du tout.
Si tu expliques clairement ca

Citation :

En fait j'arrive pas a lui dire si j'ai deux couples de positions daller verfier si ils sont allignes , en plus la cest que j'ai fait cest la comparaison de lettre mais cest pas ca ce que je dois faire, cest plus verfier pour chaque position si ils sont alignes.

qu'on y comprenne qque chose, on pourra sans doute t'aider, car au niveau du code perl, ça a pas l'air bien compliqué.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-03-2011 à 10:51:11    

Oui , excuse moi je reprend comme cest un probleme bioinformatique;je reprend:
En fait mon  programme doit a partir de collection de position de deux sequences pour query my @positions=(24,48,54,92,137,235,275,324)
et subject my @positions=(25,60,80,192), aller verifier si ces positions existent sur l'alignement et si ces positions sont l'une face a l'autre.
Je m'explique mieux:
on prend un exemple si je prend le premier bloc
Query: 160 DSVIAAMSKRGQDRLHHVIRILAEKGHVKELATAFYGNYTVQDLLDATHXXXXXXXXXXX 219
                +  I A+ ++   +L  V+ IL E G V EL T ++GNY++QDL++A            
Sbjct:  264 EQAINALQRKSYQKLTRVVDILIESGKVPELVTHYFGNYSIQDLMEACFKLRKSFEKQGR 323
 
je dois prendre en premier l'index de chaque sequence : 160 pour query et 264 pour subject ,ceci nous permet de nous positionner sur les sequences en effet, lorsque nous allons commencer le lecture des tables, on saura que la lettre D est positionne a 160, puis S a 161 ainsi de suite pour query , et E 264 pour subject. ENsuite pour chque position je verifie si cette position nexiste pas dans ma collection,ainsi si par exemple javais une lettre  qui etait a la position 54 pour query et qu'en face(Ceci est important, il faut que la lettre de subject soit en face) j'ai une lettre qui est a la position 80, donc comme deux positions qui existent dans les tables positions et quils sont en face l'une a lautre alors cest bon je renvoi ces deux valeurs 54 et 80, et je continue la lecture jusqua la fin du bloc et puis je continue la meme chose pour les autres blocs recursivement.
 
EN faisant attention que si jai un x ou - soit sur query ou subject je passe et je fais avancer mes curseurs en meme temps, donc je saute la partie ou il y a X ou - sur la sequence ou il ya mais aussi sur la sequence den face meme si ces des lettres je dois avancer de la meme facon sur les deux sequences;
 
En fait, si je prend les deux sequences d'un bloc je mets dans une table et javance les curseurs en meme temps position un par un je pourrai faire ceci.
 
Voila mon probleme , help please


Message édité par shadow19c le 17-03-2011 à 10:52:25
Reply

Marsh Posté le 17-03-2011 à 11:36:32    

Je comprends a peu près, mais j'ai encore quelques questions:
avec pour query @positions=(24,48,54,92,137,235,275,324)  et subject @positions=(25,60,80,192)
1) tu as une lettre en position 24 dans query et une en 25 dans subject. Ce que tu veux, c'est que ça soit la même? Ou alors que ça soit pas un X ou un - dans l'une des deux position?
2) si oui, si ca colle pas en position 24 dans query et en 25 dans subject, tu cherches après pour 48 dans query et 25 dans subject? ou quoi?
3)
Une suite comme ca:

Query: 160 DSVIAAMSKRGQDRLHHVIRILAEKGHVKELATAFYGNYTVQDLLDATHXXXXXXXXXXX 219
           +  I A+ ++   +L  V+ IL E G V EL T ++GNY++QDL++A            
Sbjct: 264 EQAINALQRKSYQKLTRVVDILIESGKVPELVTHYFGNYSIQDLMEACFKLRKSFEKQGR 323
Query: 220 XXXXXSQDIERMLGFSDGQDSLGRMARGIAGAMPEGAMHKQGIYVVLKLLEVGDCADILP 279
                 Q        +   D  GRM + +   +PE   H  G +V+ KLL+     +++
Sbjct: 324 KADDAVQYF-----LNPDTDPFGRMFQEVLKTVPESIKHTAGAFVMQKLLQWLTPQEVVT 378
Query: 280 LASKLFPGGPKLTTDLHSPEAWRGVKIMTGLVDAMSELAHQGGHMSAAAMGLLDSLCGLY 339
           L      G   +T  +      +G+  M  L       + Q     AA    L ++C  Y
Sbjct: 379 L------GKVSVTHVMDLANDTKGLHFMLKLSQISLTNSEQDYVKDAAQQ--LHAICHQY 430
Query: 340 LKDEQAVIKLAQHKNY-GPMLVDAASAGLPRPK----CKQVKSWTNQ--PSPAFGASLVW 392
           L         +   ++ G MLV+A +  +P P        +  W+++    P    S  W
Sbjct: 431 LSSITGSALPSWATSFAGQMLVEAIAGSMPLPSSCTLANNIAGWSSKLLQLPLKDKSTPW 490
Query: 393 KILQRLDD 400
            +L++L D
Sbjct: 491 LMLEQLYD 498


C'est toujours consécutif (ie on pourrait recoller le tout avec une query commençant en 160 et finissant en 400, et un subject commençant en 264 et finissant en 498?), et on a juste un découpage en plusieurs lignes de quelque chose d'un seul tenant, ou il peut y avoir des trous?
A+,


Message édité par gilou le 17-03-2011 à 12:08:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-03-2011 à 12:17:32    

Ben en fait, ce quil faut faire cest de decouper en bloc, DSVIAAMSKRGQDRLHHVIRILAEKGHVKELATAFYGNYTVQDLLDATHXXXXXXXXXXX  
                     
                                                                           EQAINALQRKSYQKLTRVVDILIESGKVPELVTHYFGNYSIQDLMEACFKLRKSFEKQGR  
 
 
Je met ceci dans deux tables differents, ensuite javance en meme temps dans les deux tables, et je regarde si jai une correspondance de la position qui sont dans mes tables positions, si jai une correspondance de l'une , il faut que en face je dois avoir une position qui doit etre aussi dans la table position.
Si les positions existent dans les deu xtables positions et en face, donc cest bon,  
 
des que je fini ce bloc je passe a lautre , ainsi jusqua la fin
 
un truc du genre

Code :
  1. Code :
  2. #!usr/bin/perl
  3. use strict;
  4. use warnings;
  5. my $query_seq = 'DSVIAAMSKRGQDRLHHVIRILAEKGHVKELATAFYGNYTVQDLLDATHXXXXXXXXXXX';
  6. my $sbjct_seq = 'EQAINALQRKSYQKLTRVVDILIESGKVPELVTHYFGNYSIQDLMEACFKLRKSFEKQGR';
  7. my $q_start = 160;
  8. my $s_start = 264;
  9. my @tab1 = split(//,$query_seq);
  10. my @tab2 = split(//,$sbjct_seq);
  11. for my $i (0..$#tab1){
  12. if (($tab1[$i] !~ m/[-X]/) && ($tab2[$i] !~ m/[-X]/)){
  13.  # vérification que les positions n'existent pas déjà dans tables positions
  14.  # ???
  15. }
  16. $q_start ++;
  17. $s_start ++;
  18. }


Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. #Variables
  5. my @positions=(24,48,54,92,137,235,275,324); #Liste des positions que tu souhaites verifier
  6. my @positions2=(26,65,145,189);
  7. my $query_seq;
  8. my $sbjct_seq;
  9. my ($depart_bloc,$fin_bloc)=(0,0);
  10. my $numero_bloc = 1;
  11. open (BLAST_FILE,"<blast.txt" ) or die ("Impossible de lire blast.txt\n" );
  12. while(<BLAST_FILE> )
  13. {
  14. if(/Query: (\d+)\s+(.+)\s+(\d+)/) #Ajout de \s+ pour gerer s'il y a plus d'un espacement
  15. {
  16.  $depart_bloc=$1;  #Index de depart du bloc
  17.  $query_seq=$2;    #Sequence Query
  18.  $fin_bloc=$3;     #Index de fin du bloc
  19. }
  20. elsif(/Sbjct: \d+\s+(.+)/)
  21. {
  22.  $sbjct_seq=$1;   #Sequence Sbjct
  23. }
  24.         #Si les deux sequences "Query" et "Sbjct" ont ete trouvees, on a un nouveau bloc:
  25. if((defined $query_seq) && (defined $sbjct_seq) && ($query_seq =~ m/\w/) && ($sbjct_seq =~ m/\w/))
  26. {
  27.                 #Separation des caracteres des sequences dans un tableau
  28.  my @tab1 = split(//,$query_seq);
  29.  my @tab2 = split(//,$sbjct_seq);
  30.  my $r = $depart_bloc;
  31.  # tableau : clé : AA   valeur : position
  32.  my %positions_query;
  33.  foreach my $aa ( @tab1){
  34.   if ($aa ne 'X'){
  35.    $positions_query{$aa} = $r;
  36.   }
  37.    $r ++;
  38.  }
  39.  my $s = $depart_bloc;
  40.  # tableau : clé : AA   valeur : position
  41.  my %positions_sbjct;
  42.  foreach my $aa ( @tab2){
  43.   if ($aa ne 'X'){
  44.    $positions_sbjct{$aa} = $s;
  45.   }
  46.    $s ++;
  47.  }
  48.                
  49.  # on vide les variables
  50.  $query_seq = '';
  51.  $sbjct_seq = '';
  52. }
  53. }


 
 
 
PS: Il me reste la comparaison que je comprends pas comment faire


Message édité par shadow19c le 17-03-2011 à 12:40:04
Reply

Marsh Posté le 17-03-2011 à 12:26:43    

Je dois aller manger la, je reviens dans une petite heure.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-03-2011 à 14:31:45    

ok merci

Reply

Marsh Posté le 17-03-2011 à 14:33:25    

Je crois que j'ai pigé si c'est ce que tu veux, mais expliques moi si c'est bien ça:

 

Quand tu as:
my $query_seq = 'DSVIAAMSKRGQDRLHHVIRILAEKGHVKELATAFYGNYTVQDLLDATHXXXXXXXXXXX';
my $sbjct_seq =  'EQAINALQRKSYQKLTRVVDILIESGKVPELVTHYFGNYSIQDLMEACFKLRKSFEKQGR';

 

Tu veux verifier que quand tu as deux lettres pile l'une en dessous de l'autre, et qui ne sont ni X ni - la premiere a pour position une position donnée dans la liste des positions pour query et l'autre pour position une position donnée dans la liste des positions pour subject, c'est bien ça?

 

C'est pile l'une en dessous de l'autre ou pas? car ça, ça change tout dans la manière de proceder.

 

A+,

 


Message édité par gilou le 17-03-2011 à 14:42:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-03-2011 à 14:45:30    

Oui , un truc du genre comme la longueur des deux sequences est la meme, donc je regarde si la position de la lettre que je suis entrain de lire est dans la table des position  , et pareil pour la lettre den dessous si tous les deux positions osnt dans la table des positions correspondantes je renvoie les deux valeurs, et je continue aisni

Reply

Marsh Posté le 17-03-2011 à 15:27:04    

Un truc de ce style?

Code :
  1. #!usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $query_seq = 'DSVIAAMSKRGQDRLHHVIRILAEKGHVKELATAFYGNYTVQDLLDATHXXXXXXXXXXX';
  6. my $sbjct_seq = 'EQAINALQRKSYQKLTRVVDILIESGKVPELVTHYFGNYSIQDLMEACFKLRKSFEKQGR';
  7. my $q_start = 160;
  8. my $s_start = 264;
  9. my @q_pos = (20, 125, 133, 172, 185, 255);
  10. my @s_pos = (20, 5, 133, 255, 276);
  11.  
  12. my $length = length($query_seq);
  13.  
  14. foreach my $l (@q_pos) {
  15.    next if $l < $q_start;
  16.    last if $l >= $q_start + $length; # ou $l > $q_end si on récupère $q_end dans le fichier
  17.    my $c = substr($query_seq, $l - $q_start, 1); #On récupère le caractère a la position dans la chaine $query_seq
  18.    my $d = substr($sbjct_seq, $l - $q_start, 1); #On récupère le caractère a la position dans la chaine $sbjct_seq
  19.    next if ($c =~ m/[-X]/ or $d =~ m/[-X]/);
  20.    my $k = $l - $q_start + $s_start;
  21.    if (grep {$_ eq $k} @s_pos) {
  22.     print "Found: positions ($l, $k) values ($c, $d) \n" ;
  23.    }
  24. }


> perl test.pl
Found: positions (172, 276) values (D, Q)


Je parcours les positions de la liste @q_pos des query position (et saute celles trop petites ou trop grandes).
Pour une position donnée, je regarde les lettres correspondantes de $query_seq et $sbjct_seq.
Si ces lettres ne sont pas exclues (X et -), je calcule la position de la lettre de $sbjct_seq.
Puis je regarde si cette position est dans @s_pos des subject position.
Si oui, on a un match.

 

C'est ce genre de chose que tu cherches a faire, ou c'est plus complexe?

 

A+,


Message édité par gilou le 17-03-2011 à 15:33:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-03-2011 à 15:27:04   

Reply

Marsh Posté le 17-03-2011 à 15:35:52    

OUI c'est bon je vais essayer de faire cela , par contre j'ai pas compris la partie " (et saute celles trop petites ou trop grandes)."

Reply

Marsh Posté le 17-03-2011 à 15:45:12    

shadow19c a écrit :

OUI c'est bon je vais essayer de faire cela , par contre j'ai pas compris la partie " (et saute celles trop petites ou trop grandes)."


my @q_pos = (20, 125, 133, 172, 185, 255);
my $q_start = 160;
On saute les trois premières positions (20, 125, 133) puisqu'elles sont plus petites que 160.
Et saute la dernière, 255 qui est plus grande que (160 + la longueur de la chaine -1) soit 219.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-03-2011 à 18:40:12    

merci pour les explications

Reply

Marsh Posté le 18-03-2011 à 09:36:06    

Bonjour, merci pour tes explications, mais voila je voudrai faire mon calcul a tres grande echelle:
cest a dire pour un fichier du type
 
 
Merci


Message édité par shadow19c le 13-04-2011 à 09:17:28
Reply

Marsh Posté le 18-03-2011 à 10:14:58    

voila j'ai essaye ceci mais ca ne focntionne pas help me please!!!!!
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. #Variables
  5. my @positions=(24,48,54,92,137,235,275,324); #Liste des positions que tu souhaites verifier
  6. my @positions2=(26,65,145,189);
  7. my $query_seq;
  8. my $sbjct_seq;
  9. my ($depart_bloc,$fin_bloc)=(0,0);
  10. my ($depart_bloc2,$fin_bloc2)=(0,0);
  11. my $numero_bloc = 1;
  12. open (BLAST_FILE,"<out.bl" ) or die ("Impossible de lire blast.txt\n" );
  13. while(<BLAST_FILE> )
  14. {
  15. if(/Query: (\d+)\s+(.+)\s+(\d+)/) #Ajout de \s+ pour gerer s'il y a plus d'un espacement
  16. {
  17.  $depart_bloc=$1;  #Index de depart du bloc
  18.  $query_seq=$2;    #Sequence Query
  19.  $fin_bloc=$3;     #Index de fin du bloc
  20. }
  21. elsif(/Sbjct: \d+\s+(.+)/)
  22. {
  23.  $depart_bloc2=$1;
  24.  print $sbjct_seq=$2;   #Sequence Sbjct
  25. }
  26.         #Si les deux sequences "Query" et "Sbjct" ont ete trouvees, on a un nouveau bloc:
  27. if((defined $query_seq) && (defined $sbjct_seq) && ($query_seq =~ m/\w/) && ($sbjct_seq =~ m/\w/))
  28. {
  29.                 #Separation des caracteres des sequences dans un tableau
  30.  my @tab1 = split(//,$query_seq);
  31.  my @tab2 = split(//,$sbjct_seq);
  32.  my $length = length(@tab1);
  33.   my $r = $depart_bloc;
  34.   my $s = $depart_bloc2;
  35.  foreach my $l (@positions) {
  36.        next if $l < $r ;
  37.        last if $l >= $s  + $length; # ou $l > $q_end si on récupère $q_end dans le fichier
  38.        my $c = substr($query_seq, $l - $r, 1); #On récupère le caractère a la position dans la chaine $query_seq
  39.         my $d = substr($sbjct_seq, $l - $r, 1); #On récupère le caractère a la position dans la chaine $sbjct_seq
  40.       next if ($c =~ m/[-X]/ or $d =~ m/[-X]/);
  41.        my $k = $l - $r + $$s;
  42.        if (grep {$_ eq $k} @positions2) {
  43.         print "Found: positions ($l, $k) values ($c, $d) \n" ;
  44.        }
  45. }
  46.  # on vide les variables
  47.  $query_seq = '';
  48.  $sbjct_seq = '';
  49. }
  50. }


Message édité par shadow19c le 18-03-2011 à 10:21:29
Reply

Marsh Posté le 18-03-2011 à 12:50:48    

Comme je t'ai déjà dit (ben je croyais l'avoir posté, mais la, je vois pas mon message), je regarde cet après midi, une fois que j'aurais effectué des démarcher pour louer un utilitaire (vais tenter le coup avec le nouveau service carrefour)
A+,


Message édité par gilou le 18-03-2011 à 12:51:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-03-2011 à 12:52:32    

Ok , desole, merci et bon courage

Reply

Marsh Posté le 18-03-2011 à 15:36:55    

Bon, je dois ressortir, mais je vais te donner une idée de comment procéder pour la lecture de ton fichier:
La j'ai mis ton fichier dans un fichiere test "dnadata.txt" pour tester.

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $filename = "dnadata.txt";
  6. open my $fh, "<$filename" or die "error opening $filename $!.\n";
  7. my %Query = ( pattern => '^Query:\s(\d+)\s+(.+)\s(\d+)\s*$',
  8.           start   => 0,
  9.              end     => 0,
  10.              line    => "" );
  11.  
  12. my %Sbjct = ( pattern => '^Sbjct:\s(\d+)\s+(.+)\s(\d+)\s*$',
  13.           start   => 0,
  14.              end     => 0,
  15.              line    => "" );
  16. use constant {
  17.        START       => 0,
  18.        POSTQUERY   => 1,
  19.        POSTSBJCT   => 2, };
  20. my $state = START;
  21. while (<$fh> ) {
  22.  if (/$Query{pattern}/o) {
  23.    if (($state == START) || ($state ==  POSTSBJCT)){
  24.      $Query{start} = $1;
  25.      $Query{end} = $3;
  26.      $Query{line} = $2;
  27.    }
  28.    else {
  29.  
  30.    }
  31.    $state = POSTQUERY;
  32.  }
  33.  if (/$Sbjct{pattern}/o) {
  34.    if ($state ==  POSTQUERY){
  35.      $Sbjct{start} = $1;
  36.      $Sbjct{end} = $3;
  37.      $Sbjct{line} = $2;
  38.      #processBloc(\%Query, \%Sbjct);
  39.    }
  40.    else {
  41.  
  42.    }
  43.    $state = POSTSBJCT;
  44.  }
  45. }
  46. close $fh;


processBloc(\%Query, \%Sbjct); va appeller ce qui a été ecrit hier, faut adapter au ppassage de variables hash par reference
il reste a écrire aussi la gestion d'erreur en lecture du fichier (ordre des données incorrect)
A+,


Message édité par gilou le 18-03-2011 à 18:35:53

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-03-2011 à 16:41:57    

Je dois appeler comment le process?

Reply

Marsh Posté le 18-03-2011 à 17:59:10    

Ben c'est une subroutine.
 
A priori, ça devrait avoir cette tête:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $filename = "dnadata.txt";
  6. open my $fh, "<$filename" or die "error opening $filename $!.\n";
  7. my %Query = ( pattern   => '^Query:\s(\d+)\s+(.+)\s(\d+)\s*$',
  8.           start     => 0,
  9.              end       => 0,
  10.              line      => "",
  11.           positions => [24,48,54,92,137,235,275,324],);
  12.  
  13. my %Sbjct = ( pattern => '^Sbjct:\s(\d+)\s+(.+)\s(\d+)\s*$',
  14.           start   => 0,
  15.              end     => 0,
  16.              line    => "",
  17.           positions => [26,65,145,189],);
  18. use constant {
  19.        START       => 0,
  20.        POSTQUERY   => 1,
  21.        POSTSBJCT   => 2, };
  22. my $state = START;
  23. while (<$fh> ) {
  24.  if (/$Query{pattern}/o) {
  25.    if (($state == START) || ($state ==  POSTSBJCT)){
  26.      $Query{start} = $1;
  27.      $Query{end} = $3;
  28.      $Query{line} = $2;
  29.    }
  30.    else {
  31.  
  32.    }
  33.    $state = POSTQUERY;
  34.  }
  35.  if (/$Sbjct{pattern}/o) {
  36.    if ($state ==  POSTQUERY){
  37.      $Sbjct{start} = $1;
  38.      $Sbjct{end} = $3;
  39.      $Sbjct{line} = $2;
  40.      processBloc(\%Query, \%Sbjct);
  41.    }
  42.    else {
  43.  
  44.    }
  45.    $state = POSTSBJCT;
  46.  }
  47. }
  48. close $fh;
  49.  
  50.  
  51. sub processBloc {
  52.  my ($Query, $Sbjct) = @_;
  53.  foreach my $l (@{$Query->{positions}}) {
  54.    next if ($l < $Query->{start});
  55.    last if ($l > $Query->{end});;
  56.    my $c = substr($Query->{line}, $l - $Query->{start}, 1);
  57.    my $d = substr($Sbjct->{line}, $l - $Query->{start}, 1);
  58.    next if ($c =~ m/[-X]/ or $d =~ m/[-X]/);
  59.    my $k = $l - $Query->{start} + $Sbjct->{start};
  60.    print "Testing: positions ($l, $k) values ($c, $d): " ;
  61.    if (grep {$_ eq $k} @{$Sbjct->{positions}} ) {
  62.      print "Found a match!\n" ;
  63.    }
  64.    else {
  65.      print "no match.\n" ;
  66.    }
  67.  }
  68. }


 
A+,


Message édité par gilou le 18-03-2011 à 18:35:24

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-03-2011 à 17:03:43    

Une version un peu plus aboutie et optimisée en évitant de recopier inutilement les données:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie qw(open close);   # open/close succeed or die
  5.  
  6. # modifiable si le format du fichier change
  7. my $Query_string = '^Query:\s(\d+)\s+(.+)\s(\d+)\s*$';
  8. my $Sbjct_string = '^Sbjct:\s(\d+)\s+(.+)\s(\d+)\s*$';
  9. # peut être passé en parametre au script, etc
  10. my @Query_positions = (24,48,54,92,137,235,275,324);
  11. my @Sbjct_positions = (26,65,145,189);
  12. # fichier de données
  13. my $filename = "dnadata.txt";
  14.  
  15. # On fait tout dans une subroutine histoire d'avoir le tout bien modulaire
  16. # et les parametres importants comme parametres de la subroutine, ce qui
  17. # facilitera l'écriture avec passage des parametres sur la ligne de commande
  18. # du script (l'extension logique de ce script)
  19. processFile(\$filename, \$Query_string, \@Query_positions, \$Sbjct_string, \@Sbjct_positions);
  20.  
  21. sub processFile {
  22.  my ($filename, $Query_string, $Query_positions, $Sbjct_string, $Sbjct_positions) = @_;
  23.  # creation des structures associées a une ligne utile
  24.  my $Query = initStructure($Query_string, $Query_positions);
  25.  my $Sbjct = initStructure($Sbjct_string, $Sbjct_positions);
  26.  
  27.  open my $fh, '<', "$$filename";
  28.  my ($linenum, $bloc, $part) = (0, 0, 0);
  29.  use constant {
  30.    STATE_START  => 0,
  31.    STATE_SCORE  => 1,
  32.    STATE_QUERY  => 2,
  33.    STATE_SBJCT  => 3,
  34.  };
  35.  my $state = STATE_START;
  36.  while (<$fh> ) {
  37.    ++$linenum;
  38.    if (/^Score\s+=/) {
  39.      ++$bloc;
  40.      $part = 0;
  41.      if (($state != STATE_START) && ($state != STATE_SBJCT)) {
  42.     print "Warning: Unexpected Score at line $linenum\n";
  43.      }
  44.      $state = STATE_SCORE;
  45.    }
  46.    if (/${$Query->{pattern}}/o) {
  47.      ++$part;
  48.      adjustData($Query->{data}, $1, $2, $3);
  49.      if (($state != STATE_SCORE) && ($state != STATE_SBJCT)) {
  50.     print "Warning: Unexpected Query at line $linenum\n";
  51.      }
  52.      $state = STATE_QUERY;
  53.    }
  54.    if (/${$Sbjct->{pattern}}/o) {
  55.      adjustData($Sbjct->{data}, $1, $2, $3);
  56.      if ($state != STATE_QUERY) {
  57.     ++$part;
  58.     print "Warning: Unexpected Sbjct at line $linenum\n";
  59.      }
  60.      else {
  61.     processBlocPart($bloc, $part, $Query, $Sbjct);
  62.      }
  63.      $state = STATE_SBJCT;
  64.    }
  65.  }
  66.  close $fh;
  67.  if ($state != STATE_SBJCT) {
  68.    print "Warning: Unexpected end of file\n";
  69.  }
  70. }
  71.  
  72. # cree la structure associee a une ligne de donnees interessantes
  73. sub initStructure {
  74.  my ($pattern, $position) = @_;
  75.  my $hashref = {
  76.          pattern   => $pattern,  #reference sur la chaine de pattern
  77.          positions => $position, #reference sur l'array des positions
  78.          data => {               #reference sur un hash des infos de la ligne
  79.               start => 0,
  80.               end   => 0,
  81.               line  => "",
  82.              },
  83.         };
  84.  return $hashref;
  85. }
  86.  
  87. # remplit les champs d'un hash data passée par reference
  88. sub adjustData {
  89.  my $dataref = shift;
  90.  $dataref->{start} = shift;
  91.  $dataref->{line}  = shift;
  92.  $dataref->{end}   = shift;
  93. }
  94.  
  95. # on a une portion de bloc, on regarde si on a des matches pour les positions cherchees
  96. sub processBlocPart {
  97.  my ($bloc, $part, $Query, $Sbjct) = @_;
  98.  foreach my $l (@{$Query->{positions}}) {
  99.    next if ($l < $Query->{data}->{start});
  100.    last if ($l > $Query->{data}->{end});
  101.    my $c = substr($Query->{data}->{line}, $l - $Query->{data}->{start}, 1);
  102.    my $d = substr($Sbjct->{data}->{line}, $l - $Query->{data}->{start}, 1);
  103.    next if ($c =~ m/[-X]/ or $d =~ m/[-X]/);
  104.    my $k = $l - $Query->{data}->{start} + $Sbjct->{data}->{start};
  105.    print "Testing in bloc $bloc, part $part: positions ($l, $k) values ($c, $d): " ;
  106.    if (grep {$_ eq $k} @{$Sbjct->{positions}} ) {
  107.      print "Found a match!\n" ;
  108.    } else {
  109.      print "no match.\n" ;
  110.    }
  111.  }
  112. }


A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 09:30:48    

Bonjour, merci pour ce programme , par contre il n y a pas un autre moyen d'utiliser use autodie qw(open close);  car je suis une ancienne version et comme j'ai pas les droits je ne peux pas mettre a jour:
Par contre voila ce programme est un sous programme que je dois lancer sur un grand:
 
 
 
Merci


Message édité par shadow19c le 13-04-2011 à 09:17:55
Reply

Marsh Posté le 21-03-2011 à 10:53:50    

Citation :

par contre il n y a pas un autre moyen d'utiliser use autodie qw(open close);


ben si tu as pas autodie, faut ajouter a la main la partie avec die après open:
open my $fh, "<$filename" or die "error opening $filename $!.\n";
Par contre tu me dis que tu as pas une version de perl a jour, j’espère que tu as au moins la 5.8 (je suis en 5.12), car si c'est pas le cas, ceux qui sont responsables des logiciels dans ton labo sont des irresponsables! (les open my $fh,... ne sont peut être pas valable avant la 5.8 auquel cas il faut passer par des open FH, ... bref, du code qui ne devrait plus être écrit de nos jours).

 


Pour la fin de ta question:
 

Code :
  1. # On fait tout dans une subroutine histoire d'avoir le tout bien modulaire
  2. # et les parametres importants comme parametres de la subroutine, ce qui
  3. # facilitera l'écriture avec passage des parametres sur la ligne de commande
  4. # du script (l'extension logique de ce script)
  5. processFile(\$filename, \$Query_string, \@Query_positions, \$Sbjct_string, \@Sbjct_positions);


Tout est la:
Il suffit que tu passes les paramètres sur la ligne de commande du script, que tu les récupères dans le script (utilisation a priori du module Getopt::Long ou une de ses variantes) et que tu appelles cette routine qui fait tout le boulot.

 

Par contre, le premier fichier perl donné est
1) avec des fautes de frappe
2) des fichiers ouverts et pas fermés
3) incomplet apparement (on met des trucs dans des hashs, puis on perd ces hashs...)
Donc je peux pas en dire plus.
A la lecture, on voit bien qu'il est simplifiable:

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. process_cds("coco_cds" );
  6. process_cds("aster_cds" );
  7.  
  8. open my $desc, '<', "RBH.txt";
  9. while (my $ligne = <$desc> ) {
  10.  my ($id1, $id2) = split(/\t/, $ligne1);
  11.  system("formatdb -o -pT -i DB.pep" );
  12.  system("fastacmd -d DB.pep -s $id1>cv" );
  13.  system("fastacmd -d DB.pep -s $id2>ast" );
  14.  system("bl2seq -i cv -j ast -p blastp -o out.bl -e 1.e-5" );
  15. }
  16. close $desc;
  17.  
  18.  
  19.  
  20. sub process_cds {
  21.  my $filename = shift;
  22.  open my $desc, '<', $filename;
  23.  while (my $line = <$desc> ) {
  24.    next if ($line =~ m/^\#/);
  25.    chomp $line;
  26.    my ( $id, $strand, $coord) = $line =~ m/[\w-]+\t([\w-]+)\t\d+\t([-+])\tORIGINAL JGI\t\d+\t[\#\w\.]+\t([,\d\.]+)/;
  27.    my @exon = split (/,/, $coord);
  28.    my @intron = ($coord =~ m/(\d+,\d+)/g);
  29.    if ($strand eq '-') {
  30.      @exon = reverse(@exon);
  31.      @intron = reverse(@intron);
  32.    }
  33.  
  34.    my $cds;
  35.    my %hash;
  36.    # 3777..3857,4046..4192,4443..4561,4940..5234,5406..5540,5734..5847,6009..6098,6421..6492
  37.    #          324
  38.    
  39.    for my $i (0..$#intron) {
  40.      my ($s, $e) = split(/,/, $intron[$i]);
  41.      my $taille = abs($e-$s+1);
  42.      my ($s2, $e2) = split(/\.\./, $exon[$i]);
  43.      my $taille2 = abs($e2-$s2+1);
  44.      $cds += $taille2;
  45.      my $aa = int($cds/3);
  46.      $hash{$id}{$aa}=$taille;
  47.    }
  48.  }
  49.  close $desc;
  50. }


A+,


Message édité par gilou le 21-03-2011 à 10:59:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 11:01:41    

Merci pour ton aide j'ai ajoute la partie que tu as dit mais ca marche pas j'ai un truc

Code :
  1. error opening SCALAR(0x7df2a0) No such file or directory.


et la partie ou je dois automatiser les lignes de commandes j'ai pas compris aussi
 
merci

Reply

Marsh Posté le 21-03-2011 à 11:05:21    

Citation :

j'ai ajoute la partie que tu as dit

C'est a dire??
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 11:06:44    

Ben j'ai ajoute open my $fh, "<$filename" or die "error opening $filename $!.\n"; mais maitenant il reconnait pas le fichier et aussi la partie ou je dois afficher a la fin j'ai pas compris
 
merci pour ton aide

Reply

Marsh Posté le 21-03-2011 à 11:08:04    

Et jai une version 5.10

Reply

Marsh Posté le 21-03-2011 à 11:14:04    

Citation :

open my $fh, "<$filename" or die "error opening $filename $!.\n";


dans mon code avec processFile?
normal, puisque c'est open my $fh, "<$$filename" or die "error opening $$filename $!.\n";
Je passe le nom de fichier par référence: processFile(\$filename,...
Donc dans processFile, quand on utilise filename, il faut déréférencer, et donc faire $$filename.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 11:18:59    

Desole j'ai pas tous compris je suis pas bon en perl:voici le code je dois modifier quoi:ca j'ai un

Code :
  1. Warning: Unexpected Query at line 18


Et la dernier question

Citation :

processFile(\$filename, \$Query_string, \@Query_positions, \$Sbjct_string, \@Sbjct_positions);
Donc m'aintenant je ne sais pas comment je vais pouvoir mettre le programme danns l'ensemble, en sachant que je dois faire intervenir l'id car pour chaque id j'ai construit son hash et ce que je dois a la fin imprimer cest la taille des introns du type:
C169v2-04488 [les differents tailles des introns] Aster-06787[les differents tailles des introns]
 


J'ai pas c ompris le lien

Code :
  1. #!/usr/bin/perl
  2.     use strict;
  3.     use warnings;
  4.     #use autodie qw(open close);   # open/close succeed or die
  5.    
  6.     # modifiable si le format du fichier change
  7.     my $Query_string = '^Query:\s(\d+)\s+(.+)\s(\d+)\s*$';
  8.     my $Sbjct_string = '^Sbjct:\s(\d+)\s+(.+)\s(\d+)\s*$';
  9.     # peut être passé en parametre au script, etc
  10.     my @Query_positions = (24,48,54,92,137,235,275,324);
  11.     my @Sbjct_positions = (26,65,145,189);
  12.     # fichier de données
  13.     my $filename = "out.bl";
  14.    
  15.     # On fait tout dans une subroutine histoire d'avoir le tout bien modulaire
  16.     # et les parametres importants comme parametres de la subroutine, ce qui
  17.     # facilitera l'écriture avec passage des parametres sur la ligne de commande
  18.     # du script (l'extension logique de ce script)
  19.     processFile(\$filename, \$Query_string, \@Query_positions, \$Sbjct_string, \@Sbjct_positions);
  20.    
  21.     sub processFile {
  22.      my ($filename, $Query_string, $Query_positions, $Sbjct_string, $Sbjct_positions) = @_;
  23.      # creation des structures associées a une ligne utile
  24.      my $Query = initStructure($Query_string, $Query_positions);
  25.      my $Sbjct = initStructure($Sbjct_string, $Sbjct_positions);
  26.    
  27.     open my $fh, "<$$filename" or die "error opening $$filename $!.\n";
  28.      my ($linenum, $bloc, $part) = (0, 0, 0);
  29.      use constant {
  30.        STATE_START  => 0,
  31.        STATE_SCORE  => 1,
  32.        STATE_QUERY  => 2,
  33.        STATE_SBJCT  => 3,
  34.      };
  35.      my $state = STATE_START;
  36.      while (<$fh> ) {
  37.        ++$linenum;
  38.        if (/^Score\s+=/) {
  39.          ++$bloc;
  40.          $part = 0;
  41.          if (($state != STATE_START) && ($state != STATE_SBJCT)) {
  42.         print "Warning: Unexpected Score at line $linenum\n";
  43.          }
  44.          $state = STATE_SCORE;
  45.        }
  46.        if (/${$Query->{pattern}}/o) {
  47.          ++$part;
  48.          adjustData($Query->{data}, $1, $2, $3);
  49.          if (($state != STATE_SCORE) && ($state != STATE_SBJCT)) {
  50.         print "Warning: Unexpected Query at line $linenum\n";
  51.          }
  52.          $state = STATE_QUERY;
  53.        }
  54.        if (/${$Sbjct->{pattern}}/o) {
  55.          adjustData($Sbjct->{data}, $1, $2, $3);
  56.          if ($state != STATE_QUERY) {
  57.         ++$part;
  58.         print "Warning: Unexpected Sbjct at line $linenum\n";
  59.          }
  60.          else {
  61.         processBlocPart($bloc, $part, $Query, $Sbjct);
  62.          }
  63.          $state = STATE_SBJCT;
  64.        }
  65.      }
  66.      close $fh;
  67.      if ($state != STATE_SBJCT) {
  68.        print "Warning: Unexpected end of file\n";
  69.      }
  70.     }
  71.    
  72.     # cree la structure associee a une ligne de donnees interessantes
  73.     sub initStructure {
  74.      my ($pattern, $position) = @_;
  75.      my $hashref = {
  76.              pattern   => $pattern,  #reference sur la chaine de pattern
  77.              positions => $position, #reference sur l'array des positions
  78.              data => {               #reference sur un hash des infos de la ligne
  79.                   start => 0,
  80.                   end   => 0,
  81.                   line  => "",
  82.                  },
  83.             };
  84.      return $hashref;
  85.     }
  86.    
  87.     # remplit les champs d'un hash data passée par reference
  88.     sub adjustData {
  89.      my $dataref = shift;
  90.      $dataref->{start} = shift;
  91.      $dataref->{line}  = shift;
  92.      $dataref->{end}   = shift;
  93.     }
  94.    
  95.     # on a une portion de bloc, on regarde si on a des matches pour les positions cherchees
  96.     sub processBlocPart {
  97.      my ($bloc, $part, $Query, $Sbjct) = @_;
  98.      foreach my $l (@{$Query->{positions}}) {
  99.        next if ($l < $Query->{data}->{start});
  100.        last if ($l > $Query->{data}->{end});
  101.        my $c = substr($Query->{data}->{line}, $l - $Query->{data}->{start}, 1);
  102.        my $d = substr($Sbjct->{data}->{line}, $l - $Query->{data}->{start}, 1);
  103.        next if ($c =~ m/[-X]/ or $d =~ m/[-X]/);
  104.        my $k = $l - $Query->{data}->{start} + $Sbjct->{data}->{start};
  105.        print "Testing in bloc $bloc, part $part: positions ($l, $k) values ($c, $d): " ;
  106.        if (grep {$_ eq $k} @{$Sbjct->{positions}} ) {
  107.          print "Found a match!\n" ;
  108.        } else {
  109.          print "no match.\n" ;
  110.        }
  111.      }
  112.     }


Message édité par shadow19c le 21-03-2011 à 11:21:24
Reply

Marsh Posté le 21-03-2011 à 11:25:30    

>> Warning: Unexpected Query at line 18
Si tu as ça, ça veut dire que ton fichier a une ligne Query (la 18e de ton fichier): qui n'est pas précédée d'une ligne score ou d'une ligne subject, ce qui ne devrait pas arriver au vu des exemples que tu m'avais donné.
Tu peux poster les 25 premières lignes du fichier blast?
 

Citation :

Donc m'aintenant je ne sais pas comment je vais pouvoir mettre le programme danns l'ensemble, en sachant que je dois faire intervenir l'id car pour chaque id j'ai construit son hash et ce que je dois a la fin imprimer cest la taille des introns du type:


Et quel est le lien entre cet id et ce hash avec les positions etc?
 
A+,


Message édité par gilou le 21-03-2011 à 11:27:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 11:26:39    

voila un exemple de fichier blast vu que ca change a chaque fois

Message cité 1 fois
Message édité par shadow19c le 13-04-2011 à 09:18:12
Reply

Marsh Posté le 21-03-2011 à 11:31:20    

shadow19c a écrit :

voila un exemple de fichier blast vu que ca change a chaque fois

Code :
  1. Query= lcl|C169v2-04459 jgi|Coc_C169_1|41999|fgenesh1_pg.8_#_47
  2.          (774 letters)
  3. >lcl|Aster-06520 geneId:"fgenesh1_pg.00135_#_11" protId:"41398"
  4.             coord:[scaffold_00135;strand="+";exons="97472..97595,
  5.             97871..97990,98255..98385,98523..98600,99137..99242,
  6.             100066..100208,101409..101588,102496..102570,
  7.             103096..103350,104224..104473,104717..105016,
  8.             106783..107570,107866..107976,108778..109024,
  9.             109996..110054,110100..110270,111087..111188"]
  10.           Length = 1079
  11. Score = 37.7 bits (86), Expect = 3e-06
  12. Identities = 22/68 (32%), Positives = 31/68 (45%), Gaps = 2/68 (2%)
  13. Query: 691  PLAEYKTESDLRKALRAALIPMVNSQQGTSHKSATQ--VLAQGTQPTWWPLDKWGKKILD 748
  14.             P+A + T  DL K +R A+   V  Q+      A +  V    T P WWPL  W  K L
  15. Sbjct: 1011 PIASWGTLKDLSKVVRRAVQEWVVEQRAARGLKADRGSVYQGNTPPAWWPLPVWDNKQLH 1070
  16. Query: 749  RRWKALEA 756
  17.              +   ++A
  18. Sbjct: 1071 TKAACVKA 1078
  19. Lambda     K      H
  20.    0.306    0.123    0.346
  21. Gapped
  22. Lambda     K      H
  23.    0.267   0.0410    0.140
  24. Matrix: BLOSUM62
  25. Gap Penalties: Existence: 11, Extension: 1
  26. Number of Sequences: 1
  27. Number of Hits to DB: 1921
  28. Number of extensions: 101
  29. Number of successful extensions: 2
  30. Number of sequences better than 1.0e-05: 1
  31. Number of HSP's gapped: 3
  32. Number of HSP's successfully gapped: 1
  33. Number of extra gapped extensions for HSPs above  0.0: 1
  34. Length of query: 774
  35. Length of database: 1079
  36. Length adjustment: 43
  37. Effective length of query: 731
  38. Effective length of database: 1036
  39. Effective search space:   757316
  40. Effective search space used:   757316
  41. Neighboring words threshold: 11
  42. Window for multiple hits: 40
  43. X1: 16 ( 7.1 bits)
  44. X2: 38 (14.6 bits)
  45. X3: 64 (24.7 bits)
  46. S1: 42 (21.6 bits)
  47. S2: 82 (36.2 bits)


C'est celui qui t'a donné le warning?
Parce que pour moi la, j'ai pas le moindre warning.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 11:33:03    

Ben oue je pense que quand tu fais copier coller ca marche, je comprends pas!!!
Par contre peux tu m'aider a faire le lien entre les deux programmes et faire l'affichage
La je dois enlever la partie no match et tout ca juste afficher les tailles des introns c'est tout
 
merci

Message cité 1 fois
Message édité par shadow19c le 21-03-2011 à 11:39:35
Reply

Marsh Posté le 21-03-2011 à 12:06:48    

shadow19c a écrit :

Ben oue je pense que quand tu fais copier coller ca marche, je comprends pas!!!


Il va falloir que tu imprimes la valeur de $state:
$state = STATE_SCORE;
print "state = score\";
chaque fois qu'on fait un $state =
pour voir ce qu'on a eu avant le message de warning.

shadow19c a écrit :

Citation :

La je dois enlever la partie no match et tout ca juste afficher les tailles des introns c'est tout

 

merci

Ben oui, je vais quand même pas tout faire a ta place.

 
Citation :

Par contre peux tu m'aider a faire le lien entre les deux programmes et faire l'affichage

Ben vu que tes explications sont vaseuses sur la question, pour le moment, je peux pas.
A+,


Message édité par gilou le 21-03-2011 à 12:07:39

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 12:13:26    

Au fait, pour autodie, rien a voir avec la version, c'est juste que le module est pas installé par défaut dans ton installation, il faut l'installer avec cpan (ou ppm d'active state si tu es sous windows et utilise leur perl)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 12:14:10    

Oui pardon, en fait j'ai pas compris la partie du module Getopt::Long, car je dois le mettre dans quelle programme a priori le deuxieme celui qui fait la recherche, mais cest pour lui dire que les positons ce sont les $aa du premier code je dois modifier le process??
 
merci

Reply

Marsh Posté le 21-03-2011 à 13:11:22    

Getopt::Long si tu vas voir la doc, tu devrais comprendre. c'est un module qui récupère des arguments passé en ligne de commande de manière plus intelligente que passer par @ARGV.

 

Pour le reste, tu n'as toujours pas expliqué le lien entre ce que tu fais avec tes fichier cds et le fichier blast. Qu'est ce que tu veux lier comme info entre les deux? Tes tables de positions sont calculées a partir des cds? ou quoi d'autre?

 

A+,


Message édité par gilou le 21-03-2011 à 13:12:52

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 13:17:59    

Le fichier blast contient les ID's ce qui permet de faire le blast Cv-***(query) sur aster-***(subject), donc quand j'ai construit le hash du debut (premier programme, j'ai cree pour chaque Id une ou plusieurs positions et aussi j'ai calcule la taille des introns.
Ce qui permet pour le programme deux, pour chaque Id aller chercher ses positions et faire la recherche dans le blast comme on le fait et si il y a un match je renvoi la taille des introns qui peuvent etre plusieurs , donc cest pour cela que je voulais savoir si je peux pas incorporer les deux programmes en un seul.
 
merci


Message édité par shadow19c le 21-03-2011 à 13:32:00
Reply

Marsh Posté le 21-03-2011 à 14:05:13    

Citation :

donc cest pour cela que je voulais savoir si je peux pas incorporer les deux programmes en un seul.


 
Il vaut mieux alors faire dans le modulaire.
 
Tu transformes le second fichier en module perl:

Code :
  1. #!/usr/bin/perl
  2. package dnadata;  #### ou un autre nom adapte ###
  3. use strict;
  4. use warnings;
  5. #use autodie qw(open close);   # open/close succeed or die
  6. use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
  7. require Exporter;
  8.  
  9. @ISA = qw(Exporter AutoLoader);
  10. @EXPORT = qw(processFile);
  11. $VERSION = '0.1';
  12.  
  13. ########### change pas  a partir d'ici #############
  14.  
  15. sub processFile {
  16.  my ($filename, $Query_string, $Query_positions, $Sbjct_string, $Sbjct_positions) = @_;
  17.  # creation des structures associées a une ligne utile
  18.  my $Query = initStructure($Query_string, $Query_positions);
  19.  my $Sbjct = initStructure($Sbjct_string, $Sbjct_positions);
  20. ...................
  21.    if (grep {$_ eq $k} @{$Sbjct->{positions}} ) {
  22.      print "Found a match!\n" ;
  23.    } else {
  24.      print "no match.\n" ;
  25.    }
  26.  }
  27. }
  28. ############ fin de ce qui ne changeait pas
  29.  
  30. 1;
  31. __END__


Tu sauves tout ça sous un nom de fichier dnadata.pm (pas .pl) (et tu remplaces dnadata par le nom adapté que tu auras choisi, il faut que ce soit le même que celui du package dans le fichier)
 
Maintenant, si tu es dans ton programme principal, tu vas pouvoir faire:
 

Code :
  1. use dnadata; #avec les autres uses de ton programme (si tu as un autre nom de package que dnadata faut changer ici)
  2.  
  3. .........................
  4. # valeurs qui viennes de ton programme principal ?
  5. # modifiable si le format du fichier change
  6. my $Query_string = '^Query:\s(\d+)\s+(.+)\s(\d+)\s*$';
  7. my $Sbjct_string = '^Sbjct:\s(\d+)\s+(.+)\s(\d+)\s*$';
  8. #
  9. my @Query_positions = (24,48,54,92,137,235,275,324);
  10. my @Sbjct_positions = (26,65,145,189);
  11. #
  12. my $filename = "dnadata1.txt";
  13.  
  14. processFile(\$filename, \$Query_string, \@Query_positions, \$Sbjct_string, \@Sbjct_positions); # va appeler la fonction du module dnadata


 
et ça marchera.
Notes qu'il faudra que le fichier dnadata.pm (ie celui du module dnadata) soit dans le même répertoire que celui du programme principal.
 
A+,


Message édité par gilou le 21-03-2011 à 14:06:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-03-2011 à 14:18:25    

En fait quest ce que je dois modifier dans le programme deux, je comprends pas.
JE voulais savoir ca serait pas mieux de tout mettre dans le programme un qui fqit les hash apres la creation du fichier out.bl direct je fais la recherche?
Jai une erreur Missing right curly or square bracket at dnadata.pm line 117, at end of line
syntax error at dnadata.pm line 117, at EOF
Compilation failed in require at test3.pl line 4.
BEGIN failed--compilation aborted at test3.pl line 4.

Message cité 1 fois
Message édité par shadow19c le 21-03-2011 à 14:20:17
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed