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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    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 éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    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

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, 18h47
  2. insertion avec contrainte sur clef primaire ?
    Par panthere noire dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 20/02/2012, 15h52
  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, 11h46
  4. Réponses: 3
    Dernier message: 30/08/2010, 12h34
  5. Réponses: 13
    Dernier message: 12/01/2006, 11h45

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