www.pudn.com > Genecircus20070919.rar > MulithreadGetNetworks.cpp


// MulithreadGetNetworks.cpp: implementation of the MulithreadGetNetworks class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "MulithreadGetNetworks.h" 
#include "wx_pch.h" 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
#define cent_x 400 
#define cent_y 340 
#define radius 300 
 
MulithreadGetNetworks::MulithreadGetNetworks() 
{ 
   net = new Network(); 
   tolerance = 0.9; 
   if_complex_calculate = false; 
} 
 
MulithreadGetNetworks::~MulithreadGetNetworks() 
{ 
   delete net; 
} 
 
//boost::mutex io_mutex; 
 
/* 
2006 8 16 Ruoyu Luo add the following : 
1) for (int i = 0; i < t->data_base->micro_set.size(); i++){ ==> for (int i = 0; i < t->data_base->index_temp.size(); i++){ 
the order for this change is only find the first control step's network relationship 
*/ 
 
void rebuild(int id,MulithreadGetNetworks * parent) 
{  
    vector::iterator index_iter; 
	MulithreadGetNetworks * t = parent; 
    for (int i = 0; i < t->data_base->index_temp.size(); i++){ 
		 if(t->data_base->index_temp[i] != id && id > t->data_base->index_temp[i]){ 
		   double mi = t->calculate->get_GenePairs_Mi_and_save(id ,t->data_base->index_temp[i]); 
		   if(mi > t->calculate->pvalue){ 
			  if(t->calculate->ok_readandwrite_index == true){ 
				 //boost::mutex::scoped_lock 
                 //lock(io_mutex); 
				 t->calculate->ok_readandwrite_index = false; 
                  
				 t->data_base->xyindex[id][t->data_base->index_temp[i]] = 1; 
                 t->data_base->xyindex[t->data_base->index_temp[i]][id] = 1; 
 
				 t->calculate->ok_readandwrite_index = true; 
			  } 
		   } 
		} 
	} 
} 
 
