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

  1. #1
    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 couper un fragment en morceaux (avec contraintes sur moyenne de taille des fragments et nombre de fragments )
    Bonjour à tous,
    J'essaie, comme je le dis dans l'intitulé de mon post, de couper une séquences ( de taille L ) en plus petits morceaux. Je souhaite que la moyenne de tailles des fragments générés soient aux alentours de 50 (+/- 2 ). Attention, il ne faut pas mettre de contrainte sur la taille des fragments ( par exemple tous ont une taille de 50, ou taille comprise en 48 et 52 nt etc ...). Ca doit être complètement aléatoire.
    Il y a une contrainte supplémentaire, qui est le nombre de fragments aléatoire générés : celui ci est imposé ...
    Voici la base du code, mais je rencontre vraiment un problème concernant la contrainte de moyenne de taille des fragments générés ...

    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
    int main()
    {	
    	int mrna_length = 1000 ;
    	int n_cut = 36 ;
    	simulation(mrna_length, n_cut);
    	return 0;
    }
     
    int simulation(int mrna_length, int n_cut)
    {
    	int i,j,n_cut
    	double *cutpoint; /* tableau contenant tous les positions (clivees ou pas) */
    	int *cut; /* tableau contenant uniquement les positions clivees */
     
    	cutpoint=(double *)malloc((size_t)((mrna_coverage+10)*sizeof(double)));
    	for(i=0;i<=mrna_length;i++)cutpoint[i]=0; /* initialise cutpoint a 0 */
    	cut=(int *)malloc((size_t)((n_cut+10)*sizeof(int)));
    	for(i=0;i<=n_cut;i++)cut[i]=0;
    	for(i=0;i<n_cut;i++){ /* ici n_cut est utilise de façon a avoir le nombre requis de fragments ... */
    		j = 1 + (int) ((mrna_length-1) * (rand() / (RAND_MAX + 1.0))); /* choisi aleatoirement n_cut positions dans le fragment */
    		if(cutpoint[j]==1)i--;else cutpoint[j]=1; /* cutpoint est fixe a 1 pour les positions clivees */
    	}
    	for(i=0,j=1;i<=mrna_length;i++)if(cutpoint[i]==1)cut[j++]=i; cut[0]=0; cut[j]=mrna_length; /* je store dans cut les positions clivees de façon a pouvoir recuperer des positions qui se suivent (start et stop des fragments)*/
     
    }
    Pensez vous que les deux contraintes soient applicables ? J'essaie de coder un "algorithme" que j'ai trouvé dans un article scientifique et ce n'est pas évident ...
    A l'aiiiiiiiide !!

  2. #2
    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
    Je pense enlever la contrainte "nombre de fragments"
    Donc mon problème :
    1/ choisir un site de clivage aléatoire
    2/ calculer la moyenne de taille des fragments générés
    3/ si moyenne<48 ou moyenne > 52 : choisir à nouveau un site de clivage
    sinon : stop

    Comment puis je faire ?

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Exactement comme tu l'as dit.
    Il te suffit d'avoir une liste de liste de clivage, et une fonction pour calculer la taille d'un segment.
    La moyenne étant la somme des éléments moyennés divisée par leur nombre, c'est simple à compter.

    faire
        1) tirer un nombre aléatoire dans la plage de valeurs valide
        2) calculer la moyenne de taille des fragments générés
    tant que moyenne<48 ou moyenne > 52
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    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
    J'ai fait comme ceci, qu'en pensez vous ?
    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
    int main()
    {	
    	int mrna_length = 198 ;
    	simulation(mrna_length);
    	return 0;
    }
     
    int simulation(int mrna_length)
    {
    	int i,j,n_cut,somme;
    	int *cut; /* store random position */
    	double *cutpoint;
    	double moyenne;
    	int tmp=1;
    	cutpoint=(double *)malloc((size_t)((mrna_length+10)*sizeof(double)));
    	for(i=0;i<=mrna_length;i++)cutpoint[i]=0;
    	cut=(int *)malloc((size_t)((n_cut+10)*sizeof(int)));
    	for(i=0;i<=mrna_length;i++)cut[i]=0;
     
    	while(moyenne < 48 || moyenne > 52){
    		somme=0;
    		j = 1 + (int) ((mrna_length-1) * (rand() / (RAND_MAX + 1.0))); /* random selection of position in 0....1000 */
    		if(cutpoint[j]==1)i--;else cutpoint[j]=1;
    		for(i=0,j=1;i<=mrna_length;i++)if(cutpoint[i]==1)cut[j++]=i; cut[0]=0; cut[j]=mrna_length;
    		for(i=0;i<j;i++){
    			somme += (cut[i+1]-cut[i]);
    		}
    		moyenne = somme / j;
    	}
    	printf("moyenne : %f\n",moyenne);
    	for(i=0;i<=mrna_length;i++){
    		if(cut[i] != 0){
    			printf("valeur de cut[%d] : %d \n",i,cut[i]);
    		}
    	}
     
    }

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    J'en pense que tu as raté l'explication des accolades.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0,j=1;i<=mrna_length;i++)if(cutpoint[i]==1)cut[j++]=i; cut[0]=0; cut[j]=mrna_length;
    Ceci ne fait probablement pas ce que tu crois.
    En fait, ca correspond à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0,j=1;i<=mrna_length;i++)
        if(cutpoint[i]==1)
            cut[j++]=i;
    cut[0]=0;
    cut[j]=mrna_length;
    C'est à dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(i=0,j=1;i<=mrna_length;i++) {
        if(cutpoint[i]==1) {
            cut[j++]=i;
        }
    }
    cut[0]=0;
    cut[j]=mrna_length;
    Active plus de warnings, ta fonction est déclarée comme retournant un int, mais n'a pas d'instruction return.

    Tu peux drastiquement améliorer ton code en
    • l'aérant,
    • séparant le code en petites fonctions,
    • introduisant systématiquement les accolades des boucles
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    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
    Oui, pour les accolade, j'ai l'habitude de coder en perl, cela fait 10 jours que je bosse le C toute seule ... il faut que je prenne les bonnes habitudes.

    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
    void simulation(int mrna_length)
    {
    	int i,j,somme;
    	int *cut; /* store random position */
    	double *cutpoint;
    	double moyenne;
    	cutpoint=(double *)malloc((size_t)((mrna_length+10)*sizeof(double)));
    	for(i=0;i<=mrna_length;i++){
    		cutpoint[i]=0;
    	}
    	cut=(int *)malloc((size_t)((n_cut+10)*sizeof(int)));
    	for(i=0;i<=mrna_length;i++){
    		cut[i]=0;
    	}
    	while(moyenne < 14 || moyenne > 18){
    		somme=0;
    		j = 1 + (int) ((mrna_length-1) * (rand() / (RAND_MAX + 1.0))); /* random selection of position in 0....length */
    		if(cutpoint[j]==1)i--;else cutpoint[j]=1;
    		for(i=0,j=1;i<=mrna_length;i++){
    			if(cutpoint[i]==1){
    				cut[j++]=i; 
    			}
    		}
    		cut[0]=0; 
    		cut[j]=mrna_length;
    		for(i=0;i<j;i++){
    			somme += (cut[i+1]-cut[i]);
    		}
    		moyenne = somme / j;
    	}
    	/*printf("moyenne : %f\n",moyenne);*/
    	for(i=0;i<=j;i++){
    		printf("valeur de cut[%d] : %d \n",i,cut[i]);
     
    	}
     
     
    	for(i=1;i<=mrna_length;i++)cutpoint[i]=0
     
    }

    Citation Envoyé par leternel Voir le message
    Tu peux drastiquement améliorer ton code en
    • séparant le code en petites fonctions,
    Qu'entends tu par là ? peux tu me donner un exemple ? Merci

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    D'abord, quelques commentaires:

    Il est extrêmement important d'appeler free() sur chaque adresse obtenue par malloc ou calloc.
    Toute variable doit être initialisée avant d'être lue (ce n'est pas le cas de moyenne dans ton code)

    pour initialiser un tableau à 0, il y a la fonction calloc (documentation)
    Il n'est pas nécessaire de désinitialiser une variable locale (dernière boucle)

    la fonction qui affiche n'a pas à être la fonction qui calcule
    la fonction qui calcule ne devrait pas allouer.


    Je te prépare un code d'exemple, a venir
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, non, pas à venir, parce que ton code ne compile pas du tout.
    il manque au minimum la déclaration de n_cut, et au moins un ';'

    Comment compiles tu?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    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
    J'ai apporté quelques modifications :

    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
    void simulation(int mrna_length);
     
    int main()
    {	
    	int mrna_length = 1000 ;
    	simulation(mrna_length);
    	return 0;
     
    }
     
    void simulation(int mrna_length)
    {
    	int i,j,somme;
    	int *cut; /* store random position */
    	double *cutpoint;
    	double moyenne = 0;
    	cutpoint=(double *)malloc((size_t)((mrna_length+10)*sizeof(double)));
    	for(i=0;i<=mrna_length;i++){
    		cutpoint[i]=0;
    	}
    	cut=(int *)malloc((size_t)((mrna_length+10)*sizeof(int)));
    	for(i=0;i<=mrna_length;i++){
    		cut[i]=0;
    	}
    	while(moyenne < 14 || moyenne > 18){
    		somme=0;
    		j = 1 + (int) ((mrna_length-1) * (rand() / (RAND_MAX + 1.0))); /* random selection of position in 0....length */
    		if(cutpoint[j]==1)i--;else cutpoint[j]=1;
    		for(i=0,j=1;i<=mrna_length;i++){
    			if(cutpoint[i]==1){
    				cut[j++]=i; 
    			}
    		}
    		cut[0]=0; 
    		cut[j]=mrna_length;
    		for(i=0;i<j;i++){
    			somme += (cut[i+1]-cut[i]);
    		}
    		moyenne = somme / j;
    	}
    	/*printf("moyenne : %f\n",moyenne);*/
    	for(i=0;i<=j;i++){
    		printf("valeur de cut[%d] : %d \n",i,cut[i]);
     
    	}
    	for(i=1;i<=mrna_length;i++){
    		cutpoint[i]=0;
    	}	
     
    	free(cut);free(cutpoint);
     
    }
    Et je compile en faisant :
    Est ce comme cela que je dois procéder ?

  10. #10
    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
    Citation Envoyé par leternel Voir le message
    Il n'est pas nécessaire de désinitialiser une variable locale (dernière boucle)
    Je le fais car il y a une suite à mon programme ... et je vais réutiliser cutpoint !
    Je dois en fait tirer aléatoirement N fragments générés aléatoirement !

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est un bon point de départ.
    Cependant, par défaut, gcc est assez permissif.

    Essaie avec la commande gcc -std=C11 -Wall -Wextra programme.c -o programme.
    -o truc permet de donner le nom du programme généré (truc, plutot que a.out)
    -std=C11 permet de compiler en C11, la dernière norme. Si l'option n'est pas disponible, soit tu mets à jour gcc, soit tu utilises -std=C99
    -Wall permet d'activer tous les warnings
    -Wextra permet d'activer la plupart des warnings non activés par -Wall (ils sont futés, chez gcc)

    Chaque warning est probablement une erreur de conception.
    Il ne faut jamais considérer qu'un cast est une solution à un warning.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    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
    Je n'ai ni erreur, ni warning en compilant avec les options

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tant mieux. C'est que le code est convenable.

    Tu pourras rajouter -O2 pour demander des optimisations, et éventuellement -g pour que le programme soit augmenté avec les informations utiles aux débuggeurs.

    Je vais voir comment je ferai ce code.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. [10gR2] Recommandations sur organisation et taille des tablespaces
    Par stefb02 dans le forum Administration
    Réponses: 1
    Dernier message: 19/04/2015, 17h47
  2. insertion avec contrainte sur clef primaire ?
    Par panthere noire dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 20/02/2012, 14h52
  3. Modéle mixte avec contraintes sur les paramètres
    Par AstridG dans le forum SAS STAT
    Réponses: 6
    Dernier message: 18/02/2011, 10h46
  4. Réponses: 3
    Dernier message: 30/08/2010, 11h34
  5. Réponses: 13
    Dernier message: 12/01/2006, 10h45

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