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 :

Pooler les coordonnées


Sujet :

Langage Perl

  1. #21
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Ok mais je n'arrive pas à avoir ce que je souhaite (avec un hash ou un tableau).
    J'ai essayé 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my %hash;
    my ($current_start,$current_stop,$current_chr);
    my $infile=shift or die "give me a infile\n";
    open (IN,"$infile");
    my $i=1;
     
    while(<IN>){
    	if( $_ !~ m/^$/){
    	chomp;
    	my($chr,$start,$stop,$id,$nb,$sens)=split /\t/,$_;
    	if($i==1){
    		$current_chr=$chr;
    		$current_start = $start;
    		$current_stop = $stop;
    	}
    	else{
    		if(($chr eq "$current_chr")&& ($start-$current_stop<=15)){
    			$current_stop = $stop;
     
    		}
     
     
    		elsif (($chr eq "$current_chr") && $start-$current_stop>=15 ){
    			push(@{$hash{$current_chr}->{'coord'}},$current_start);
    			push(@{$hash{$current_chr}->{'coord'}},$current_stop);
    			#print "$current_chr\t$current_start\t$current_stop\n";
    			$current_start = $start;
    			$current_stop = $stop;
     
    		}
    		else{
    			$current_chr=$chr;
    			$current_start = $start;
    			$current_stop = $stop;
    		}
     
     
     
    	}
    	$i++;
    	}
     
    }
    push(@{$hash{$current_chr}->{'coord'}},$current_stop);
    push(@{$hash{$current_chr}->{'coord'}},$current_start);
    #print "$current_chr\t$current_start\t$current_stop\n";
     
    foreach my $value (keys %hash){
    	print "$value\t@{$hash{$value}->{'coord'}}\n"
     
     
    }
    Mais je n'arrive pas à gérer le cas ou l'on change de chromosome, il faut que je reinisialise mes valeurs et que je recommence avec l'histoire des 15 nt, mais comment puis je faire ??

  2. #22
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    Si ton $i ne te sert pas à autre chose que pour initialiser, change de fonction de test (incrémenter une valeur 10 000 fois est pas forcément top...)

    A la place fais un test pour voir si tu changes de chromosome :
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if($chr eq $current_chr){
        ##instruction quand tu ne changes pas de chromosome
    }
    else{
        $current_chr=$chr;
        $current_start = $start;
        $current_stop = $stop;
    }
    De cette façon, tu seras dans le "else" a chaque changement de chromosome.

    ps : tu auras surement une valeur non initialisés si tu laisses $current_chr vide à l'initialisation..

  3. #23
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    quelle genre de test pour mon $i ?

    j'ai fait comme ceci, mais ca ne me retourne pas la bonne chose non plus :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my %hash;
    my ($current_start,$current_stop,$current_chr);
    my $infile=shift or die "give me a infile\n";
    open (IN,"$infile");
    my $i=1;
     
    while(<IN>){
    	if( $_ !~ m/^$/){
    	chomp;
    	my($chr,$start,$stop,$id,$nb,$sens)=split /\t/,$_;
    	if($i==1){
    		$current_chr=$chr;
    		$current_start = $start;
    		$current_stop = $stop;
    	}
    	if($chr eq $current_chr){
    		if($start-$current_stop<=15){
    			$current_stop = $stop;
     
    		}
     
     
    		else{
    			push(@{$hash{$current_chr}->{'coord'}},$current_start);
    			push(@{$hash{$current_chr}->{'coord'}},$current_stop);
    			#print "$current_chr\t$current_start\t$current_stop\n";
    			$current_start = $start;
    			$current_stop = $stop;
     
    		}
    	}
    	else{
    		$current_chr=$chr;
    		$current_start = $start;
    		$current_stop = $stop;
     
    	}
     
     
     
    	}
    	$i++;
     
     
    }
    push(@{$hash{$current_chr}->{'coord'}},$current_stop);
    push(@{$hash{$current_chr}->{'coord'}},$current_start);
    #print "$current_chr\t$current_start\t$current_stop\n";
     
    foreach my $value (keys %hash){
    	print "$value\t@{$hash{$value}->{'coord'}}\n"
     
     
    }
    ce qui me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chr2	2102 2119 2401 2400

  4. #24
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    euh... et 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
    my ($current_chr, $current_start, $current_end);
    open(IN, "test.txt");
    while(<IN>){
    	chomp;
    	my ($chr, $start, $end) = split /\t/;
    	if (!defined $end) {
    		next;
    	}
    	if (!$current_start) {
    		# first line
    		($current_chr, $current_start, $current_end) = ($chr, $start, $end);
    	} elsif($current_chr eq $chr && $start - $current_end <= 15) {
    		# include coordinates
    		$current_end = $end;
    	} else {
    		# too far, reset coordinates
    		print "$current_chr\t$current_start\t$current_end\n";
    		($current_chr, $current_start, $current_end) = ($chr, $start, $end);
    	}
    }
    # print the last coordinates
    print "$current_chr\t$current_start\t$current_end\n";
    close(IN);
    bien sur cela suppose que le fichier d'entrée est trié par chromosome et position
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  5. #25
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    ah oui ca marche super ! merci beaucoup !

  6. #26
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    Oui imprimer à la volée est une bonne idée (si tu n'as pas besoin de t'en reservir)

  7. #27
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    imprimer à la volée, créer une chaîne de caractères et la stocker dans un tableau, utiliser un hash... ce ne sont que des façons de stocker l'info, après il suffit d'utiliser celle qui correspond à nos besoins
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [GRAPHIQUE] Récupérer les coordonnées d'un point
    Par freud dans le forum Composants VCL
    Réponses: 6
    Dernier message: 29/09/2005, 12h31
  2. bouger une div selon les coordonnées de la souris
    Par 10-nice dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/09/2005, 15h31
  3. Obtenir les coordonnées réelles
    Par chep dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/04/2005, 12h05
  4. Réponses: 2
    Dernier message: 14/09/2004, 18h00
  5. Récuperer les coordonnées d'un vecteur
    Par kerzut dans le forum OpenGL
    Réponses: 5
    Dernier message: 15/04/2003, 11h51

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