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

Langage Perl Discussion :

problème de références


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut problème de références
    Bonjour,

    J'ai un problème de références.
    J'ai deux Tableaux contenant 4 types d'informations.
    1) nom de l'enzyme
    2) site de restriction
    3) nombre de fois présent
    4) localisations
    J'aimerais comparer dans ces deux tableaux, les enzymes communes mais étant présentes un nombre différent de fois.

    Mes informations sont stockées dans deux fichiers textes sous la forme
    Enzyme Recognition frequency Positions
    ____________________________________________________
    AatII G_ACGT'C 1 523
    AccI GT'mk_AC 1 523
    Acc65I G'GTAC_C 1 1391
    Je récupère bien ces 4 "champs" dans des variables $1, $2, $3 et $4.
    Ensuite, je ne sais pas que structure donner à mes deux tableaux. Qu'est-ce qui serait le plus simple pour ensuite pouvoir comparer les "champs" Enzyme et Frequency?

    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
     
     
    #!/usr/bin/perl
     
     
     
    #-------------------------------- ComparaisonRestrictions.pl ------------------------------------#
    #       Ce programme prend en entrée deux fichiers textes contenant les informations de cartes   #
    #       de restriction générées par BioEdit et donne les enzymes coupant un nombre différent     #
    #       de fois ces deux séquences                                                               #
    #------------------------------------------------------------------------------------------------#
     
     
    =h
    FICHIER D ENTREE
     
     
     
    Restriction table:
     
    Enzyme    Recognition                   frequency  Positions
    __________________________________________________________________________
    AatII     G_ACGT'C                      1          523
    AccI      GT'mk_AC                      1          523
    Acc65I    G'GTAC_C                      1          1391
    AflIII    A'CryG_T                      2          882, 1021
    AleI      CACnn'nnGTG                   1          862
    AlwI      GGATCnnnn'n_                  2          239, 451
    ApoI      r'AATT_y                      1          623
    AvaI      C'yCGr_G                      1          1687
    BaeI      ACnnnnGTAyCnnnnnnn_nnnnn'     1          320
    BaeI      GrTACnnnnGTnnnnnnnnnn_nnnnn'  1          287
    BanI      G'GyrC_C                      2          838, 1391
    BanII     G_rGCy'C                      1          1150
    BbsI      GAAGACnn'nnnn_                4          334, 1129, 1497, 1525
    BbvI      GCAGCnnnnnnnn'nnnn_           9          435, 715, 894, 962, 993, 1123
                                                       1308, 1529, 1639
    BceAI     ACGGCnnnnnnnnnnnn'nn_         1          947
    BfrBI     ATG'CAT                       1          354
     
     
     
     
     
     
    =cut
     
     
     
    use strict;
    use warnings;
    use FileHandle;
    use Data::Dumper;
     
     
     
    my $InFile1 = 'P:/Perl/scripts/Files/Restriction1.txt';
    my $InFile2 = 'P:/Perl/scripts/Files/Restriction2.txt';
    # my $Outfile = FileHandle->new (">P:/Perl/scripts/Files/ComparaisonRestrictions.txt");
     
     
     
    # Ouverture des fichiers
    #------------------------
    open (FileTxt1,"$InFile1")  or die "Can't open file1\n";
    open (FileTxt2,"$InFile2")  or die "Can't open file2\n";
     
     
     
    # Lecture des fichiers de restriction
    #--------------------------------------
     
    my $Ligne;
     
    my %Hash1;
    my $ref_Hash1 = \%Hash1;
    my %Hash2;
    my $ref_Hash2 = \%Hash2;
     
    while ($Ligne =<FileTxt1>)
    {
     
                    if($Ligne =~ /^([\w]+)\s+([\w\']+)\s+(\d{1,2})\s+([\,\d\s]+)$/)
                    {
                      $ref_Hash1->{$1}=[$2, $3, $4];
                      #print Dumper($ref_Hash1)."\n\n";
     
                    }
     
    }
    while ($Ligne =<FileTxt2>)
    {
     
                    if($Ligne =~ /^([\w]+)\s+([\w\']+)\s+(\d{1,2})\s+([\,\d\s]+)$/)
                    {
                      $ref_Hash2->{$1}=[$2, $3, $4];
                    }
     
    }
     
    #print Dumper($ref_Hash1)."\n\n";
     
    foreach my $cle  (%$ref_Hash1)
    {
            print "Cle = ".$cle."\n";
    }
     
     
     
     
     
     
    close;

    Mes fichiers textes:
    Enzyme Recognition frequency Positions
    __________________________________________________________________________
    AccI GT'mk_AC 3 211, 487, 1618
    AfeI AGC'GCT 1 305
    AflII C'TTAA_G 1 345
    AflIII A'CryG_T 2 459, 826
    AloI GAACnnnnnnTCCnnnnnnn_nnnnn' 1 968
    AloI GGAnnnnnnGTTCnnnnnnn_nnnnn' 1 936
    AlwI GGATCnnnn'n_ 1 34
    ApoI r'AATT_y 1 55
    BaeI ACnnnnGTAyCnnnnnnn_nnnnn' 1 1057
    BaeI GrTACnnnnGTnnnnnnnnnn_nnnnn' 1 1024
    BanII G_rGCy'C 2 1126, 1420
    BbsI GAAGACnn'nnnn_ 1 316
    BbvI GCAGCnnnnnnnn'nnnn_ 7 988, 1281, 1284, 1435, 1438, 1529
    1557
    BceAI ACGGCnnnnnnnnnnnn'nn_ 2 1359, 1420
    BfrBI ATG'CAT 1 962
    BglI GCCn_nnn'nGGC 1 384
    BglII A'GATC_T 1 686
    BmrI ACTGGGnnnn_n' 1 644
    BpuEI CTTGAGnnnnnnnnnnnnnn_nn' 2 998, 1428
    BsaI GGTCTCn'nnnn_ 2 15, 1593
    BsaAI yAC'GTr 4 460, 663, 807, 1036
    BsaBI GATnn'nnATC 1 912
    BsaHI Gr'CG_yC 2 454, 951
    BsaJI C'CnnG_G 5 674, 920, 1204, 1412, 1691
    et
    Enzyme Recognition frequency Positions
    __________________________________________________________________________
    AatII G_ACGT'C 1 523
    AccI GT'mk_AC 1 523
    Acc65I G'GTAC_C 1 1391
    AflIII A'CryG_T 2 882, 1021
    AleI CACnn'nnGTG 1 862
    AlwI GGATCnnnn'n_ 2 239, 451
    ApoI r'AATT_y 1 623
    AvaI C'yCGr_G 1 1687
    BaeI ACnnnnGTAyCnnnnnnn_nnnnn' 1 320
    BaeI GrTACnnnnGTnnnnnnnnnn_nnnnn' 1 287
    BanI G'GyrC_C 2 838, 1391
    BanII G_rGCy'C 1 1150
    BbsI GAAGACnn'nnnn_ 4 334, 1129, 1497, 1525
    BbvI GCAGCnnnnnnnn'nnnn_ 9 435, 715, 894, 962, 993, 1123
    1308, 1529, 1639
    BceAI ACGGCnnnnnnnnnnnn'nn_ 1 947
    BfrBI ATG'CAT 1 354
    BglI GCCn_nnn'nGGC 1 1245
    BmgBI CAC'GTC 1 1613
    BmrI ACTGGGnnnn_n' 3 668, 1044, 1390
    BplI GAGnnnnnCTCnnnnnnnn_nnnnn' 4 1026, 1058, 1424, 1456
    BpmI CTGGAGnnnnnnnnnnnnnn_nn' 2 652, 1464
    Bpu10I CC'TnA_GC 2 1249, 1555
    BsaI GGTCTCn'nnnn_ 3 663, 730, 1046
    BsaAI yAC'GTr 2 864, 1584
    BsaHI Gr'CG_yC 2 520, 1683
    BsaJI C'CnnG_G 3 790, 1546, 1688
    BsaXI ACnnnnnCTCCnnnnnnn_nnn' 1 1422

    Voici ma structure actuelle:

    $VAR1 = {
    'BsrI' => [
    'ACTG_Gn\'',
    '6',
    '591, 663, 1050, 1097, 1218, 1396
    '
    ],
    'TspGWI' => [
    'ACGGAnnnnnnnnn_nn\'',
    '6',
    '137, 177, 237, 779, 1343, 1563
    '
    ],
    'Hpy8I' => [
    'GTn\'nAC',
    '4',
    '77, 83, 524, 1358
    '
    ],
    'FauI' => [
    'CCCGCnnnn\'nn_',
    '2',
    '275, 279
    '
    ],
    'PpuMI' => [
    'rG\'GwC_Cy',
    '1',
    '437
    '
    ]
    };
    par exemple pour
    'AatII' => [
    'G_ACGT\'C',
    '1',
    '523
    '
    ]
    Il faudra donc que je compare la clé "AatII' " et le nombre de sites "1" pour mes deux tableaux.
    Est-ce une bonne façon de procéder?

    Merci beaucoup,


    Jasmine,

  2. #2
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut
    Salut,

    Le stockage de tes données est correcte. Personnellement, etant moi même bioinformaticien, et ayant été confronté aux memes probleme de stockage, j'ai opté pour la création d'objet Perl...Je ne sais pas si tu as des notions de langage objet, telles que C++ ou Java...mais sincerement, les objets Perls, te permettent de manipuler des instances d'objets plus proprement et facilement...

    Pour info, il y a vraiment une bonne partie qui traite de ce sujet dans la FAQ...et elle est tres bien faite

    http://perl.developpez.com/faq/?page=sectionE

    Si tu as besoin d'aide, n'hesites pas...

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci pour tes conseils, je vais aller voir ce tutoriel. Non, je n'ai pas beaucoup de connaissances en OO, mais je vais approfondir.


    Jasmine,

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Voici ma première tentative, cela te parait il correct?


    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
     
    #!/usr/local/bin/perl
     
     
     
    #------------- Restriction.pm ----------------#
     
    use strict;
    use warnings;
    package Restriction;                                       # nom du package
     
     
    sub new                                                 # fonction est définie
    {
            my ($Classe, $Enzyme, $Site, $Frequence, $Positions) = @_;
            my $self = {};                                  # référence anonyme vers une table de hachage vide
            bless ($self, $Classe);                         # indique que la référence est liée au package (à la classe)
            $self->{ENZYME} = $Enzyme;
            $self->{SITE} = $Site;
            $self->{FREQUENCE} = $Frequence;
            $self->{POSITIONS} = $Positions;
            return $self;
    }
    1;                                                      # code de retour du module NE PAS OUBLIER
     
     
    # nb noms new et self arbitraire
    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
    #!/usr/local/bin/perl
     
     
     
    #------------- Restriction.pl ----------------#
     
    use strict;
    use warnings;
    use Restriction;
    use Data::Dumper;
     
     
     
    my $Enz1 = Restriction->new ("Acc65I", "G'GTAC_C", "1", "1391" );
    my $Enz2 = Restriction->new ("AflIII", "A'CryG_T", "2", "882, 1021" );
     
     
     
    print Dumper($Enz1)."\n";
     
    print $Enz2->{ENZYME};
     
     
     
    close;
    En tous cas, cela fonctionne!

    Mais je vais générer plus de 100 objets pour chacune de mes deux séquences et ensuite pour comparer mes objets ayant le même {ENZYME} comment puis-je faire? Il faut aussi que j'ajoute {NUMERO_SEQ} pour savoir à laquelle des deux ai-je à faire
    ... ça parait bien compliqué aurais-je raté une marche?
    Ou alors je ne dois pas faire un objet par enzyme mais un objet par séquence. Mais, je ne vois pas du tout comment procéder pour un objet si complex.


    Merci beaucoup,



    Jasmine,

  5. #5
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut
    Ben, personnellement je ferai une fonction membre dans ma classe Restrinction qui prend en parametre une instance d'un objet


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
     
    #!/usr/local/bin/perl
     
     
     
    #------------- Restriction.pm ----------------#
     
    use strict;
    use warnings;
    package Restriction;                                       # nom du package
     
     
    sub new                                                 # fonction est définie
    {
            my ($Classe, $Enzyme, $Site, $Frequence, $Positions) = @_;
            my $self = {};                                  # référence anonyme vers une table de hachage vide
            bless ($self, $Classe);                         # indique que la référence est liée au package (à la classe)
            $self->{ENZYME} = $Enzyme;
            $self->{SITE} = $Site;
            $self->{FREQUENCE} = $Frequence;
            $self->{POSITIONS} = $Positions;
            return $self;
    }
    1;                                                      # code de retour du module NE PAS OUBLIER
     
     
    # fonction de comparaison
    sub COMPARE()
    {
     my ($this,$Enz) = @_;
     if ($this->{ENZYME} eq $Enz->{ENZYME}) 
           {return 1} 
    else {return 0}
    }
    La fonction renvoit 1 si ils sont équivalents, 0 sinon...

    Ensuite la fonction s'apelle sur un Enzyme de la maniere suivante...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $Enz1->COMPARE($Enz2);
    Enfin pour chaque fichier, je creerai un tableau de "Restriction"...et je comparerai un a un tous les elements des tableaux... Meme si tu as l'impression que cela peut paraitre lourd (création + comparaison), je pense qu'il n'en ai rien..

    Bonne chance

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    En fait, je pensais repartir de mon premier script ComparaisonRestrictions.pl qui appellerait Restriction.pm
    J'ouvre mes fichiers
    J'y prends les info $1, $2, $3 et $4
    Je crée mes objets (un objet par enzyme?)
    Et ce script ComparaisonRestrictions.pl ensuite appellerait mes objets afin de les comparer.

    Selon ton idée, je ne comprends pas que ferait la fonction dans Restriction.pm?

    Et donc je ne tiendrais plus compte du fait que je suis dans la première ou la seconde séquence et je comparerais tous mes objets deux à deux?
    Dans ce cas il faut que chaque objet sache de quelle séquence il provient.


    Jasmine,

  7. #7
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Voila comme ceci:

    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
    #!/usr/local/bin/perl
     
     
    #------------- Restriction.pm ----------------#
     
    use strict;
    use warnings;
    package Restriction;                                       # nom du package
     
     
    sub new                                                 # fonction est définie
    {
            my ($Classe, $Sequence, $Enzyme, $Site, $Frequence, $Positions) = @_;
            my $self = {};                                  # référence anonyme vers une table de hachage vide
            bless ($self, $Classe);                         # indique que la référence est liée au package (à la classe)
            $self->{SEQUENCE} = $Sequence;
            $self->{ENZYME} = $Enzyme;
            $self->{SITE} = $Site;
            $self->{FREQUENCE} = $Frequence;
            $self->{POSITIONS} = $Positions;
            return $self;
    }
    1;                                                      # code de retour du module NE PAS OUBLIER
     
     
    # fonction de comparaison
    sub COMPARE()
    {
     my ($this,$Enz) = @_;
     if ($this->{ENZYME} eq $Enz->{ENZYME})
           {return 1}
    else {return 0}
    }
    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
    #!/usr/local/bin/perl
     
     
     
    #------------- Restriction.pl ----------------#
     
    use strict;
    use warnings;
    use Restriction;
    use Data::Dumper;
     
     
     
    my $Enz1 = Restriction->new ("Seq1", "Acc65I", "G'GTAC_C", "1", "1391");
    my $Enz2 = Restriction->new ("Seq1","AflIII", "A'CryG_T", "2", "882, 1021");
    my $Enz3 = Restriction->new ("Seq2","Acc65I", "G'GTAC_C", "0", "");
    my $Enz4 = Restriction->new ("Seq2","AflIII", "A'CryG_T", "1", "569");
     
     
     
     
    $Enz1->COMPARE($Enz3);
     
    close;


    Mais il faut aussi tenir compte du fait qu'une enzyme peut n'être présente que pour une des deux séquences et dans ce cas je veux aussi la retrouver.
    Je veux trouver une digestion permettant de différencier mes deux séquences. Il faut donc que je trouve une enzyme coupant un nombre de fois différent mes deux séquences.



    Merci beaucoup pour ton aide,



    Jasmine,

  8. #8
    Membre confirmé Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Par défaut
    Ben cette fonction fait exactement ce que tu voulais faire: comparer tes enzymes...

    Mais si de toute facon c'est exactement la meme chose que tu souhaitais faire...Donc fais comme tu le sens...

    Concernant
    Je crée mes objets (un objet par enzyme?)
    ben je coprend pas pourquoi tu bloque sur ce point...une instance par un enzyme d'un fichier...je ne vois pas ou est le probleme?

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

Discussions similaires

  1. [VBA-E] Problème de références
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 13/07/2006, 09h04
  2. Problème de référence de classe
    Par nmathon dans le forum Delphi
    Réponses: 7
    Dernier message: 21/06/2006, 16h46
  3. [FLASH MX2004] this et problème de référence
    Par cristolb dans le forum ActionScript 1 & ActionScript 2
    Réponses: 5
    Dernier message: 03/05/2006, 22h33
  4. Problème de référence de données circulaire
    Par Wismerhill50 dans le forum Langage
    Réponses: 3
    Dernier message: 23/10/2005, 22h38
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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