/* Family Treatement (1996) */ /* */ /* Author : Marie Aimar */ /* File : member.c */ #include #include #include #include #include "generic.h" #include "list.h" #include "family.h" #include "member.h" struct struct_member { char *identify; t_member parent1; t_member parent2; double residus; int sex; int age; char * status; t_genlist list_of_children; char g1; char g2; char ibsg1; char ibsg2; double statistic; t_genlist list_of_gen; }; struct struct_pair { t_member p1; t_member p2; }; static float simula(); 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); 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 *status,double q1) { t_pair pair; t_member new,member_parent1,member_parent2; new=(t_member)malloc (sizeof(struct struct_member)); new->identify =name; new->parent1=NULL; new->parent2=NULL; new->age = age; new->sex = sex; new->status = status; /* put in new->residus which quantitative factor you want analyse*/ new->residus = q1; new->statistic = 0.0; new->list_of_gen = NULL; 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_member find_item(char *ident) { t_member item; item = (t_member)find_in_list(get_members(current_family), lexi_cp,ident); return item; } void compute_residus(t_member item) { if (item->residus !=0.0) { item->residus = item->residus - get_residus(current_family); } } void residus_statistic(t_member e1,t_member e2) { /* compute when there are no simulation */ double sum =0.0; if (e1->residus != 0.0 && e2->residus !=0.0) { sum = e1->residus * e2->residus; sum *= (double)number_of_shared_gene(e1, e2); e1->statistic += sum; e2->statistic += sum; } } void residus_statistic_ibs(t_member e1,t_member e2) { /* compute after simulation */ double sum =0.0; if (e1->residus != 0.0 && e2->residus !=0.0) { sum = e1->residus * e2->residus; sum *= (double)number_of_shared_gene_ibs(e1, e2); e1->statistic += sum; e2->statistic += sum; } } void add_to_family(t_member e1) { add_statistic_to_family(current_family, e1->statistic); } void initialize_stat(t_member e1) { e1->statistic=0.0; } void ibs_simulation(t_member e1) { if ((e1->parent1 )&&(e1->parent2)) simulation_number(e1); } void init_ibs(t_member e1) { e1->ibsg1 =e1->g1; e1->ibsg2 =e1->g2; } int number_of_shared_gene(t_member e1, t_member e2) { int cpt =0; if (e1->g1 == e2->g1) { cpt ++; if (e1->g2 == e2->g2) cpt ++; return cpt; } if (e1->g1 == e2->g2) { cpt ++; if (e1->g2 == e2->g1) cpt ++; } return cpt; } int number_of_shared_gene_ibs(t_member e1, t_member e2) { int cpt =0; if (e1->ibsg1 == e2->ibsg1) { cpt++; if (e1->ibsg2 == e2->ibsg2) cpt ++; return cpt; } if (e1->ibsg1 == e2->ibsg2) { cpt++; if (e1->ibsg2 == e2->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->g1; allele->g2 = e1->parent1->g2; allele->g3 = e1->parent2->g1; allele->g4 = e1->parent2->g2; if (!(alea>0.25)) { e1->ibsg1 = allele->g1; e1->ibsg2 = allele->g3; } else { if (!(alea >0.50)) { e1->ibsg1 = allele->g1; e1->ibsg2 = allele->g4; } else { if (!(alea >0.75)) { e1->ibsg1 = allele->g2; e1->ibsg2 = allele->g3; } else { e1->ibsg1 = allele->g2; e1->ibsg2 = allele->g4; } } } free(allele); } float simula() { float proba =((float)lrand48()/MAXINT); return proba; } int lexi_cp( char *e1,t_member item) { return strcmp(e1,item->identify); } void add_info( char *ident,t_genlist list) { t_member item; item = find_item(ident); item->list_of_gen = list; } void change_gen(t_member item) { char *ge1=get_next(item->list_of_gen); item->g1 = ge1[0]; item->g2 = ge1[1]; }