/* Family Treatement (1994) */ /* */ /* Author : Marie Aimar */ /* File : family.c */ #include #include #include "generic.h" #include "list.h" #include "family.h" #include "member.h" t_family current_family; t_genlist genlist; extern double verif_residus; struct struct_family { char *name; int members; double statistic; double residus; t_genlist list_of_statistic; t_genlist list_of_members; t_genlist list_of_founders; t_genlist list_of_pairs; }; struct struct_result { double numer; double denom; int n; } ; struct struct_result *result; t_genlist get_members(t_family family) {return family->list_of_members;} t_genlist get_pair(t_family family) {return family->list_of_pairs;} t_genlist get_founders(t_family family) {return family->list_of_founders;} int get_number(t_family family) {return family->members;} double get_residus(t_family family) {return family->residus;} void print_result(FILE *newoutput) { double var; var =sqrt(result->denom); printf(" Wpc l'ensemble des familles %f \n ", result->numer/var); fprintf(newoutput," Wpc l'ensemble des familles %f \n ", result->numer/var); result->denom=0.0; result->numer =0.0; } void new_result() { result=(struct struct_result*)malloc(sizeof(struct struct_result)); result->denom= 0.0; result->numer = 0.0; } void new_family(char *name,char *members) { t_family family; family=(t_family)malloc(sizeof(struct struct_family)); family->name=name; family->statistic = 0.0; family->residus = 0.0; family->members =atoi(members); family->list_of_members = create_genlist(); family->list_of_statistic = create_genlist(); family->list_of_founders = create_genlist(); family->list_of_pairs = create_genlist(); add_in_list(list_of_families,family); current_family = family; } int cmp_name(char *e1, t_family item) { return strcmp(e1,item->name); } void change_family(char *name) { current_family = (t_family) find_in_list(list_of_families, cmp_name,name); } void add_statistic_to_family(t_family family,double stat) { family->statistic +=stat; } void next_gen(t_family family) { apply_to_all(family->list_of_members,change_gen); } void compute_family_residus(double trait) { if (trait != 0.0) current_family->residus += trait; else current_family->members-- ; } void init_residus(t_family current) { current_family = current; current_family->residus = current_family->residus / (double)current_family->members; apply_to_all(current_family->list_of_members,compute_residus); } void compute_statistic(t_family current) { double stat,compte, sum, ecart_type,variance,si,si2; int cpt; current_family = current; current_family->statistic = 0.0; /* the first computation without simulation */ compute_all(current_family->list_of_members,residus_statistic); /* add statistic to the global score of the family */ apply_to_all(current_family->list_of_members,add_to_family); stat = current_family->statistic; sum = 0.0; ecart_type=0.0; variance=0.0; si2=0.0; apply_to_all(current_family->list_of_members,initialize_stat); compte = 0.0; /* ibs treatment with simulation */ /* cpt is the number of simulation for one family */ for (cpt=0;cpt < 1000 ;cpt++) { apply_to_all(current_family->list_of_members,ibs_simulation); apply_to_all(current_family->list_of_founders,init_ibs); /*statistic quantitative with 13th value in description file Ph..*/ compute_all(current_family->list_of_members,residus_statistic_ibs); apply_to_all(current_family->list_of_members,add_to_family); sum +=current_family->statistic; si2 += current_family->statistic *current_family->statistic; if (current->statistic > stat) compte++; current_family->statistic = 0.0; apply_to_all(current_family->list_of_members,initialize_stat); } si = stat - (sum/cpt); variance = (si2 -(sum *sum)/cpt)/(cpt-1.0); ecart_type = sqrt (variance); result->numer += si; result->denom += variance; result->n ++; }