Probleme double lecture [perl] - Perl - Programmation
Marsh Posté le 16-03-2011 à 18:21:50
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+,
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
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 |
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+,
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 :
|
Code :
|
PS: Il me reste la comparaison que je comprends pas comment faire
Marsh Posté le 17-03-2011 à 12:26:43
Je dois aller manger la, je reviens dans une petite heure.
A+,
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+,
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
Marsh Posté le 17-03-2011 à 15:27:04
Un truc de ce style?
Code :
|
> perl test.pl |
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+,
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)."
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+,
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
Marsh Posté le 18-03-2011 à 10:14:58
voila j'ai essaye ceci mais ca ne focntionne pas help me please!!!!!
Code :
|
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+,
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 :
|
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+,
Marsh Posté le 18-03-2011 à 17:59:10
Ben c'est une subroutine.
A priori, ça devrait avoir cette tête:
Code :
|
A+,
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 :
|
A+,
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
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 :
|
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 :
|
A+,
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 :
|
et la partie ou je dois automatiser les lignes de commandes j'ai pas compris aussi
merci
Marsh Posté le 21-03-2011 à 11:05:21
Citation : j'ai ajoute la partie que tu as dit |
C'est a dire??
A+,
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
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+,
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 :
|
Et la dernier question
Citation : processFile(\$filename, \$Query_string, \@Query_positions, \$Sbjct_string, \@Sbjct_positions); |
J'ai pas c ompris le lien
Code :
|
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+,
Marsh Posté le 21-03-2011 à 11:26:39
voila un exemple de fichier blast vu que ca change a chaque fois
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
|
C'est celui qui t'a donné le warning?
Parce que pour moi la, j'ai pas le moindre warning.
A+,
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
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 :
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+,
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+,
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
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+,
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
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 :
|
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 :
|
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+,
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.
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