/* Family Treatement (1996) */ /* */ /* Author : Marie Aimar */ /* File : member.c */ #include #include #include "generic.h" #include "list.h" #include "family.h" #include "treatment.h" typedef struct struct_information *t_info; #include "member.h" struct struct_member { char *identify; t_member parent1; t_member parent2; t_info information; double residus; int sex; int age; int EF; double q2; double q3; double q4; double q5; t_genlist list_of_children; }; struct struct_information { char g1; char g2; char ibsg1; char ibsg2; int weight; double rank; double statistic; t_genlist list_of_gen; }; struct struct_pair { t_member p1; t_member p2; }; static t_info new_information(); static int weight(char *age, char *status); static void simulation_number(t_member e1); static void add_child(t_member parent, t_member child); static insert_pair(t_pair e1,t_pair e2); void compute_adjusted_residus(t_member item); double verif_residus =0.0; double intercept=18.57123; double beta_sex=0.0 ; double beta_age=0.0; double beta_EF =0.2562 ; double beta_q2 =0.0; double beta_q3 =0.1820 ; double beta_q4 =0.0; double beta_q5 =0.0; static t_pair new_pair(t_member p1,t_member p2) { t_pair self = (t_pair) malloc(sizeof(struct struct_pair)); self->p1=p1; self->p2=p2; return self; } void add_member(char *name, char *parent1,char *parent2, int sex, int age,char *dead,char *proband,char *affected, double env_fact, double q1, double q2,double q3,double q4,double q5) { t_pair pair; t_member new,member_parent1,member_parent2; int founder; static int flag = 1; new=(t_member)malloc (sizeof(struct struct_member)); new->identify =name; new->parent1=NULL; new->parent2=NULL; new->information =new_information(); new->information->weight= 0; new->age = age; new->sex = sex; new->EF =env_fact; new->q2 = 0.0; new->q3 = q3; new->q4 = 0.0; new->residus = q1; if (flag== 1) { printf("quantitative factor : q2 \n"); printf("intercept : %f \n ",intercept); printf("sex coefficient : %f \n ",beta_sex); printf ("age coefficient : %f \n",beta_age); printf ("EF coefficient : %f \n", beta_EF); printf("Q2 coefficient :%f \n ",beta_q2); printf("Q3 coefficient :%f \n ",beta_q3); printf("Q4 coefficient :%f \n",beta_q4); printf("Q5 coefficient :%f \n",beta_q5); flag = 0; } /* compute residus with a quantitative factor and an adjustement on sex, age and intercept */ /*compute_adjusted_residus(new);*/ compute_family_residus(new->residus); new->list_of_children = create_genlist(); add_in_list(get_members(current_family),new); if (strcmp(parent1,"0") && strcmp(parent2,"0")) { member_parent1= (t_member)find_in_list(get_members(current_family), lexi_cp,parent1); add_child(member_parent1,new); new->parent1=member_parent1; member_parent2= (t_member)find_in_list(get_members(current_family), lexi_cp,parent2); add_child(member_parent2,new); new->parent2=member_parent2; pair=new_pair(member_parent1,member_parent2); insert_in_list(get_pair(current_family),insert_pair,pair); } else { /* add as founders */ add_in_list(get_founders(current_family),new); } } static void add_child(t_member parent, t_member child) { add_in_list(parent->list_of_children, child); } static int insert_pair(t_pair e1, t_pair e2) { return (strcmp(e1->p1->identify,e2->p1->identify)); } t_info find_item(char *ident) { t_member item; item = (t_member)find_in_list(get_members(current_family), lexi_cp,ident); return item->information; } void create_rank_list(t_member self) { insert_in_ordered_list(rank_list,compare_weight,self); } int compare_weight(t_member e1, t_member e2) { if (e1->information->weight == e2->information->weight) return 0; else if (e1->information->weight < e2->information->weight) return -1; else return 1; } void compute_rank(t_member e1,double rank) { rank = rank - ((double)get_number(current_family)+1.0) /2.0; e1->information->rank = rank; } void statistic_member(t_member e1,t_member e2) { double sum =0.0; sum = e1->information->rank * e2->information->rank; sum *= (double)number_of_shared_gene(e1, e2); e1->information->statistic += sum; e2->information->statistic += sum; } void compute_residus(t_member item) { if (item->residus !=0.0) { item->residus = item->residus - get_residus(current_family); } verif_residus+=item->residus; } void compute_adjusted_residus(t_member item) { if (item->residus !=0.0) { item->residus = item->residus-(beta_EF * item->EF + beta_q3 * item->q3 + intercept); } } void statistic_ibs_member(t_member e1,t_member e2) { double sum =0.0; sum= e1->information->rank * e2->information->rank; sum *=(double) number_of_shared_gene_ibs(e1, e2); e1->information->statistic += sum; e2->information->statistic += sum; } void residus_statistic(t_member e1,t_member e2) { double sum =0.0; if (e1->residus != 0.0 && e2->residus !=0.0) { /* mettre ici le calcul de la somme des traits.....*/ sum = e1->residus * e2->residus; sum *= (double)number_of_shared_gene(e1, e2); e1->information->statistic += sum; e2->information->statistic += sum; } } void residus_statistic_ibs(t_member e1,t_member e2) { double sum =0.0; if (e1->residus != 0.0 && e2->residus !=0.0) { /* mettre ici le calcul de la somme des traits.....*/ sum = e1->residus * e2->residus; sum *= (double)number_of_shared_gene_ibs(e1, e2); e1->information->statistic += sum; e2->information->statistic += sum; } } void add_to_family(t_member e1) { add_statistic_to_family(current_family, e1->information->statistic); } void initialize_stat(t_member e1) { e1->information->statistic=0.0; } void ibs_simulation(t_member e1) { if ((e1->parent1 )&&(e1->parent2)) simulation_number(e1); } void init_ibs(t_member e1) { e1->information->ibsg1 =e1->information->g1; e1->information->ibsg2 =e1->information->g2; } int number_of_shared_gene(t_member e1, t_member e2) { int cpt =0; if (e1->information->g1 == e2->information->g1) { cpt ++; if (e1->information->g2 == e2->information->g2) cpt ++; return cpt; } if (e1->information->g1 == e2->information->g2) {cpt ++; if (e1->information->g2 == e2->information->g1) cpt ++; } return cpt; } int number_of_shared_gene_ibs(t_member e1, t_member e2) { int cpt =0; if (e1->information->ibsg1 == e2->information->ibsg1) { cpt++; if (e1->information->ibsg2 == e2->information->ibsg2) cpt ++; return cpt; } if (e1->information->ibsg1 == e2->information->ibsg2) { cpt++; if (e1->information->ibsg2 == e2->information->ibsg1) cpt ++; } return cpt; } static void simulation_number(t_member e1) { struct simulation{ char g1; char g2; char g3; char g4; }; double alea = (double)simula(); struct simulation *allele=(struct simulation *)malloc(sizeof(struct simulation)); allele->g1 = e1->parent1->information->g1; allele->g2 = e1->parent1->information->g2; allele->g3 = e1->parent2->information->g1; allele->g4 = e1->parent2->information->g2; if (!(alea>0.25)) { e1->information->ibsg1 = allele->g1; e1->information->ibsg2 = allele->g3; } else { if (!(alea >0.50)) { e1->information->ibsg1 = allele->g1; e1->information->ibsg2 = allele->g4; } else { if (!(alea >0.75)) { e1->information->ibsg1 = allele->g2; e1->information->ibsg2 = allele->g3; } else { e1->information->ibsg1 = allele->g2; e1->information->ibsg2 = allele->g4; } } } free(allele); } int lexi_cp( char *e1,t_member item) { return strcmp(e1,item->identify); } void print_member(t_member e1) { printf("noeud 1 %s rang %4f stat %f \n" , e1 ->identify, e1 -> information->rank, e1 -> information->statistic); } void add_in_info( char *ident,t_genlist list) { t_info item; item = find_item(ident); item->list_of_gen = list; } void change_gen(t_member item) { char *ge1=get_next(item->information->list_of_gen); item->information->g1 = ge1[0]; item->information->g2 = ge1[1]; } t_info new_information() { t_info self = (t_info) malloc(sizeof(struct struct_information)); self->weight= 0; self->rank = 0.0; self->statistic = 0.0; self->list_of_gen = NULL; return self; } static int weight(char *age, char *status) { return (100 * atoi(status) -atoi(age)); }