#include "iqlaestimator.h" IQLAEstimator::IQLAEstimator(vector & fam_list, vector & complete_geno_list, vector & geno_list, vector & missing_list, map & hap_list, int size) :fam_list(fam_list), complete_geno_list(complete_geno_list), geno_list(geno_list), missing_list(missing_list), hap_freq_table(hap_list), loci_num(size){ sample_size=0; for(int i=0;iN_typed; init_freq_table(); compute_count(); geno_missing_patten(); pair_missing_pattern(); flag_pd = 1; df = 0; pvalue = 0; test_perform = 0; } void IQLAEstimator::init_freq_table(){ int tot; if(hap_freq_table.size()==0){ tot = 1<::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ iter->second = 1.0/double(tot); iter++; } } geno_freq_table.clear(); map::iterator iter1=hap_freq_table.begin(); map::iterator iter2; while(iter1!=hap_freq_table.end()){ iter2 = iter1; while(iter2!=hap_freq_table.end()){ int h1 = iter1->first; int h2 = iter2->first; if(h1 == h2) geno_freq_table[pair(h1,h2)] = iter1->second*iter2->second; else geno_freq_table[pair(h1,h2)] = 2*iter1->second*iter2->second; iter2++; } iter1++; } } void IQLAEstimator::reset_freq_table(map & hap_freq){ hap_freq_table.clear(); hap_freq_table = hap_freq; geno_freq_table.clear(); map::iterator iter1=hap_freq_table.begin(); map::iterator iter2; while(iter1!=hap_freq_table.end()){ iter2 = iter1; while(iter2!=hap_freq_table.end()){ int h1 = iter1->first; int h2 = iter2->first; if(h1 == h2) geno_freq_table[pair(h1,h2)] = iter1->second*iter2->second; else geno_freq_table[pair(h1,h2)] = 2*iter1->second*iter2->second; iter2++; } iter1++; } } void IQLAEstimator::show_incom_geno_freq(){ for(int i=0;iget_gcode(); printf(" "); for(int j=0;j > hv = geno_list[i]->get_hap_vec(); for(int j=0;jget_num()); printf(" %.4f \n", freq); } printf("\n"); } void IQLAEstimator::show_hap_freq(){ fprintf(outfp, "SNP haplotype frequency estimates in full sample\n"); fprintf(outfp, "Haplotype\t Frequency (choice a)\n"); map::iterator iter = hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ if(iter->second<0.00005){ iter++; continue; } translate_hap(outfp,iter->first,loci_num); fprintf(outfp, " \t %.4f\n", iter->second); iter++; } fprintf(outfp, "\n"); } void IQLAEstimator::show_hap_freq(vector &a0v, vector &a1v){ fprintf(outfp, "SNP haplotype frequency estimates in full sample\n"); fprintf(outfp, "Haplotype\t Frequency (choice a)\n"); map::iterator iter = hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ if(iter->second<0.00005){ iter++; continue; } translate_hap(outfp,iter->first,loci_num,a0v,a1v); if(loci_num==2) fprintf(outfp, "\t"); fprintf(outfp, " \t %.4f\n", iter->second); iter++; } fprintf(outfp, "\n"); } void IQLAEstimator::show_geno_freq(){ map, double>::iterator giter = geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ if(giter->second<0.00005){ giter++; continue; } printf("(%2d,%2d) ", (giter->first).first,(giter->first).second); printf(" %.4f\n", giter->second); giter++; } printf("\n"); } void IQLAEstimator::compute_count(){ int row = hap_freq_table.size(); int col = geno_freq_table.size(); count = new int*[row-1]; for(int i=0;i hap_map; map::iterator iter=hap_freq_table.begin(); int loc = 0; while(iter!=hap_freq_table.end()){ hap_map[iter->first] = loc; loc++; iter++; } loc = 0; map, double>::iterator giter=geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ int h1=(giter->first).first; int h2=(giter->first).second; int loc1 = hap_map[h1]; int loc2 = hap_map[h2]; if(loc1!=row-1) count[loc1][loc]++; if(loc2!=row-1) count[loc2][loc]++; loc++; giter++; } hap_map.clear(); } void IQLAEstimator::geno_missing_patten(){ for(int i=0;iget_gcode(); for(int j=0;jget_gcode(); for(int k=0;k *cluster, vector &a0v, vector &a1v){ map trans; map::iterator iter = hap_freq_table.begin(); int count = 0; while(iter!=hap_freq_table.end()){ trans[count] = iter->first; iter++; count++; } if(df<(1< dis; for(int i=0;i::iterator diter = dis.begin(); while(diter!=dis.end()){ translate_hap(outfp,diter->first,loci_num,a0v,a1v); fprintf(outfp, "\t"); if(loci_num==2) fprintf(outfp, "\t"); fprintf(outfp, " \t %.6f\t %g\n", Btest[diter->second],Bpvalue[diter->second]); diter++; } fprintf(outfp, "\n"); trans.clear(); dis.clear(); } void IQLAEstimator::update_hap_freq(){ map::iterator iter = hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ iter->second = 0; iter++; } map, double>::iterator giter = geno_freq_table.begin(); while(giter!= geno_freq_table.end()){ pair conf = giter->first; if(conf.first==conf.second) hap_freq_table[conf.first] += geno_freq_table[conf]; else{ hap_freq_table[conf.first] += .5*geno_freq_table[conf]; hap_freq_table[conf.second] += .5*geno_freq_table[conf]; } giter++; } } void IQLAEstimator::update_geno_freq(){ map, double>::iterator giter = geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ giter->second = 0; giter++; } giter = geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ pair conf = giter->first; int k1 = conf.first; int k2 = conf.second; if(k1==k2) giter->second = hap_freq_table[k1]*hap_freq_table[k2]; else giter->second = 2*hap_freq_table[k1]*hap_freq_table[k2]; giter++; } } IQLAEstimator::~IQLAEstimator(){ int row = hap_freq_table.size(); for(int k=0;kN_typed>0){ int dim=fam_list[fam]->N_typed; int *typed = fam_list[fam]->typed; double **cholent = new double*[dim]; for(int i=0;i, double>::iterator iterk; for(int i=0;iN;i++){ if(typed[i]==1){ nb2 = nb1; ind_1 = fam_list[fam]->fam_member[i][0]; ind_2 = ind_1; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } covMatrix[nb1][nb2] = 1; nb2++; for(int j=i+1;jN;j++){ if(typed[j]==1){ ind_2 = fam_list[fam]->fam_member[j][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No kinship coefficient between individual %d and individual %d from family %d. Please check...\n\n", ind_1,ind_2,fam_list[fam]->fam_id); exit(1); } if(iterk->second>1e-8){ // i is related to j covMatrix[nb1][nb2] = 2*iterk->second; covMatrix[nb2][nb1] = covMatrix[nb1][nb2]; } // i, j related nb2++; } // j is typed } // complete j cholent[nb1][0] = 1; cholent[nb1][h_size-1] = 1-fam_list[fam]->gcode[i][0]/2.0; nb1++; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,h_size,chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); exit(1); } double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,1,h_size-1,h_size,h_size); denominator+=s[0][0]; numerator+=t[0][0]; clear_matrix(cholent,dim,h_size); clear_matrix(chol,dim,dim); clear_matrix(cholaug,dim,h_size); clear_matrix(covMatrix,dim,dim); clear_matrix(s,h_size-1,h_size-1); clear_matrix(t,h_size-1,1); } } map::iterator iter=hap_freq_table.begin(); double n = numerator/denominator; iter->second = n; iter++; iter->second = 1-n; update_geno_freq(); } void IQLAEstimator::single_Score_test() { int h_size = hap_freq_table.size(); int col = geno_freq_table.size(); double denominator = 0; // D_p^T K^(-1) D_p double A1 = 0; // D_r^T K^(-1) D_r double A2 = 0; // D_p^T K^(-1) D_r double numerator = 0; // D_r^T K^(-1) (Y-\mu) for(int fam=0;famN_typed>0){ int dim=fam_list[fam]->N_typed; int *typed = fam_list[fam]->typed; double **cholent = new double*[dim]; for(int i=0;i, double>::iterator iterk; double test_weight; for(int i=0;iN;i++){ if(typed[i]==1){ nb2 = nb1; ind_1 = fam_list[fam]->fam_member[i][0]; ind_2 = ind_1; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } covMatrix[nb1][nb2] = 1; nb2++; for(int j=i+1;jN;j++){ if(typed[j]==1){ ind_2 = fam_list[fam]->fam_member[j][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient between individual %d and individual %d from family %d. Please check...\n\n", ind_1,ind_2,fam_list[fam]->fam_id); exit(1); } if(iterk->second>1e-8){ // i is related to j covMatrix[nb1][nb2] = 2*iterk->second; covMatrix[nb2][nb1] = covMatrix[nb1][nb2]; } // i, j related nb2++; } // j is typed } // complete j test_weight = fam_list[fam]->test_weight[i]; cholent[nb1][0] = 1; cholent[nb1][h_size] = test_weight; cholent[nb1][h_size-1] = 1-fam_list[fam]->gcode[i][0]/2.0-hap_freq_table[0]; nb1++; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,(2*h_size-1),chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); exit(1); } double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,h_size+1,2*h_size-1,h_size+1,2*h_size-1); double **u = self_colmultiply(cholaug,dim,1,h_size-1,h_size+1,2*h_size-1); double **v = self_colmultiply(cholaug,dim,h_size+1,2*h_size-1,h_size,h_size); denominator+=s[0][0]; A1+=t[0][0]; A2+=u[0][0]; numerator+=v[0][0]; clear_matrix(s,h_size-1,h_size-1); clear_matrix(t,h_size-1,h_size-1); clear_matrix(u,h_size-1,h_size-1); clear_matrix(v,h_size-1,1); clear_matrix(cholent,dim,2*h_size-1); clear_matrix(chol,dim,dim); clear_matrix(cholaug,dim,2*h_size-1); clear_matrix(covMatrix,dim,dim); } } // MQLS test double orig = A1-A2*A2/denominator; test = 2*numerator*numerator/orig/hap_freq_table[0]/hap_freq_table[1]; pvalue = pochisq(test,1); } // find all possible pair of missing pattern void IQLAEstimator::pair_missing_pattern(){ int ind_1, ind_2; int dim_1, dim_2; int cat_1, cat_2; int mis_cat_1, mis_cat_2; map, double>::iterator iterk; map, double>::iterator iter1; map, double>::iterator iter2; for(int fam=0;famN_typed>0){ for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1){ ind_1 = fam_list[fam]->fam_member[i][0]; for(int j=i+1;jN;j++){ cat_2 = fam_list[fam]->cat[j]; mis_cat_2 = fam_list[fam]->mis_cat[j]; dim_2 = missing_list[mis_cat_2]->dim; if(dim_2 > 0 && geno_list[cat_2]->info==1){ ind_2 = fam_list[fam]->fam_member[j][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient between individual %d and individual %d from family %d. Please check...\n\n", ind_1,ind_2,fam_list[fam]->fam_id); exit(1); } if(iterk->second>1e-8){ // i is related to j if(pair_missing_v.find(mis_cat_1)==pair_missing_v.end()) pair_missing_v[mis_cat_1] = 0; if(pair_missing_v.find(mis_cat_2)==pair_missing_v.end()) pair_missing_v[mis_cat_2] = 0; int min = mis_cat_1<=mis_cat_2 ? mis_cat_1 : mis_cat_2; int max = mis_cat_1+mis_cat_2-min; if(fam_list[fam]->IBD1_coeff[pair(ind_1,ind_2)]>1e-8){ if(pair_missing_IBD1.find(pair(min,max))==pair_missing_IBD1.end()) pair_missing_IBD1[pair(min,max)] = 0; } if(fam_list[fam]->IBD2_coeff[pair(ind_1,ind_2)]>1e-8){ if(pair_missing_IBD2.find(pair(min,max))==pair_missing_IBD2.end()) pair_missing_IBD2[pair(min,max)] = 0; } } // i, j related } // j is typed } // complete j } // i is typed } // complete i } } } void IQLAEstimator::allocate(){ map, double>::iterator giter=geno_freq_table.begin(); int loc = 0; while(giter!=geno_freq_table.end()){ hap_pair_map[giter->first] = loc; loc++; giter++; } int h_size = hap_freq_table.size(); int col = geno_freq_table.size(); rst = new double*[h_size-1]; for(int i=0;i0){ V = new double **[v_size]; map::iterator pi=pair_missing_v.begin(); for(int i=0;isecond = i; int mis = pi->first; int dim_1 = missing_list[mis]->dim; V[i] = new double*[dim_1]; for(int j=0;j0){ mat_cov_1 = new double **[IBD1_size]; map, int>::iterator pmi=pair_missing_IBD1.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; mat_cov_1[i] = new double*[dim_1]; for(int j=0;j0){ mat_cov_2 = new double **[IBD2_size]; map, int>::iterator pmi=pair_missing_IBD2.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; mat_cov_2[i] = new double*[dim_1]; for(int j=0;jN_typed>0){ int cat; int mis_cat; int dim=0; for(int i=0;iN;i++){ cat = fam_list[fam]->cat[i]; if(geno_list[cat]->info==1){ mis_cat = fam_list[fam]->mis_cat[i]; dim+=missing_list[mis_cat]->dim; } } if(dim>tot_dim) tot_dim = dim; } } cholent = new double*[tot_dim]; for(int i=0;i0){ map::iterator pi=pair_missing_v.begin(); for(int i=0;ifirst]->dim; for(int j=0;j0){ map, int>::iterator pmi=pair_missing_IBD1.begin(); for(int i=0;i mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; for(int j=0;j0){ map, int>::iterator pmi=pair_missing_IBD2.begin(); for(int i=0;i mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; for(int j=0;j::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ freq[loc] = iter->second; loc++; iter++; } int h_last=0; iter = hap_freq_table.end(); iter--; h_last=iter->first; map, double>::iterator giter=geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ pair conf = giter->first; loc = 0; iter = hap_freq_table.begin(); while(locfirst; if(conf.first == conf.second && conf.first == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[h]; else if(conf.first == conf.second && conf.first == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[h_last]; else if(conf.first < conf.second && conf.first == h && conf.second != h_last) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.second]; else if(conf.first < conf.second && conf.second == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.first]; else if(conf.first == h && conf.second == h_last) rst[loc][hap_pair_map[conf]] = 2*(hap_freq_table[h_last]-hap_freq_table[h]); else if(conf.first != h && conf.first != h_last && conf.second == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[conf.first]; loc++; iter++; } giter++; } for(int i=0;iget_num()>0 && geno_list[i]->info==1 && missing_list[geno_missing_map[i]]->dim>0) geno_list[i]->expected_hap_num(freq,geno_freq_table,hap_pair_map,count,missing_list[geno_missing_map[i]]->sites); } for(int i=0;iget_num()>0 && missing_list[i]->dim>0){ missing_list[i]->set_weight(geno_freq_table,hap_pair_map,count); missing_list[i]->compute_centmatrix(freq,geno_freq_table); missing_list[i]->compute_derivative(hap_freq_table,hap_pair_map,count,rst); } } // compute L matrix int complete_geno = complete_geno_list.size(); for(int i=0;iexpectation(geno_freq_table); complete_geno_list[i]->expectation_IBD1(hap_freq_table); } for(int i=0;iprob_IBD1; const vector > hv_1 = complete_geno_list[i]->get_hap_vec(); for(int j=i+1;j > hv_2 = complete_geno_list[j]->get_hap_vec(); for(int s=0;s0){ map::iterator pi=pair_missing_v.begin(); for(int i=0;isecond = i; int mis = pi->first; int dim_1 = missing_list[mis]->dim; for(int j=0;jweight[j][missing_list[mis]->mapping_function[complete_geno_list[k]->gname]]; pi++; } } // compute VLV^T-hh^T, and VDV^T-hh^T for all pair of missing pattern int IBD1_size = pair_missing_IBD1.size(); int IBD2_size = pair_missing_IBD2.size(); if(IBD1_size>0){ map, int>::iterator pmi=pair_missing_IBD1.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;ksites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_1[i][k][j] = mat_cov_1[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } if(IBD2_size>0){ map, int>::iterator pmi=pair_missing_IBD2.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jprob; mat_cov_2[i][j][j]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;kprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_2[i][k][j] = mat_cov_2[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } for(int i=0;iN_typed>0){ int cat; int mis_cat; int dim=0; for(int i=0;iN;i++){ cat = fam_list[fam]->cat[i]; if(geno_list[cat]->info==1){ mis_cat = fam_list[fam]->mis_cat[i]; dim+=missing_list[mis_cat]->dim; } } if(dim<=0) continue; for(int i=0;i, double>::iterator iterk; map, double>::iterator iter1; map, double>::iterator iter2; double value; flag_pd = 1; for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1){ nb2 = nb1; ind_1 = fam_list[fam]->fam_member[i][0]; ind_2 = ind_1; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } for(int j=0;jcentmatrix[j][k]; nb2+=dim_1; for(int j=i+1;jN;j++){ cat_2 = fam_list[fam]->cat[j]; mis_cat_2 = fam_list[fam]->mis_cat[j]; dim_2 = missing_list[mis_cat_2]->dim; if(dim_2 > 0 && geno_list[cat_2]->info==1){ ind_2 = fam_list[fam]->fam_member[j][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient between individual %d and individual %d from family %d. Please check...\n\n", ind_1,ind_2,fam_list[fam]->fam_id); exit(1); } if(iterk->second>1e-8){ // i is related to j iter2 = (fam_list[fam]->IBD2_coeff).find(pair(ind_1,ind_2)); iter1 = (fam_list[fam]->IBD1_coeff).find(pair(ind_1,ind_2)); IBD_2 = iter2->second; IBD_1 = iter1->second; if(mis_cat_1==mis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;kmis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k hap_num = geno_list[cat_1]->get_hap_num(); for(int j=0;jderivative[j][k]; cholent[nb1+j][h_size-1] = hap_num[j]; } nb1+=dim_1; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,h_size,chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); flag_pd = 0; exit(1); } if(flag_pd==1){ double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,1,h_size-1,h_size,h_size); for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); } else{ double var; double &determ = var; double **v = inverse(denominator,h_size-1,determ); double **w = new double*[h_size-1]; for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); clear_matrix(v,h_size-1,h_size-1); clear_matrix(w,h_size-1,1); } clear_matrix(cholentmain,h_size-1,h_size); clear_matrix(cholmain,h_size-1,h_size-1); clear_matrix(cholaugmain,h_size-1,h_size); update_geno_freq(); } void IQLAEstimator::Score_test_new(){ int h_size = hap_freq_table.size(); int col = geno_freq_table.size(); for(int i=0;i::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ freq[loc] = iter->second; loc++; iter++; } int h_last=0; iter = hap_freq_table.end(); iter--; h_last=iter->first; map, double>::iterator giter=geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ pair conf = giter->first; loc = 0; iter = hap_freq_table.begin(); while(locfirst; if(conf.first == conf.second && conf.first == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[h]; else if(conf.first == conf.second && conf.first == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[h_last]; else if(conf.first < conf.second && conf.first == h && conf.second != h_last) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.second]; else if(conf.first < conf.second && conf.second == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.first]; else if(conf.first == h && conf.second == h_last) rst[loc][hap_pair_map[conf]] = 2*(hap_freq_table[h_last]-hap_freq_table[h]); else if(conf.first != h && conf.first != h_last && conf.second == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[conf.first]; loc++; iter++; } giter++; } for(int i=0;iget_num()>0 && geno_list[i]->info==1 && missing_list[geno_missing_map[i]]->dim>0) geno_list[i]->expected_hap_num(freq,geno_freq_table,hap_pair_map,count,missing_list[geno_missing_map[i]]->sites); } for(int i=0;iget_num()>0 && missing_list[i]->dim>0){ missing_list[i]->set_weight(geno_freq_table,hap_pair_map,count); missing_list[i]->compute_centmatrix(freq,geno_freq_table); missing_list[i]->compute_derivative(hap_freq_table,hap_pair_map,count,rst); } } // compute L matrix int complete_geno = complete_geno_list.size(); for(int i=0;iexpectation(geno_freq_table); complete_geno_list[i]->expectation_IBD1(hap_freq_table); } for(int i=0;iprob_IBD1; const vector > hv_1 = complete_geno_list[i]->get_hap_vec(); for(int j=i+1;j > hv_2 = complete_geno_list[j]->get_hap_vec(); for(int s=0;s0){ map::iterator pi=pair_missing_v.begin(); for(int i=0;isecond = i; int mis = pi->first; int dim_1 = missing_list[mis]->dim; for(int j=0;jweight[j][missing_list[mis]->mapping_function[complete_geno_list[k]->gname]]; pi++; } } // compute VLV^T-hh^T, and VDV^T-hh^T for all pair of missing pattern int IBD1_size = pair_missing_IBD1.size(); int IBD2_size = pair_missing_IBD2.size(); if(IBD1_size>0){ map, int>::iterator pmi=pair_missing_IBD1.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;ksites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_1[i][k][j] = mat_cov_1[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } if(IBD2_size>0){ map, int>::iterator pmi=pair_missing_IBD2.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jprob; mat_cov_2[i][j][j]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;kprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_2[i][k][j] = mat_cov_2[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } for(int i=0;iN_typed>0){ int cat; int mis_cat; int dim=0; for(int i=0;iN;i++){ cat = fam_list[fam]->cat[i]; if(geno_list[cat]->info==1){ mis_cat = fam_list[fam]->mis_cat[i]; dim+=missing_list[mis_cat]->dim; } } if(dim<=0) continue; for(int i=0;i, double>::iterator iterk; map, double>::iterator iter1; map, double>::iterator iter2; double value; double test_weight; flag_pd = 1; for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1){ nb2 = nb1; ind_1 = fam_list[fam]->fam_member[i][0]; ind_2 = ind_1; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } for(int j=0;jcentmatrix[j][k]; nb2+=dim_1; for(int j=i+1;jN;j++){ cat_2 = fam_list[fam]->cat[j]; mis_cat_2 = fam_list[fam]->mis_cat[j]; dim_2 = missing_list[mis_cat_2]->dim; if(dim_2 > 0 && geno_list[cat_2]->info==1){ ind_2 = fam_list[fam]->fam_member[j][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient between individual %d and individual %d from family %d. Please check...\n\n", ind_1,ind_2,fam_list[fam]->fam_id); exit(1); } if(iterk->second>1e-8){ // i is related to j iter2 = (fam_list[fam]->IBD2_coeff).find(pair(ind_1,ind_2)); iter1 = (fam_list[fam]->IBD1_coeff).find(pair(ind_1,ind_2)); IBD_2 = iter2->second; IBD_1 = iter1->second; if(mis_cat_1==mis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;kmis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k hap_num = geno_list[cat_1]->get_hap_num(); test_weight = fam_list[fam]->test_weight[i]; for(int j=0;jderivative[j][k]; cholent[nb1+j][h_size+k] = test_weight*cholent[nb1+j][k]; } cholent[nb1+j][h_size-1] = hap_num[j]; } nb1+=dim_1; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,2*h_size-1,chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); flag_pd = 0; exit(1); } if(flag_pd==1){ double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,h_size+1,2*h_size-1,h_size+1,2*h_size-1); double **u = self_colmultiply(cholaug,dim,1,h_size-1,h_size+1,2*h_size-1); double **v = self_colmultiply(cholaug,dim,h_size+1,2*h_size-1,h_size,h_size); for(int i=0;i *cluster){ col_1df = cluster->size()-1; int col_clus = col_1df; if((*cluster)[col_clus][0]==0) col_clus--; df = col_clus; if(df<=0){ fprintf(outfp, "The df is %d, please check!\n\n", df); return -1; } int h_size = hap_freq_table.size(); int col = geno_freq_table.size(); for(int i=0;i::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ freq[loc] = iter->second; loc++; iter++; } // create a matrix to cluster haplotypes double **mul_clus = new double*[h_size-1]; for(int i=0;ifirst; map, double>::iterator giter=geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ pair conf = giter->first; loc = 0; iter = hap_freq_table.begin(); while(locfirst; if(conf.first == conf.second && conf.first == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[h]; else if(conf.first == conf.second && conf.first == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[h_last]; else if(conf.first < conf.second && conf.first == h && conf.second != h_last) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.second]; else if(conf.first < conf.second && conf.second == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.first]; else if(conf.first == h && conf.second == h_last) rst[loc][hap_pair_map[conf]] = 2*(hap_freq_table[h_last]-hap_freq_table[h]); else if(conf.first != h && conf.first != h_last && conf.second == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[conf.first]; loc++; iter++; } giter++; } for(int i=0;iget_num()>0 && geno_list[i]->info==1 && missing_list[geno_missing_map[i]]->dim>0) geno_list[i]->expected_hap_num(freq,geno_freq_table,hap_pair_map,count,missing_list[geno_missing_map[i]]->sites); } for(int i=0;iget_num()>0 && missing_list[i]->dim>0){ missing_list[i]->set_weight(geno_freq_table,hap_pair_map,count); missing_list[i]->compute_centmatrix(freq,geno_freq_table); missing_list[i]->compute_derivative(hap_freq_table,hap_pair_map,count,rst); missing_list[i]->compute_derivative_cluster(hap_freq_table,mul_clus,col_clus); missing_list[i]->compute_derivative_1df(hap_freq_table,mul_1df,col_1df); } } // compute L matrix int complete_geno = complete_geno_list.size(); for(int i=0;iexpectation(geno_freq_table); complete_geno_list[i]->expectation_IBD1(hap_freq_table); } for(int i=0;iprob_IBD1; const vector > hv_1 = complete_geno_list[i]->get_hap_vec(); for(int j=i+1;j > hv_2 = complete_geno_list[j]->get_hap_vec(); for(int s=0;s0){ map::iterator pi=pair_missing_v.begin(); for(int i=0;isecond = i; int mis = pi->first; int dim_1 = missing_list[mis]->dim; for(int j=0;jweight[j][missing_list[mis]->mapping_function[complete_geno_list[k]->gname]]; pi++; } } // compute VLV^T-hh^T, and VDV^T-hh^T for all pair of missing pattern int IBD1_size = pair_missing_IBD1.size(); int IBD2_size = pair_missing_IBD2.size(); if(IBD1_size>0){ map, int>::iterator pmi=pair_missing_IBD1.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;ksites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_1[i][k][j] = mat_cov_1[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } if(IBD2_size>0){ map, int>::iterator pmi=pair_missing_IBD2.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jprob; mat_cov_2[i][j][j]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;kprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_2[i][k][j] = mat_cov_2[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } for(int i=0;iN_typed>0){ int cat; int mis_cat; int dim=0; for(int i=0;iN;i++){ cat = fam_list[fam]->cat[i]; if(geno_list[cat]->info==1){ mis_cat = fam_list[fam]->mis_cat[i]; dim+=missing_list[mis_cat]->dim; } } if(dim<=0) continue; for(int i=0;i, double>::iterator iterk; map, double>::iterator iter1; map, double>::iterator iter2; double value; double test_weight; flag_pd = 1; for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1){ nb2 = nb1; ind_1 = fam_list[fam]->fam_member[i][0]; ind_2 = ind_1; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } for(int j=0;jcentmatrix[j][k]; nb2+=dim_1; for(int j=i+1;jN;j++){ cat_2 = fam_list[fam]->cat[j]; mis_cat_2 = fam_list[fam]->mis_cat[j]; dim_2 = missing_list[mis_cat_2]->dim; if(dim_2 > 0 && geno_list[cat_2]->info==1){ ind_2 = fam_list[fam]->fam_member[j][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient between individual %d and individual %d from family %d. Please check...\n\n", ind_1,ind_2,fam_list[fam]->fam_id); exit(1); } if(iterk->second>1e-8){ // i is related to j iter2 = (fam_list[fam]->IBD2_coeff).find(pair(ind_1,ind_2)); iter1 = (fam_list[fam]->IBD1_coeff).find(pair(ind_1,ind_2)); IBD_2 = iter2->second; IBD_1 = iter1->second; if(mis_cat_1==mis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;kmis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k hap_num = geno_list[cat_1]->get_hap_num(); test_weight = fam_list[fam]->test_weight[i]; for(int j=0;jderivative[j][k]; cholent[nb1+j][h_size-1] = hap_num[j]; } for(int j=0;jderivative_clus[j][k]; for(int k=0;kderivative_1df[j][k]; } nb1+=dim_1; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,h_size+col_clus+col_1df,chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); flag_pd = 0; exit(1); } if(flag_pd==1){ double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,h_size+1,h_size+col_clus,h_size+1,h_size+col_clus); double **u = self_colmultiply(cholaug,dim,1,h_size-1,h_size+1,h_size+col_clus); double **v = self_colmultiply(cholaug,dim,h_size+1,h_size+col_clus,h_size,h_size); for(int i=0;iN_typed>0){ for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1){ if(fam_list[fam]->fam_member[i][4]==0) unknown++; else if(fam_list[fam]->fam_member[i][4]==1) unaff++; else if(fam_list[fam]->fam_member[i][4]==2) aff++; } } } } if(aff>=15){ reset_freq_table(full_hap_freq_table); int count=1; int flag; while(1){ map of = hap_freq_table; NR_Iteration_subgroup(2); map nf = hap_freq_table; double diff = 0; flag = 1; map::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ diff += (nf[iter->first]-of[iter->first])*(nf[iter->first]-of[iter->first]); if(nf[iter->first]<0.0000001){ flag = 0; break; } iter++; } if(diff<1e-5 || count>5 || flag==0) break; count++; } aff_hap_freq_table = hap_freq_table; } if(unaff>=15){ reset_freq_table(full_hap_freq_table); int count=1; int flag; while(1){ map of = hap_freq_table; NR_Iteration_subgroup(1); map nf = hap_freq_table; double diff = 0; flag = 1; map::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ diff += (nf[iter->first]-of[iter->first])*(nf[iter->first]-of[iter->first]); if(nf[iter->first]<0.0000001){ flag = 0; break; } iter++; } if(diff<1e-5 || count>5 || flag==0) break; count++; } unaff_hap_freq_table = hap_freq_table; } if(unknown>=15){ reset_freq_table(full_hap_freq_table); int count=1; int flag; while(1){ map of = hap_freq_table; NR_Iteration_subgroup(0); map nf = hap_freq_table; double diff = 0; flag = 1; map::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ diff += (nf[iter->first]-of[iter->first])*(nf[iter->first]-of[iter->first]); if(nf[iter->first]<0.0000001){ flag = 0; break; } iter++; } if(diff<1e-5 || count>5 || flag==0) break; count++; } unknown_hap_freq_table = hap_freq_table; } reset_freq_table(full_hap_freq_table); } void IQLAEstimator::NR_Iteration_subgroup(int group){ int h_size = hap_freq_table.size(); int col = geno_freq_table.size(); for(int i=0;i::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ freq[loc] = iter->second; loc++; iter++; } int h_last=0; iter = hap_freq_table.end(); iter--; h_last=iter->first; map, double>::iterator giter=geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ pair conf = giter->first; loc = 0; iter = hap_freq_table.begin(); while(locfirst; if(conf.first == conf.second && conf.first == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[h]; else if(conf.first == conf.second && conf.first == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[h_last]; else if(conf.first < conf.second && conf.first == h && conf.second != h_last) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.second]; else if(conf.first < conf.second && conf.second == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.first]; else if(conf.first == h && conf.second == h_last) rst[loc][hap_pair_map[conf]] = 2*(hap_freq_table[h_last]-hap_freq_table[h]); else if(conf.first != h && conf.first != h_last && conf.second == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[conf.first]; loc++; iter++; } giter++; } for(int i=0;iget_num()>0 && geno_list[i]->info==1 && missing_list[geno_missing_map[i]]->dim>0) geno_list[i]->expected_hap_num(freq,geno_freq_table,hap_pair_map,count,missing_list[geno_missing_map[i]]->sites); } for(int i=0;iget_num()>0 && missing_list[i]->dim>0){ missing_list[i]->set_weight(geno_freq_table,hap_pair_map,count); missing_list[i]->compute_centmatrix(freq,geno_freq_table); missing_list[i]->compute_derivative(hap_freq_table,hap_pair_map,count,rst); } } // compute L matrix int complete_geno = complete_geno_list.size(); for(int i=0;iexpectation(geno_freq_table); complete_geno_list[i]->expectation_IBD1(hap_freq_table); } for(int i=0;iprob_IBD1; const vector > hv_1 = complete_geno_list[i]->get_hap_vec(); for(int j=i+1;j > hv_2 = complete_geno_list[j]->get_hap_vec(); for(int s=0;s0){ map::iterator pi=pair_missing_v.begin(); for(int i=0;isecond = i; int mis = pi->first; int dim_1 = missing_list[mis]->dim; for(int j=0;jweight[j][missing_list[mis]->mapping_function[complete_geno_list[k]->gname]]; pi++; } } // compute VLV^T-hh^T, and VDV^T-hh^T for all pair of missing pattern int IBD1_size = pair_missing_IBD1.size(); int IBD2_size = pair_missing_IBD2.size(); if(IBD1_size>0){ map, int>::iterator pmi=pair_missing_IBD1.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;ksites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_1[i][k][j] = mat_cov_1[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jsites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } if(IBD2_size>0){ map, int>::iterator pmi=pair_missing_IBD2.begin(); for(int i=0;isecond = i; pair mispair = pmi->first; int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; for(int j=0;j mispair = pmi->first; if(mispair.first==mispair.second){ int dim_1 = missing_list[mispair.first]->dim; int it_1 = pair_missing_v[mispair.first]; for(int j=0;jprob; mat_cov_2[i][j][j]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[j]]; for(int k=j+1;kprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; mat_cov_2[i][k][j] = mat_cov_2[i][j][k]; } } } else{ int dim_1 = missing_list[mispair.first]->dim; int dim_2 = missing_list[mispair.second]->dim; int it_1 = pair_missing_v[mispair.first]; int it_2 = pair_missing_v[mispair.second]; for(int j=0;jprob; mat_cov_2[i][j][k]-=freq[missing_list[mispair.first]->sites[j]]*freq[missing_list[mispair.second]->sites[k]]; } } pmi++; } } for(int i=0;iN_typed>0){ int cat; int mis_cat; int dim=0; for(int i=0;iN;i++){ cat = fam_list[fam]->cat[i]; if(geno_list[cat]->info==1 && fam_list[fam]->fam_member[i][4]==group){ mis_cat = fam_list[fam]->mis_cat[i]; dim+=missing_list[mis_cat]->dim; } } if(dim<=0) continue; for(int i=0;i, double>::iterator iterk; map, double>::iterator iter1; map, double>::iterator iter2; double value; flag_pd = 1; for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1 && fam_list[fam]->fam_member[i][4]==group){ nb2 = nb1; ind_1 = fam_list[fam]->fam_member[i][0]; ind_2 = ind_1; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } for(int j=0;jcentmatrix[j][k]; nb2+=dim_1; for(int j=i+1;jN;j++){ cat_2 = fam_list[fam]->cat[j]; mis_cat_2 = fam_list[fam]->mis_cat[j]; dim_2 = missing_list[mis_cat_2]->dim; if(dim_2 > 0 && geno_list[cat_2]->info==1 && fam_list[fam]->fam_member[j][4]==group){ ind_2 = fam_list[fam]->fam_member[j][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_2)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient between individual %d and individual %d from family %d. Please check...\n\n", ind_1,ind_2,fam_list[fam]->fam_id); exit(1); } if(iterk->second>1e-8){ // i is related to j iter2 = (fam_list[fam]->IBD2_coeff).find(pair(ind_1,ind_2)); iter1 = (fam_list[fam]->IBD1_coeff).find(pair(ind_1,ind_2)); IBD_2 = iter2->second; IBD_1 = iter1->second; if(mis_cat_1==mis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_1,mis_cat_2)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_1,mis_cat_2)]; for(int k=0;kmis_cat_2){ if(IBD_1>1e-8){ int tic = pair_missing_IBD1[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k1e-8){ int tic = pair_missing_IBD2[pair(mis_cat_2,mis_cat_1)]; for(int k=0;k hap_num = geno_list[cat_1]->get_hap_num(); for(int j=0;jderivative[j][k]; cholent[nb1+j][h_size-1] = hap_num[j]; } nb1+=dim_1; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,h_size,chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); flag_pd = 0; exit(1); } if(flag_pd==1){ double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,1,h_size-1,h_size,h_size); for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); } else{ double var; double &determ = var; double **v = inverse(denominator,h_size-1,determ); double **w = new double*[h_size-1]; for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); clear_matrix(v,h_size-1,h_size-1); clear_matrix(w,h_size-1,1); } clear_matrix(cholentmain,h_size-1,h_size); clear_matrix(cholmain,h_size-1,h_size-1); clear_matrix(cholaugmain,h_size-1,h_size); update_geno_freq(); } void IQLAEstimator::print_subgroup(vector &a0v, vector &a1v){ fprintf(outfp, "Haplotype frequency estimates by phenotype category (IQL_a estimator)\n"); fprintf(outfp, "Haplotype\tOverall\t"); if(aff>=15) fprintf(outfp, "\tAffected"); if(unaff>=15) fprintf(outfp, "\tUnaffected"); if(unknown>=15) fprintf(outfp, "\tUnknown"); fprintf(outfp, "\n"); double sum=0, sum_aff=0, sum_unaff=0, sum_unknown=0; int ind=0, ind_aff=0, ind_unaff=0, ind_unknown=0; map::iterator iter = hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ if(full_hap_freq_table[iter->first]>=0) sum+=full_hap_freq_table[iter->first]; else ind=1; if(aff>=15){ if(aff_hap_freq_table[iter->first]>=0) sum_aff+=aff_hap_freq_table[iter->first]; else ind_aff=1; } if(unaff>=15){ if(unaff_hap_freq_table[iter->first]>=0) sum_unaff+=unaff_hap_freq_table[iter->first]; else ind_unaff=1; } if(unknown>=15){ if(unknown_hap_freq_table[iter->first]>=0) sum_unknown+=unknown_hap_freq_table[iter->first]; else ind_unknown=1; } iter++; } iter = hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ translate_hap(outfp,iter->first,loci_num,a0v,a1v); if(loci_num==2) fprintf(outfp, "\t"); if(full_hap_freq_table[iter->first]>=0){ if(ind==0) fprintf(outfp, "\t%.4f\t", full_hap_freq_table[iter->first]); else fprintf(outfp, "\t%.4f\t", full_hap_freq_table[iter->first]/sum); } else fprintf(outfp, "\t0.0000\t"); if(aff>=15){ if(aff_hap_freq_table[iter->first]>=0){ if(ind_aff==0) fprintf(outfp, "\t%.4f\t", aff_hap_freq_table[iter->first]); else fprintf(outfp, "\t%.4f\t", aff_hap_freq_table[iter->first]/sum_aff); } else fprintf(outfp, "\t0.0000\t"); } if(unaff>=15){ if(unaff_hap_freq_table[iter->first]>=0){ if(ind_unaff==0) fprintf(outfp, "\t%.4f\t", unaff_hap_freq_table[iter->first]); else fprintf(outfp, "\t%.4f\t", unaff_hap_freq_table[iter->first]/sum_unaff); } else fprintf(outfp, "\t0.0000\t"); } if(unknown>=15){ if(unknown_hap_freq_table[iter->first]>=0){ if(ind_unknown==0) fprintf(outfp, "\t%.4f", unknown_hap_freq_table[iter->first]); else fprintf(outfp, "\t%.4f", unknown_hap_freq_table[iter->first]/sum_unknown); } else fprintf(outfp, "\t0.0000"); } fprintf(outfp, "\n"); iter++; } fprintf(outfp, "\n"); } void IQLAEstimator::NR_Iteration_EW(){ int h_size = hap_freq_table.size(); int col = geno_freq_table.size(); for(int i=0;i::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ freq[loc] = iter->second; loc++; iter++; } int h_last=0; iter = hap_freq_table.end(); iter--; h_last=iter->first; map, double>::iterator giter=geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ pair conf = giter->first; loc = 0; iter = hap_freq_table.begin(); while(locfirst; if(conf.first == conf.second && conf.first == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[h]; else if(conf.first == conf.second && conf.first == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[h_last]; else if(conf.first < conf.second && conf.first == h && conf.second != h_last) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.second]; else if(conf.first < conf.second && conf.second == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.first]; else if(conf.first == h && conf.second == h_last) rst[loc][hap_pair_map[conf]] = 2*(hap_freq_table[h_last]-hap_freq_table[h]); else if(conf.first != h && conf.first != h_last && conf.second == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[conf.first]; loc++; iter++; } giter++; } for(int i=0;iget_num()>0 && geno_list[i]->info==1 && missing_list[geno_missing_map[i]]->dim>0) geno_list[i]->expected_hap_num(freq,geno_freq_table,hap_pair_map,count,missing_list[geno_missing_map[i]]->sites); } for(int i=0;iget_num()>0 && missing_list[i]->dim>0){ missing_list[i]->set_weight(geno_freq_table,hap_pair_map,count); missing_list[i]->compute_centmatrix(freq,geno_freq_table); missing_list[i]->compute_derivative(hap_freq_table,hap_pair_map,count,rst); } } for(int i=0;iN_typed>0){ int cat; int mis_cat; int dim=0; for(int i=0;iN;i++){ cat = fam_list[fam]->cat[i]; if(geno_list[cat]->info==1){ mis_cat = fam_list[fam]->mis_cat[i]; dim+=missing_list[mis_cat]->dim; } } if(dim<=0) continue; for(int i=0;i, double>::iterator iterk; flag_pd = 1; for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1){ ind_1 = fam_list[fam]->fam_member[i][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_1)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } for(int j=0;jcentmatrix[j][k]; const vector hap_num = geno_list[cat_1]->get_hap_num(); for(int j=0;jderivative[j][k]; cholent[nb1+j][h_size-1] = hap_num[j]; } nb1+=dim_1; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,h_size,chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); flag_pd = 0; exit(1); } if(flag_pd==1){ double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,1,h_size-1,h_size,h_size); for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); } else{ double var; double &determ = var; double **v = inverse(denominator,h_size-1,determ); double **w = new double*[h_size-1]; for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); clear_matrix(v,h_size-1,h_size-1); clear_matrix(w,h_size-1,1); } clear_matrix(cholentmain,h_size-1,h_size); clear_matrix(cholmain,h_size-1,h_size-1); clear_matrix(cholaugmain,h_size-1,h_size); update_geno_freq(); } void IQLAEstimator::NR_Iteration_subgroup_EW(int group){ int h_size = hap_freq_table.size(); int col = geno_freq_table.size(); for(int i=0;i::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ freq[loc] = iter->second; loc++; iter++; } int h_last=0; iter = hap_freq_table.end(); iter--; h_last=iter->first; map, double>::iterator giter=geno_freq_table.begin(); while(giter!=geno_freq_table.end()){ pair conf = giter->first; loc = 0; iter = hap_freq_table.begin(); while(locfirst; if(conf.first == conf.second && conf.first == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[h]; else if(conf.first == conf.second && conf.first == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[h_last]; else if(conf.first < conf.second && conf.first == h && conf.second != h_last) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.second]; else if(conf.first < conf.second && conf.second == h) rst[loc][hap_pair_map[conf]] = 2*hap_freq_table[conf.first]; else if(conf.first == h && conf.second == h_last) rst[loc][hap_pair_map[conf]] = 2*(hap_freq_table[h_last]-hap_freq_table[h]); else if(conf.first != h && conf.first != h_last && conf.second == h_last) rst[loc][hap_pair_map[conf]] = -2*hap_freq_table[conf.first]; loc++; iter++; } giter++; } for(int i=0;iget_num()>0 && geno_list[i]->info==1 && missing_list[geno_missing_map[i]]->dim>0) geno_list[i]->expected_hap_num(freq,geno_freq_table,hap_pair_map,count,missing_list[geno_missing_map[i]]->sites); } for(int i=0;iget_num()>0 && missing_list[i]->dim>0){ missing_list[i]->set_weight(geno_freq_table,hap_pair_map,count); missing_list[i]->compute_centmatrix(freq,geno_freq_table); missing_list[i]->compute_derivative(hap_freq_table,hap_pair_map,count,rst); } } for(int i=0;iN_typed>0){ int cat; int mis_cat; int dim=0; for(int i=0;iN;i++){ cat = fam_list[fam]->cat[i]; if(geno_list[cat]->info==1 && fam_list[fam]->fam_member[i][4]==group){ mis_cat = fam_list[fam]->mis_cat[i]; dim+=missing_list[mis_cat]->dim; } } if(dim<=0) continue; for(int i=0;i, double>::iterator iterk; flag_pd = 1; for(int i=0;iN;i++){ cat_1 = fam_list[fam]->cat[i]; mis_cat_1 = fam_list[fam]->mis_cat[i]; dim_1 = missing_list[mis_cat_1]->dim; if(dim_1 > 0 && geno_list[cat_1]->info==1 && fam_list[fam]->fam_member[i][4]==group){ ind_1 = fam_list[fam]->fam_member[i][0]; iterk = (fam_list[fam]->kinship_coeff).find(pair(ind_1,ind_1)); if(iterk == (fam_list[fam]->kinship_coeff).end()){ printf("No IBD coefficient for individual %d from family %d. Please check...\n\n", ind_1,fam_list[fam]->fam_id); exit(1); } for(int j=0;jcentmatrix[j][k]; const vector hap_num = geno_list[cat_1]->get_hap_num(); for(int j=0;jderivative[j][k]; cholent[nb1+j][h_size-1] = hap_num[j]; } nb1+=dim_1; } // i is typed } // complete i if(cholesky(covMatrix,dim,cholent,h_size,chol,cholaug,0) != 1){ printf("cholesky decomposition of the cov matrix failed for family %d. \n", fam_list[fam]->fam_id); flag_pd = 0; exit(1); } if(flag_pd==1){ double **s = self_colmultiply(cholaug,dim,1,h_size-1,1,h_size-1); double **t = self_colmultiply(cholaug,dim,1,h_size-1,h_size,h_size); for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); } else{ double var; double &determ = var; double **v = inverse(denominator,h_size-1,determ); double **w = new double*[h_size-1]; for(int i=0;isecond+=s[i][0]; n+=iter->second; iter++; } iter->second = 1-n; clear_matrix(s,h_size-1,1); clear_matrix(v,h_size-1,h_size-1); clear_matrix(w,h_size-1,1); } clear_matrix(cholentmain,h_size-1,h_size); clear_matrix(cholmain,h_size-1,h_size-1); clear_matrix(cholaugmain,h_size-1,h_size); update_geno_freq(); } void IQLAEstimator::estimate_subgroup_EW(){ reset_freq_table(full_hap_freq_table); int count=1; int flag; while(1){ map of = hap_freq_table; NR_Iteration_EW(); map nf = hap_freq_table; double diff = 0; flag = 1; map::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ diff += (nf[iter->first]-of[iter->first])*(nf[iter->first]-of[iter->first]); if(nf[iter->first]<0.0000001){ flag = 0; break; } iter++; } if(diff<1e-5 || count>5 || flag==0) break; count++; } full_hap_freq_table_EW = hap_freq_table; if(aff>=15){ reset_freq_table(full_hap_freq_table); int count=1; int flag; while(1){ map of = hap_freq_table; NR_Iteration_subgroup_EW(2); map nf = hap_freq_table; double diff = 0; flag = 1; map::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ diff += (nf[iter->first]-of[iter->first])*(nf[iter->first]-of[iter->first]); if(nf[iter->first]<0.0000001){ flag = 0; break; } iter++; } if(diff<1e-5 || count>5 || flag==0) break; count++; } aff_hap_freq_table_EW = hap_freq_table; } if(unaff>=15){ reset_freq_table(full_hap_freq_table); int count=1; int flag; while(1){ map of = hap_freq_table; NR_Iteration_subgroup_EW(1); map nf = hap_freq_table; double diff = 0; flag = 1; map::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ diff += (nf[iter->first]-of[iter->first])*(nf[iter->first]-of[iter->first]); if(nf[iter->first]<0.0000001){ flag = 0; break; } iter++; } if(diff<1e-5 || count>5 || flag==0) break; count++; } unaff_hap_freq_table_EW = hap_freq_table; } if(unknown>=15){ reset_freq_table(full_hap_freq_table); int count=1; int flag; while(1){ map of = hap_freq_table; NR_Iteration_subgroup_EW(0); map nf = hap_freq_table; double diff = 0; flag = 1; map::iterator iter=hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ diff += (nf[iter->first]-of[iter->first])*(nf[iter->first]-of[iter->first]); if(nf[iter->first]<0.0000001){ flag = 0; break; } iter++; } if(diff<1e-5 || count>5 || flag==0) break; count++; } unknown_hap_freq_table_EW = hap_freq_table; } reset_freq_table(full_hap_freq_table); } void IQLAEstimator::print_subgroup_EW(vector &a0v, vector &a1v){ fprintf(outfp, "Haplotype frequency estimates by phenotype category (EW_a estimator)\n"); fprintf(outfp, "Haplotype\tOverall\t"); if(aff>=15) fprintf(outfp, "\tAffected"); if(unaff>=15) fprintf(outfp, "\tUnaffected"); if(unknown>=15) fprintf(outfp, "\tUnknown"); fprintf(outfp, "\n"); double sum=0, sum_aff=0, sum_unaff=0, sum_unknown=0; int ind=0, ind_aff=0, ind_unaff=0, ind_unknown=0; map::iterator iter = hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ if(full_hap_freq_table_EW[iter->first]>=0) sum+=full_hap_freq_table_EW[iter->first]; else ind=1; if(aff>=15){ if(aff_hap_freq_table_EW[iter->first]>=0) sum_aff+=aff_hap_freq_table_EW[iter->first]; else ind_aff=1; } if(unaff>=15){ if(unaff_hap_freq_table_EW[iter->first]>=0) sum_unaff+=unaff_hap_freq_table_EW[iter->first]; else ind_unaff=1; } if(unknown>=15){ if(unknown_hap_freq_table_EW[iter->first]>=0) sum_unknown+=unknown_hap_freq_table_EW[iter->first]; else ind_unknown=1; } iter++; } iter = hap_freq_table.begin(); while(iter!=hap_freq_table.end()){ translate_hap(outfp,iter->first,loci_num,a0v,a1v); if(loci_num==2) fprintf(outfp, "\t"); if(full_hap_freq_table_EW[iter->first]>=0){ if(ind==0) fprintf(outfp, "\t%.4f\t", full_hap_freq_table_EW[iter->first]); else fprintf(outfp, "\t%.4f\t", full_hap_freq_table_EW[iter->first]/sum); } else fprintf(outfp, "\t0.0000\t"); if(aff>=15){ if(aff_hap_freq_table_EW[iter->first]>=0){ if(ind_aff==0) fprintf(outfp, "\t%.4f\t", aff_hap_freq_table_EW[iter->first]); else fprintf(outfp, "\t%.4f\t", aff_hap_freq_table_EW[iter->first]/sum_aff); } else fprintf(outfp, "\t0.0000\t"); } if(unaff>=15){ if(unaff_hap_freq_table_EW[iter->first]>=0){ if(ind_unaff==0) fprintf(outfp, "\t%.4f\t", unaff_hap_freq_table_EW[iter->first]); else fprintf(outfp, "\t%.4f\t", unaff_hap_freq_table_EW[iter->first]/sum_unaff); } else fprintf(outfp, "\t0.0000\t"); } if(unknown>=15){ if(unknown_hap_freq_table_EW[iter->first]>=0){ if(ind_unknown==0) fprintf(outfp, "\t%.4f", unknown_hap_freq_table_EW[iter->first]); else fprintf(outfp, "\t%.4f", unknown_hap_freq_table_EW[iter->first]/sum_unknown); } else fprintf(outfp, "\t0.0000"); } fprintf(outfp, "\n"); iter++; } fprintf(outfp, "\n\n"); }