メモ ハプロタイプ・ディプロタイプの組換え履歴を分岐木管理

package homoStretch;

import java.io.IOException;

public class CousinMarriage {
	int id;
	int gen;
	int num;
	int[] numInGen;
	Person[] person;
	int len;
	double rec;
	
	Person rootPerson=new Person(-1,-1);
	
	
	public CousinMarriage(int id,int gen,int num,int[] numInGen,int len,double rec){
		this.id=id;
		this.gen=gen;
		this.num=num;
		this.numInGen=numInGen;
		this.len=len;
		this.rec=rec;
		
		person=new Person[num];
		int id0=0;int gen0=0;int idInGen0=0;
		int[] hapid0={0,1};
		Person[] parents0 = {rootPerson,rootPerson};
		
		person[0]=new Person(id0,gen0,idInGen0,hapid0,parents0,len);
		//person[0].Print("\t", "\n");
		id0=1;gen0=0;idInGen0=1;
		int[] hapid1={2,3};
		person[1]=new Person(id0,gen0,idInGen0,hapid1,parents0,len);
		//person[1].Print("\t", "\n");
		
		id0=2;gen0=0;idInGen0=2;
		int[] hapid2={4,5};
		person[2]=new Person(id0,gen0,idInGen0,hapid2,parents0,len);
		//person[2].Print("\t", "\n");
		
		id0=3;gen0=0;idInGen0=3;
		int[] hapid3={6,7};
		person[id0]=new Person(id0,gen0,idInGen0,hapid3,parents0,len);
		//person[2].Print("\t", "\n");
		
		id0=4;gen0=0;idInGen0=4;
		int[] hapid4={8,9};
		person[id0]=new Person(id0,gen0,idInGen0,hapid4,parents0,len);
		//person[2].Print("\t", "\n");
		
		id0=5;gen0=0;idInGen0=5;
		int[] hapid5={10,11};
		person[id0]=new Person(id0,gen0,idInGen0,hapid5,parents0,len);
		//person[2].Print("\t", "\n");
		/*
		id0=5;gen0=1;idInGen0=3;
		int[] hapid3={6,7};
		person[5]=new Person(id0,gen0,idInGen0,hapid3,parents0,len);
		//person[5].Print("\t", "\n");
		*/
		id0=6;gen0=1;idInGen0=0;
		person[id0]=Child(id0,gen0,idInGen0,person[0],person[1],len,rec);
		//person[3].Print("\t", "\n");
		id0=7;gen0=1;idInGen0=1;
		person[id0]=Child(id0,gen0,idInGen0,person[2],person[3],len,rec);
		//person[3].Print("\t", "\n");
		id0=8;gen0=1;idInGen0=2;
		person[id0]=Child(id0,gen0,idInGen0,person[2],person[3],len,rec);
		//person[3].Print("\t", "\n");
		id0=9;gen0=1;idInGen0=3;
		person[id0]=Child(id0,gen0,idInGen0,person[4],person[5],len,rec);
		//person[3].Print("\t", "\n");
		
		id0=10;gen0=2;idInGen0=0;
		person[id0]=Child(id0,gen0,idInGen0,person[6],person[7],len,rec);
		//person[3].Print("\t", "\n");
		id0=11;gen0=2;idInGen0=1;
		person[id0]=Child(id0,gen0,idInGen0,person[8],person[9],len,rec);
		//person[3].Print("\t", "\n");
		/*
		id0=4;gen0=1;idInGen0=2;
		person[4]=Child(id0,gen0,idInGen0,person[0],person[1],len,rec);
		//person[4].Print("\t", "\n");
		
		id0=6;gen0=2;idInGen0=0;
		person[6]=Child(id0,gen0,idInGen0,person[2],person[3],len,rec);
		//person[6].Print("\t", "\n");
		
		id0=7;gen0=2;idInGen0=1;
		person[7]=Child(id0,gen0,idInGen0,person[4],person[5],len,rec);
		//person[7].Print("\t", "\n");
		*/
		/*
		for(int i=0;i<12;i++){
			person[i].Print("\t", "\n");
		}
		*/
		for(int i=0;i<numInGen[3];i++){
			id0=12+i;gen0=3;idInGen0=i;
			person[id0]=Child(id0,gen0,idInGen0,person[10],person[11],len,rec);
			//person[id0].Print("\t", "\n");
			person[id0].PrintDiplotype(len);
		}
	}
	