void MulithreadGetNetworks::Get() 
{ 
	clear_connect_matrix(); 
 
	new_connect_matrix(); 
 
	if(getroundindex()){ 
		 for(int i = 0;iif_complex_calculate == false){ 
       DPI_first_step(); 
	   check_delete_gene(); 
	   check_delete_con(); 
	} 
	else{ 
	   DPI_first_step(); 
	   check_delete_gene(); 
	   DPI_first_step_complex(); 
	   check_delete_con(); 
	} 
 
    delete_gene_control(); 
	 
	check_have_out_connect(); 
 
	savenetwork(); 
} 
 
void MulithreadGetNetworks::delete_gene_control() 
{ 
	 gene g1; 
	 g1 = net->g; 
	 net->size_total = net->g.size(); 
	 //net->g2_step = net->g; 
     for(int i = 1;i < g1.size();i++){ 
         for(int j = 0; j < net->c.size(); j++){ 
			 if(net->c[j].delete_or_keep == true && net->c[j].index_begin == 0 && net->c[j].index_end == g1[i].index 
				|| 
                net->c[j].delete_or_keep == true && net->c[j].index_end == 0 && net->c[j].index_begin == g1[i].index){ 
				 int index_j = g1[i].index_express; 
				 int index_i = g1[i].index; 
				 for(int a = i;a < g1.size()-1;a++){ 
					 g1[a] = g1[a+1]; 
					 g1[a].index--; 
				 } 
				 g1.pop_back(); 
				 for(int ii = 0; ii ::iterator result = find(g1[ii].temp.begin(),g1[ii].temp.end(),index_j); 
					 if(result != g1[ii].temp.end()){ 
                        remove(g1[ii].temp.begin(),g1[ii].temp.end(),index_j); 
					 } 
				 } 
				 for(int ii = 0; ii c.size();ii++){ 
                     if(net->c[ii].index_begin == index_i 
						|| 
                        net->c[ii].index_end == index_i){ 
						net->c[ii].delete_or_keep = true; 
					 } 
                     if(net->c[ii].index_begin > index_i){ 
						net->c[ii].index_begin -= 1; 
					 } 
                     if(net->c[ii].index_end > index_i){ 
						net->c[ii].index_end -= 1; 
					 } 
				 } 
			 } 
		 } 
	 } 
	 net->g.clear(); 
	 net->g = g1; 
} 
 
void MulithreadGetNetworks::create_mi_matrix() 
{ 
	for(int i = 0;i < net->g.size();i++){ 
		for(int j = 0;j < net->g.size();j++){ 
            if(i != j && i > j){ 
			   double mi = calculate->get_GenePairs_Mi_and_save(net->g[i].index_express ,net->g[j].index_express); 
			   if(mi > calculate->pvalue){ 
				  data_base->mivector[i][j] = mi; 
				  data_base->mivector[j][i] = mi; 
			   } 
			} 
		} 
	} 
} 
 
void MulithreadGetNetworks::savenetwork() 
{ 
     wxString dirname = calculate->dirname; 
	 string networkmodel = ""; 
	 string temp; 
	 for(int i = 0; i < net->g.size(); i++){ 
         networkmodel = networkmodel + (string)(net->g[i].name) + ":" + '\r'+'\n'; 
		 temp = boost::lexical_cast(net->g[i].x); 
         networkmodel += temp +'\t'; 
		 temp = boost::lexical_cast(net->g[i].y); 
		 networkmodel += temp +'\t'; 
		 temp = boost::lexical_cast(net->g[i].index_express); 
         networkmodel += temp +'\t'; 
		 temp = boost::lexical_cast(net->g[i].index); 
		 networkmodel += temp +'\t'; 
		 temp = boost::lexical_cast(net->g[i].index_orginial); 
		 networkmodel += temp +'\t'; 
		 temp = "have"; 
		 string temp1 = "not"; 
		 if(net->g[i].if_have_other == true) 
            networkmodel += temp +'\r'+'\n'; 
		 else 
            networkmodel += temp1 +'\r'+'\n'; 
	 } 
     string temp2 = "***"; 
	 temp2 += boost::lexical_cast(net->size_total); 
     networkmodel += temp2 + "total" + '\r'+'\n'; 
 
	 for(int i = 0; i < net->c.size(); i++){ 
		 if(net->c[i].delete_or_keep == false){ 
			temp = boost::lexical_cast(net->c[i].index); 
			networkmodel += temp +":" + '\r' +'\n'; 
			temp = boost::lexical_cast(net->c[i].index_begin); 
			networkmodel += temp +'\t'; 
			temp = boost::lexical_cast(net->c[i].index_end); 
			networkmodel += temp +'\t'; 
			temp = boost::lexical_cast(net->c[i].index_begin_express); 
			networkmodel += temp +'\t'; 
			temp = boost::lexical_cast(net->c[i].index_end_express); 
			networkmodel += temp +'\t'; 
			temp = boost::lexical_cast(net->c[i].mi); 
			networkmodel += temp +'\t'; 
			temp = "delete"; 
			string temp1 = "keep"; 
			if(net->c[i].delete_or_keep == true) 
			   networkmodel += temp +'\r'+'\n'; 
			else 
			   networkmodel += temp1 +'\r'+'\n'; 
		 } 
	 } 
     int count = networkmodel.length(); 
     const char * t = networkmodel.c_str(); 
	 dirname = dirname + data_base->micro_set[shuffle->obj_index].name+"_network"+".tmp"; 
	 wxFile file; 
	 file.Create(dirname,true); 
	 file.Open(dirname,wxFile::read_write); 
	 file.Write(t,count); 
	 file.Close(); 
} 
 
void MulithreadGetNetworks::DPI_first_step() 
{ 
	int iii ,ii,i; 
	stack g_temp; 
    for(int j = 0; j < net->g.size();j = j + net->g.size()){ 
	    if(net->g[j].temp.size() <= 1){ 
		   continue; 
		} 
		else if(g_temp.size() == 0){ 
		     g_temp.push(net->g[j]);//first 
             for(i = 0; i < net->g[j].temp.size();i++){ 
				 Gene gt2 = getgene(net->g[j].temp[i]); 
				 if(gt2.name == "") 
					continue; 
				 if(gt2.temp.size() > 1) 
				    g_temp.push(gt2);//second 
				 else 
					continue; 
				 for(ii = 0; ii < gt2.temp.size();ii++){ 
                     Gene gt3 = getgene(gt2.temp[ii]);  
					 if(gt3.name == "") 
					    continue; 
					 if(gt3.temp.size() > 1 
						&& 
						gt3.index_express != net->g[j].index_express) 
				        g_temp.push(gt3);//third 
					 else 
						continue; 
					 if(gt3.index_express != net->g[j].index_express){//this line has'nt using 
						 for(iii = 0;iii < gt3.temp.size();iii++){ 
                             Gene gt4 = getgene(gt3.temp[iii]); 
							 if(gt4.name == "") 
					            continue; 
                             if(gt4.temp.size() > 1 
								&& 
								gt4.index_express != gt2.index_express) 
                                g_temp.push(gt4); 
							 else 
								continue; 
							 if(gt4.index_express != net->g[j].index_express){//four nodes 
								 for(int iiii = 0;iiii < gt4.temp.size();iiii++){ 
									 if(gt4.temp[iiii] == net->g[j].index_express){ 
										DPI4nodes(net->g[j],gt2,gt3,gt4); 
										break; 
									 } 
								 } 
								 g_temp.pop(); 
							 } 
							 else{//three nodes 
								 g_temp.pop(); 
                                 DPI3nodes(net->g[j],gt2,gt3,net->g[j]); 
							 } 
						 } 
						 if(iii == gt3.temp.size()) 
							g_temp.pop();//pop gt3 
					} 
				 }//for ii 
				 if(ii == gt2.temp.size()) 
					g_temp.pop();//  pop gt2 
			 }//for i 与这个基因相连的每个基因 
			 if(i == net->g[j].temp.size()) 
				g_temp.pop();// pop gt1 
		}//else if 
	  else if(g_temp.size() != 0) { 
			  wxMessageBox("Error found in stack first level!"); 
	  } 
	}//for j 每个基因 
} 
 
void MulithreadGetNetworks::check_delete_con() 
{ 
     for(int a = 0;a < net->c.size();a++){ 
		 if(net->c[a].delete_or_keep == false && net->g[net->c[a].index_begin].delete_if == true 
		    || 
            net->c[a].delete_or_keep == false && net->g[net->c[a].index_end].delete_if == true){ 
			net->c[a].delete_or_keep = true; 
		 } 
	 } 
} 
 
void MulithreadGetNetworks::check_delete_gene() 
{ 
	int a = 0; 
	for(int j = 1; j < net->g.size();j++){ 
	    for(int a = 0;a < net->c.size();a++){ 
		    if(net->c[a].delete_or_keep == true && net->c[a].index_begin == 0 && net->c[a].index_end == net->g[j].index 
		       || 
               net->c[a].delete_or_keep == true && net->c[a].index_end == 0 && net->c[a].index_begin == net->g[j].index){ 
			   break; 
			} 
		} 
	    if(a != net->c.size()){ 
		   net->g[j].delete_if = true; 
		} 
	} 
} 
 
void MulithreadGetNetworks::DPI_first_step_complex() 
{ 
	int iii,ii,i; 
	stack g_temp; 
    for(int j = 1; j < net->g.size();j++){ 
        if(net->g[j].delete_if){ 
		   continue; 
		} 
	    if(net->g[j].temp.size() <= 1){ 
		   continue; 
		} 
		else if(g_temp.size() == 0){ 
		     g_temp.push(net->g[j]);//first 
             for(i = 0; i < net->g[j].temp.size();i++){ 
				 Gene gt2 = getgene(net->g[j].temp[i]); 
				 if(gt2.name == "") 
					continue; 
				 if(gt2.index_express == shuffle->obj_index) 
					continue; 
				 if(gt2.delete_if)////////// 
					continue; 
				 if(gt2.temp.size() > 1) 
				    g_temp.push(gt2);//second 
				 else 
					continue; 
				 for(ii = 0; ii < gt2.temp.size();ii++){ 
                     Gene gt3 = getgene(gt2.temp[ii]);  
					 if(gt3.name == "") 
					    continue; 
					 if(gt3.delete_if)///////// 
						continue; 
                     if(gt3.index_express == shuffle->obj_index) 
					    continue; 
					 if(gt3.temp.size() > 1 
						&& 
						gt3.index_express != net->g[j].index_express) 
				        g_temp.push(gt3);//third 
					 else 
						continue; 
					 if(gt3.index_express != net->g[j].index_express){//this line has'nt using 
						 for(iii = 0;iii < gt3.temp.size();iii++){ 
                             Gene gt4 = getgene(gt3.temp[iii]); 
							 if(gt4.name == "") 
					            continue; 
							 if(gt4.delete_if)///////// 
						        continue; 
							 if(gt4.index_express == shuffle->obj_index) 
					            continue; 
                             if(gt4.temp.size() > 1 
								&& 
								gt4.index_express != gt2.index_express) 
                                g_temp.push(gt4); 
							 else 
								continue; 
							 if(gt4.index_express != net->g[j].index_express){//four nodes 
								 for(int iiii = 0;iiii < gt4.temp.size();iiii++){ 
									 if(gt4.temp[iiii] == net->g[j].index_express){ 
										DPI4nodes(net->g[j],gt2,gt3,gt4); 
										break; 
									 } 
								 } 
								 g_temp.pop(); 
							 } 
							 else{//three nodes 
								 g_temp.pop(); 
                                 DPI3nodes(net->g[j],gt2,gt3,net->g[j]); 
							 } 
						 } 
						 if(iii == gt3.temp.size()) 
							g_temp.pop();//pop gt3 
					} 
				 }//for ii 
				 if(ii == gt2.temp.size()) 
					g_temp.pop();//  pop gt2 
			 }//for i 与这个基因相连的每个基因 
			 if(i == net->g[j].temp.size()) 
				g_temp.pop();// pop gt1 
		}//else if 
	  else if(g_temp.size() != 0) { 
			  wxMessageBox("Error found in stack first level!"); 
	  } 
	}//for j 每个基因 
} 
 
void MulithreadGetNetworks::DPI3nodes(Gene g1,Gene g2,Gene g3,Gene center) 
{ 
	 typedef std::vector sort_p; 
	 sort_p p; 
	 int i = g1.index_express; 
	 int j = g2.index_express; 
	 int k = g3.index_express; 
	 double mi_ij = data_base->mivector[g1.index][g2.index]; 
	 double mi_ik = data_base->mivector[g1.index][g3.index]; 
	 double mi_jk = data_base->mivector[g2.index][g3.index]; 
	 if(mi_ij > calculate->pvalue && mi_ik > calculate->pvalue && mi_jk > calculate->pvalue){ 
		p.push_back(mi_ij);p.push_back(mi_ik);p.push_back(mi_jk); 
		sort(p.begin(),p.end()); 
		if(p[0] == mi_ij && p[0] < p[1]*tolerance){ 
		   for(int a = 0; a< net->c.size();a++){ 
			   if(net->c[a].index_begin_express == i && net->c[a].index_end_express == j 
				  ||  
				  net->c[a].index_end_express == i && net->c[a].index_begin_express == j){ 
				  if(i == center.index_express || j == center.index_express){ 
					 if(i == center.index_express){ 
						if(!preciseDPI(g3,g2,mi_jk,g1)){ 
                           net->c[a].delete_or_keep = true; 
						   break; 
						} 
						else 
                          break; 
					 } 
					 else{ 
						 if(!preciseDPI(g3,g1,mi_ik,g2)){ 
                            net->c[a].delete_or_keep = true; 
							break; 
						 } 
						 else 
                           break; 
					 } 
				  } 
				  else{ 
				   net->c[a].delete_or_keep = true; 
				   break; 
				  } 
			   } 
		   } 
		} 
		 else if(p[0] == mi_ik && p[0] < p[1]*tolerance){ 
			 for(int a = 0; a< net->c.size();a++){ 
				 if(net->c[a].index_begin_express == i && net->c[a].index_end_express == k 
					||  
					net->c[a].index_end_express == i && net->c[a].index_begin_express == k){ 
				    if(i == center.index_express || k == center.index_express){ 
						 if(i == center.index_express){ 
							if(!preciseDPI(g2,g3,mi_jk,g1)){ 
							   net->c[a].delete_or_keep = true; 
							   break; 
							} 
							else 
							  break; 
						 } 
						 else{ 
							 if(!preciseDPI(g2,g1,mi_ij,g3)){ 
								net->c[a].delete_or_keep = true; 
								break; 
							 } 
							 else 
							   break; 
						 } 
					} 
					 
					else{ 
					 net->c[a].delete_or_keep = true; 
					 break; 
					} 
				 } 
			 } 
		 } 
		 else if(p[0] == mi_jk && p[0] < p[1]*tolerance){ 
			 for(int a = 0; a< net->c.size();a++){ 
				 if(net->c[a].index_begin_express == j && net->c[a].index_end_express == k 
					||  
					net->c[a].index_end_express == j && net->c[a].index_begin_express == k){ 
				    if(j == center.index_express || k == center.index_express){ 
						 if(j == center.index_express){ 
							if(!preciseDPI(g1,g3,mi_ik,g2)){ 
							   net->c[a].delete_or_keep = true; 
							   break; 
							} 
							else 
							  break; 
						 } 
						 else{ 
							 if(!preciseDPI(g1,g2,mi_ij,g3)){ 
								net->c[a].delete_or_keep = true; 
								break; 
							 } 
							 else 
							   break; 
						 } 
					} 
					else{ 
					 net->c[a].delete_or_keep = true; 
					 break; 
					} 
				 } 
			 } 
		 }      
	 } 
} 
 
bool MulithreadGetNetworks::preciseDPI(Gene index1/*center*/,Gene index2/*waiting decision*/,double mi_temp,Gene center) 
{ 
	for(int i = 1;i < net->g.size();i++){//i can't be center of the problem 
		if(data_base->mivector[index1.index][i] != -1 
		   && 
		   i != index2.index//also can't be the waiting decision 
		   && 
		   i != center.index){ 
		   if(data_base->mivector[i][index2.index] != -1){ 
			  typedef std::vector sort_p; 
	          sort_p p; 
              p.push_back(mi_temp); 
			  p.push_back(data_base->mivector[index1.index][i]); 
			  p.push_back(data_base->mivector[i][index2.index]); 
              sort(p.begin(),p.end()); 
              if(p[0] == mi_temp && p[0] < p[1]*tolerance){ 
				 return false; 
			  } 
		   } 
		} 
		 
		/* 
		if(data_base->mivector[index1.index][i] != -1 
		   && 
		   i != index2.index 
		   && 
		   i != center.index){ 
           if(data_base->mivector[i][center.index] != -1){ 
			  typedef std::vector sort_p; 
	          sort_p p; 
              p.push_back(data_base->mivector[index1.index][center.index]); 
			  p.push_back(data_base->mivector[index1.index][i]); 
			  p.push_back(data_base->mivector[i][center.index]); 
              sort(p.begin(),p.end()); 
              if(p[0] == data_base->mivector[index1.index][center.index] 
				 && 
				 p[0] < p[1]*tolerance){ 
				 return false; 
			  } 
		   }		    
		} 
		*/ 
 
	} 
    return true; 
} 
 
bool MulithreadGetNetworks::resuctmap(int index,int index2,double mi_temp) 
{ 
	 return true;//may be keep 
} 
 
void MulithreadGetNetworks::DPI4nodes(Gene g1,Gene g2,Gene g3,Gene g4) 
{ 
	 int i = g1.index_express; 
	 int j = g2.index_express; 
	 int k = g3.index_express; 
	 int l = g4.index_express; 
	 if(data_base->mivector[g1.index][g3.index] != -1 && data_base->mivector[g2.index][g4.index] != -1){ 
		//data_base->xyindex[i][k] == 1 && data_base->xyindex[j][l] == 1){//a line is connect between i and k 
        DPI3nodes(g1,g2,g3,g1); 
        DPI3nodes(g1,g3,g4,g1); 
        DPI3nodes(g2,g3,g4,g1); 
        DPI3nodes(g1,g2,g4,g1); 
	 } 
     else if(data_base->mivector[g1.index][g3.index] != -1 && data_base->mivector[g2.index][g4.index] == -1){ 
		    //data_base->xyindex[i][k] == 1 && data_base->xyindex[j][l] != 1){ 
        DPI3nodes(g1,g2,g3,g1); 
        DPI3nodes(g1,g3,g4,g1);		 
	 } 
	 else if(data_base->mivector[g1.index][g3.index] == -1 && data_base->mivector[g2.index][g4.index] != -1){ 
		    //data_base->xyindex[i][k] != 1 && data_base->xyindex[j][l] == 1){//a line is connect between i and k 
        DPI3nodes(g2,g3,g4,g1); 
        DPI3nodes(g1,g2,g4,g1); 
	 } 
	 else if(data_base->mivector[g1.index][g3.index] == -1 && data_base->mivector[g2.index][g4.index] == -1){ 
		   //data_base->xyindex[i][k] != 1 && data_base->xyindex[j][l] != 1){ 
			 double mi_ij = data_base->mivector[g1.index][g2.index]; 
			 double mi_jk = data_base->mivector[g2.index][g3.index]; 
			 double mi_kl = data_base->mivector[g3.index][g4.index]; 
			 double object = data_base->mivector[g1.index][g4.index]; 
			 typedef std::vector sort_p; 
	         sort_p p; 
		     p.push_back(mi_ij);p.push_back(mi_jk);p.push_back(mi_kl); 
		     sort(p.begin(),p.end()); 
			 if(object < p[0]*tolerance) 
			 for(int a = 0; a< net->c.size();a++){ 
				 if(net->c[a].index_begin_express == i && net->c[a].index_end_express == l 
					|| 
					net->c[a].index_end_express == i && net->c[a].index_begin_express == l){ 
					net->c[a].delete_or_keep = true; 
					break; 
				 } 
			 } 
	 } 
} 
 
Gene MulithreadGetNetworks::getgene(int index) 
{ 
	int i; 
	Gene g; 
	g.name = ""; 
	for(i = 0;i < net->g.size();i++){ 
		if(net->g[i].index_express == index){ 
		   return net->g[i]; 
		} 
	} 
	if(i == net->g.size()){ 
	   string ind = boost::lexical_cast(index); 
	   ind = ind + ":Error!"; 
	   wxMessageBox(ind.c_str()); 
	   return g; 
	} 
} 
 
Gene MulithreadGetNetworks::find_next_step(Gene g) 
{ 
    Gene g_temp; 
	return g_temp; 
} 
 
void MulithreadGetNetworks::check_have_out_connect() 
{ 
     for(int j = 0; j < net->g.size();j++){ 
		 if(j != 0){ 
			for(int i = 0; i < data_base->micro_set1.size();i++){ 
				if(i != shuffle->obj_index){ 
				   vector::iterator to = find(data_base->index_temp.begin(),data_base->index_temp.end(),i); 
				   if(to == data_base->index_temp.end()){ 
				      double mi = this->calculate->get_GenePairs_Mi_and_save(net->g[j].index_express,i); 
					  if(mi > calculate->pvalue){ 
						 net->g[j].if_have_other = true;//have other node which out of the system connect this node  
						 break; 
					  } 
				   } 
				} 
			} 
		 } 
	 } 
} 
 
 
void MulithreadGetNetworks::rebuildnetwork_connect_gene() 
{	 
	int r1,r; 
	int index = 0; 
    for(int j = 0; j < net->g.size();j++){ 
        if(j != 0){ 
		   Ccontrol * con = new Ccontrol(); 
		   con->index = index++; 
           con->index_begin = 0; 
		   con->index_end = net->g[j].index; 
		   con->index_begin_express = shuffle->obj_index; 
		   con->index_end_express = net->g[j].index_express;//lry 2006 8 17 
		   con->mi = data_base->mivector[con->index_begin][con->index_end]; 
		   net->c.push_back(*con); 
		} 
	} 
    for(int j = 0; j < net->g.size();j++){ 
        if(j != 0 && net->g[j].temp.size() != 0){		    
			for(int a = 0;a < net->g[j].temp.size();a++){ 
		        Ccontrol * con = new Ccontrol(); 
                con->index = index++; 
                con->index_begin = net->g[j].index;				                
				con->index_begin_express = net->g[j].index_express;	 
				int index_temp = 0; 	 
				for(int r = 0;r < net->g.size();r++){ 
					if(net->g[r].name == data_base->micro_set1[net->g[j].temp[a]].name){ 
					   index_temp = net->g[r].index; 
					} 
				} 
				con->index_end = index_temp;		 
				con->mi = data_base->mivector[con->index_begin][con->index_end]; 
				con->index_end_express = net->g[j].temp[a]; 
				for(r = 0; r < net->c.size();r++){ 
					if(net->c[r].index_begin == net->g[j].index && net->c[r].index_end == index_temp 
					   || 
                       net->c[r].index_end == net->g[j].index && net->c[r].index_begin == index_temp){ 
					   delete con; 
					   break; 
					} 
				} 
				for(r1 = 0; r1 < net->c.size();r1++){ 
					if(net->c[r1].index_begin == net->g[j].index && net->c[r1].index_end == index_temp 
					   && data_base->mivector[net->g[j].index][index_temp] == -1 
					   || 
                       net->c[r1].index_end == net->g[j].index && net->c[r1].index_begin == index_temp 
					   && data_base->mivector[index_temp][net->g[j].index] == -1){ 
					   delete con; 
					   break; 
					} 
				} 
                if(r == net->c.size() && r1 == net->c.size()) 
		           net->c.push_back(*con); 
			} 
		} 
	}  	 
} 
 
void MulithreadGetNetworks::rebuildnetwork_Set_gene_para() 
{	  
	 Gene * g = &(net->g[0]); 
	 g->x = cent_x; 
	 g->y = cent_y; 
     for(int j = 0; j < net->g.size();j++){ 
         if(j != 0){ 
            net->g[j].x = cent_x + radius*sin(j*(2*M_PI/(net->g.size()-1))); 
			net->g[j].y = cent_y - radius*cos(j*(2*M_PI/(net->g.size()-1)));  
		 } 
	 } 
} 
 
void MulithreadGetNetworks::rebuildnetwork_get_gene() 
{ 
	int index = 0; 
    Gene * g_cent = new Gene(); 
	g_cent->name = calculate->name_for_now_gene; 
	g_cent->index = index++; 
	g_cent->index_express = shuffle->obj_index; 
	g_cent->index_orginial = 0; 
	int a = this->data_base->Getindexofonegene(calculate->name_for_now_gene); 
    for(int j = 0; j < data_base->micro_set.size();j++){ 
        if(data_base->xyindex[a][j] == 1 && a > j){ 
		   g_cent->temp.push_back(j); 
		} 
		if(a == j){ 
           for(;a < data_base->micro_set.size();a++){ 
			   int yy = data_base->xyindex[a][j]; 
			   if(data_base->xyindex[a][j] == 1){ 
				  g_cent->temp.push_back(a); 
			   } 
		   }					  
		   break; 
		} 
	} 
	net->g.push_back(*g_cent); 
 
    for(int i = 0; i < data_base->micro_set.size();i++){ 
		if(i != this->data_base->Getindexofonegene(calculate->name_for_now_gene)){ 
		   vector::iterator to = find(data_base->xyindex[i].begin(),data_base->xyindex[i].end(),1); 
		   if(to != data_base->xyindex[i].end()){ 
		      Gene * g_temp = new Gene(); 
		      g_temp->name = data_base->micro_set1[i].name;   
			  g_temp->index = index++; 
			  g_temp->index_express = i; 
			  g_temp->index_orginial = g_temp->index; 
		      for(int j = 0; j < data_base->micro_set.size();j++){//for xyindex is down_triple matirx 
		   	      if(data_base->xyindex[i][j] == 1 && i > j){ 
				     g_temp->temp.push_back(j); 
				  } 
				  if(i == j){ 
					 for(int a0 = i;a0 < data_base->micro_set.size();a0++){ 
						 if(data_base->xyindex[a0][j] == 1){ 
							g_temp->temp.push_back(a0); 
						 } 
					 }					  
					 break; 
				  } 
			  } 
			  net->g.push_back(*g_temp); 
		   } 
		} 
	} 
 
    if(data_base->xyindex.size() != 0){ 
	   for(int i = 0; i < data_base->micro_set.size();i++){ 
		   data_base->xyindex[i].clear(); 
	   } 
	   data_base->xyindex.clear(); 
	} 
} 
 
void MulithreadGetNetworks::clear_connect_matrix() 
{ 
    if(data_base->xyindex.size() != 0){ 
	   for(int i = 0; i < data_base->micro_set.size();i++){ 
		   data_base->xyindex[i].clear(); 
	   } 
	   data_base->xyindex.clear(); 
	} 
    if(data_base->mivector.size() != 0){ 
	  for(int i = 0;i< data_base->mivector.size(); i++){ 
          data_base->mivector[i].clear(); 
	  } 
	  data_base->mivector.clear(); 
	  for(int i = 0;i< data_base->index_temp.size()+1; i++){ 
		  mi i_mivalue; 
          data_base->mivector.push_back(i_mivalue);	   
		  for(int j = 0;j< data_base->index_temp.size()+1; j++){ 
			  data_base->mivector[i].push_back(-1.0); 
		  } 
	  } 
	} 
    else{ 
	  for(int i = 0;i< data_base->index_temp.size()+1; i++){ 
		  mi i_mivalue; 
          data_base->mivector.push_back(i_mivalue);	   
		  for(int j = 0;j< data_base->index_temp.size()+1; j++){ 
			  data_base->mivector[i].push_back(-1.0); 
		  } 
	  } 
	} 
	//DPI_temp_mi.clear(); 
	//DPI_temp_center.clear(); 
} 
 
void MulithreadGetNetworks::new_connect_matrix() 
{ 
    for(int i = 0; i < data_base->micro_set.size();i++){ 
        y_index y; 
        data_base->xyindex.push_back(y); 
		for(int j = 0; j micro_set.size();j++){ 
			int a = 100; 
            data_base->xyindex[i].push_back(100); 
		} 
	} 
	for(int i = 0;i < data_base->index_temp.size();i++){ 
		//int yy = data_base->index_temp[i]; 
		if(shuffle->obj_index > data_base->index_temp[i]) 
		   data_base->xyindex[shuffle->obj_index][data_base->index_temp[i]] = 1;//这里没有考虑,基因号相同的情况 
		else 
		   data_base->xyindex[data_base->index_temp[i]][shuffle->obj_index] = 1; 
	} 
} 
 
bool MulithreadGetNetworks::getroundindex() 
{ 
	index = data_base->index_temp; 
	return 1; 
}