	static Person Child(int id,int gen,int idInGen,Person p1,Person p2,int len,double rec){
		Person[] prnt={p1,p2};
		
		
		int ch=0;
		double rand=Math.random();
		if(rand>0.5){
			ch=1;
		}
		BinarySearchTreeHaplotype tree=new BinarySearchTreeHaplotype();
		int preloc=-1;
		for(int i=0;i<len-1;i++){
			rand=Math.random();
			if(rand<1/rec){
				//System.out.println("rec1\t"+i);
				ch++;
				if(ch==2){
					ch=0;
				}
				p1.haptree[ch].ExtractAndAddNode((double)preloc, (double)i, tree);
				
				preloc=i;
			}
			
		}
		ch++;
		if(ch==2){
			ch=0;
		}
		p1.haptree[ch].ExtractAndAddNode((double)preloc, (double)len-1, tree);
		//System.out.println("===========");
		ch=0;
		rand=Math.random();
		if(rand>0.5){
			ch=1;
		}
		BinarySearchTreeHaplotype tree2=new BinarySearchTreeHaplotype();
		preloc=-1;
		for(int i=0;i<len-1;i++){
			rand=Math.random();
			if(rand<1/rec){
				//System.out.println("rec2\t"+i);
				ch++;
				if(ch==2){
					ch=0;
				}
				p2.haptree[ch].ExtractAndAddNode((double)preloc, (double)i, tree2);
				
				preloc=i;
			}
			
		}
		ch++;
		if(ch==2){
			ch=0;
		}
		p2.haptree[ch].ExtractAndAddNode((double)preloc, (double)len-1, tree2);

		Person ret = new Person(id,gen,idInGen,tree,tree2,prnt);
		ret.diplotree=BinarySearchTreeHaplotype.MakeDiplotype(ret.haptree[0],ret.haptree[1], len);
		//ret.PrintDiplotype(len);
		return ret;
	}
	
	
	
	public static void main(String[] args) throws IOException{
		/*
		 * Make Cousin Marriage with "k" offsprings from cousin-pair
		 */
		int id=0;
		int gen=4;
		int numK=1;
		int[] numInGen={6,4,2,numK};
		int num=sum(numInGen);
		int len=3000000;
		double rec=10000;
		CousinMarriage f=new CousinMarriage(id,gen,num,numInGen,len,rec);
	}


	
	static int sum(int[] a){
		int ret=0;
		for(int i=0;i<a.length;i++){
			ret+=a[i];
		}
		return ret;
	}
}
package homoStretch;

import java.io.IOException;

public class CousinMarriage {
	int id;
	int gen;
	int num;
	int[] numInGen;
	Person[] person;
	int len;
	double rec;
	
	Person rootPerson=new Person(-1,-1);
	
	
	public CousinMarriage(int id,int gen,int num,int[] numInGen,int len,double rec){
		this.id=id;
		this.gen=gen;
		this.num=num;
		this.numInGen=numInGen;
		this.len=len;
		this.rec=rec;
		
		person=new Person[num];
		int id0=0;int gen0=0;int idInGen0=0;
		int[] hapid0={0,1};
		Person[] parents0 = {rootPerson,rootPerson};
		
		person[0]=new Person(id0,gen0,idInGen0,hapid0,parents0,len);
		//person[0].Print("\t", "\n");
		id0=1;gen0=0;idInGen0=1;
		int[] hapid1={2,3};
		person[1]=new Person(id0,gen0,idInGen0,hapid1,parents0,len);
		//person[1].Print("\t", "\n");
		id0=2;gen0=1;idInGen0=0;
		int[] hapid2={4,5};
		person[2]=new Person(id0,gen0,idInGen0,hapid2,parents0,len);
		//person[2].Print("\t", "\n");
		id0=5;gen0=1;idInGen0=3;
		int[] hapid3={6,7};
		person[5]=new Person(id0,gen0,idInGen0,hapid3,parents0,len);
		//person[5].Print("\t", "\n");
		id0=3;gen0=1;idInGen0=1;
		person[3]=Child(id0,gen0,idInGen0,person[0],person[1],len,rec);
		//person[3].Print("\t", "\n");
		
		id0=4;gen0=1;idInGen0=2;
		person[4]=Child(id0,gen0,idInGen0,person[0],person[1],len,rec);
		//person[4].Print("\t", "\n");
		
		id0=6;gen0=2;idInGen0=0;
		person[6]=Child(id0,gen0,idInGen0,person[2],person[3],len,rec);
		//person[6].Print("\t", "\n");
		
		id0=7;gen0=2;idInGen0=1;
		person[7]=Child(id0,gen0,idInGen0,person[4],person[5],len,rec);
		//person[7].Print("\t", "\n");
		
		for(int i=0;i<numInGen[3];i++){
			id0=8+i;gen0=3;idInGen0=i;
			person[id0]=Child(id0,gen0,idInGen0,person[6],person[7],len,rec);
			//person[id0].Print("\t", "\n");
			person[id0].PrintDiplotype(len);
		}
	}
	
	static Person Child(int id,int gen,int idInGen,Person p1,Person p2,int len,double rec){
		Person[] prnt={p1,p2};
		
		
		int ch=0;
		double rand=Math.random();
		if(rand>0.5){
			ch=1;
		}
		BinarySearchTreeHaplotype tree=new BinarySearchTreeHaplotype();
		int preloc=-1;
		for(int i=0;i<len-1;i++){
			rand=Math.random();
			if(rand<1/rec){
				//System.out.println("rec1\t"+i);
				ch++;
				if(ch==2){
					ch=0;
				}
				p1.haptree[ch].ExtractAndAddNode((double)preloc, (double)i, tree);
				
				preloc=i;
			}
			
		}
		ch++;
		if(ch==2){
			ch=0;
		}
		p1.haptree[ch].ExtractAndAddNode((double)preloc, (double)len-1, tree);
		//System.out.println("===========");
		ch=0;
		rand=Math.random();
		if(rand>0.5){
			ch=1;
		}
		BinarySearchTreeHaplotype tree2=new BinarySearchTreeHaplotype();
		preloc=-1;
		for(int i=0;i<len-1;i++){
			rand=Math.random();
			if(rand<1/rec){
				//System.out.println("rec2\t"+i);
				ch++;
				if(ch==2){
					ch=0;
				}
				p2.haptree[ch].ExtractAndAddNode((double)preloc, (double)i, tree2);
				
				preloc=i;
			}
			
		}
		ch++;
		if(ch==2){
			ch=0;
		}
		p2.haptree[ch].ExtractAndAddNode((double)preloc, (double)len-1, tree2);

		Person ret = new Person(id,gen,idInGen,tree,tree2,prnt);
		ret.diplotree=BinarySearchTreeHaplotype.MakeDiplotype(ret.haptree[0],ret.haptree[1], len);
		//ret.PrintDiplotype(len);
		return ret;
	}
	
	
	
	public static void main(String[] args) throws IOException{
		/*
		 * Make Cousin Marriage with "k" offsprings from cousin-pair
		 */
		int id=0;
		int gen=4;
		int numK=1;
		int[] numInGen={2,4,2,numK};
		int num=sum(numInGen);
		int len=1000000;
		double rec=1000;
		CousinMarriage f=new CousinMarriage(id,gen,num,numInGen,len,rec);
	}


	
	static int sum(int[] a){
		int ret=0;
		for(int i=0;i<a.length;i++){
			ret+=a[i];
		}
		return ret;
	}
}

package homoStretch;



public class Person {

public int id;
public int gen;
public int idInGen;
//public int seq;
public BinarySearchTreeHaplotype
haptree;
public BinarySearchTreeHaplotype diplotree;
public Person parents;
public Person
children;

public int diplotypeList;

public void PrintDiplotype(int len){
//int ret=new int[diplotree.numNode][3];
//int counter=0;

System.out.println("DDDDDDDDDDDDDDDDDDD");

int tmp={haptree[0].searchNode(len-1).base,
haptree[1].searchNode(len-1).base};

diplotree.PrintDiplotype(tmp);
System.out.println("DDDDDDDDDDDDDDDDDDD");
/*
double
tmpanswer= diplotree.GetInfoNode();

System.out.println("$$$$$$$$$$$$");
for(int i=0;i hapid,Person parents_,int len){
id=id_;
gen=gen_;
idInGen=idInGen_;
//seq =StatUtilsX.MiscUtilX.DeepCopyInt3(seq);
haptree = new BinarySearchTreeHaplotype[2];
haptree[0]=new BinarySearchTreeHaplotype();
haptree[1]=new BinarySearchTreeHaplotype();
haptree[0].insertNode((double)len-1,hapid[0]);
haptree[1].insertNode((double)len-1,hapid[1]);
parents=new Person[2];
parents[0]=parents_[0];
parents[1]=parents_[1];
diplotree = BinarySearchTreeHaplotype.MakeDiplotype(haptree[0],haptree[1], len);
//PrintDiplotype(len);
}
public Person(int id_,int gen_,int idInGen_,BinarySearchTreeHaplotype tr1,BinarySearchTreeHaplotype tr2, Person
parents_){
id=id_;
gen=gen_;
idInGen=idInGen_;
//seq =StatUtilsX.MiscUtilX.DeepCopyInt3(seq);
haptree = new BinarySearchTreeHaplotype[2];
haptree[0]=tr1;
haptree[1]=tr2;
parents=new Person[2];
parents[0]=parents_[0];
parents[1]=parents_[1];
//diplotree = haptree[0].MakeDiplotype(haptree[1], len);
//Diplotype(len);
}
public Person(int id,int gen){
//rootPerson
this.id=id;
this.gen=gen;
}
public void Print(String sep1,String sep2){
System.out.print(String(sep1,sep2));
System.out.print("hap1"+sep2);
System.out.print("numRec"+sep1+haptree[0].numNode+sep2);
System.out.print("########"+sep2);
haptree[0].printNode();
System.out.print("hap2"+sep2);
System.out.print("numRec"+sep1+haptree[1].numNode+sep2);
System.out.print("########"+sep2);
haptree[1].printNode();
System.out.println();
System.out.print("diplotree"+sep2);
diplotree.printNode();
}
public String String(String sep1,String sep2){
String ret="---------------"+sep2;
ret+=id+sep2;
ret+=gen+sep2;
ret+=idInGen+sep2;


return ret;
}


}

  • 旧版
package homoStretch;

import java.io.IOException;

public class CousinMarriage {
	int id;
	int gen;
	int num;
	int[] numInGen;
	Person[] person;
	int len;
	double rec;
	
	Person rootPerson=new Person(-1,-1);
	
	
	public CousinMarriage(int id,int gen,int num,int[] numInGen,int len,double rec){
		this.id=id;
		this.gen=gen;
		this.num=num;
		this.numInGen=numInGen;
		this.len=len;
		this.rec=rec;
		
		person=new Person[num];
		int id0=0;int gen0=0;int idInGen0=0;
		int[] hapid0={0,1};
		Person[] parents0 = {rootPerson,rootPerson};
		
		person[0]=new Person(id0,gen0,idInGen0,hapid0,parents0,len);
		//person[0].Print("\t", "\n");
		id0=1;gen0=0;idInGen0=1;
		int[] hapid1={2,3};
		person[1]=new Person(id0,gen0,idInGen0,hapid1,parents0,len);
		//person[1].Print("\t", "\n");
		id0=2;gen0=1;idInGen0=0;
		int[] hapid2={4,5};
		person[2]=new Person(id0,gen0,idInGen0,hapid2,parents0,len);
		//person[2].Print("\t", "\n");
		id0=5;gen0=1;idInGen0=3;
		int[] hapid3={6,7};
		person[5]=new Person(id0,gen0,idInGen0,hapid3,parents0,len);
		//person[5].Print("\t", "\n");
		id0=3;gen0=1;idInGen0=1;
		person[3]=Child(id0,gen0,idInGen0,person[0],person[1],len,rec);
		//person[3].Print("\t", "\n");
		
		id0=4;gen0=1;idInGen0=2;
		person[4]=Child(id0,gen0,idInGen0,person[0],person[1],len,rec);
		//person[4].Print("\t", "\n");
		
		id0=6;gen0=2;idInGen0=0;
		person[6]=Child(id0,gen0,idInGen0,person[2],person[3],len,rec);
		//person[6].Print("\t", "\n");
		
		id0=7;gen0=2;idInGen0=1;
		person[7]=Child(id0,gen0,idInGen0,person[4],person[5],len,rec);
		//person[7].Print("\t", "\n");
		
		for(int i=0;i<numInGen[3];i++){
			id0=8+i;gen0=3;idInGen0=i;
			person[id0]=Child(id0,gen0,idInGen0,person[6],person[7],len,rec);
			//person[id0].Print("\t", "\n");
			person[id0].PrintDiplotype(len);
		}
	}
	
	static Person Child(int id,int gen,int idInGen,Person p1,Person p2,int len,double rec){
		Person[] prnt={p1,p2};
		
		
		int ch=0;
		double rand=Math.random();
		if(rand>0.5){
			ch=1;
		}
		BinarySearchTreeHaplotype tree=new BinarySearchTreeHaplotype();
		int preloc=-1;
		for(int i=0;i<len-1;i++){
			rand=Math.random();
			if(rand<1/rec){
				//System.out.println("rec1\t"+i);
				ch++;
				if(ch==2){
					ch=0;
				}
				p1.haptree[ch].ExtractAndAddNode((double)preloc, (double)i, tree);
				
				preloc=i;
			}
			
		}
		ch++;
		if(ch==2){
			ch=0;
		}
		p1.haptree[ch].ExtractAndAddNode((double)preloc, (double)len-1, tree);
		//System.out.println("===========");
		ch=0;
		rand=Math.random();
		if(rand>0.5){
			ch=1;
		}
		BinarySearchTreeHaplotype tree2=new BinarySearchTreeHaplotype();
		preloc=-1;
		for(int i=0;i<len-1;i++){
			rand=Math.random();
			if(rand<1/rec){
				//System.out.println("rec2\t"+i);
				ch++;
				if(ch==2){
					ch=0;
				}
				p2.haptree[ch].ExtractAndAddNode((double)preloc, (double)i, tree2);
				
				preloc=i;
			}
			
		}
		ch++;
		if(ch==2){
			ch=0;
		}
		p2.haptree[ch].ExtractAndAddNode((double)preloc, (double)len-1, tree2);

		Person ret = new Person(id,gen,idInGen,tree,tree2,prnt);
		ret.diplotree=BinarySearchTreeHaplotype.MakeDiplotype(ret.haptree[0],ret.haptree[1], len);
		//ret.PrintDiplotype(len);
		return ret;
	}
	
	
	
	public static void main(String[] args) throws IOException{
		/*
		 * Make Cousin Marriage with "k" offsprings from cousin-pair
		 */
		int id=0;
		int gen=4;
		int numK=1;
		int[] numInGen={2,4,2,numK};
		int num=sum(numInGen);
		int len=1000000;
		double rec=1000;
		CousinMarriage f=new CousinMarriage(id,gen,num,numInGen,len,rec);
	}


	
	static int sum(int[] a){
		int ret=0;
		for(int i=0;i<a.length;i++){
			ret+=a[i];
		}
		return ret;
	}
}