#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fstream.h>
#include "reduction.h"
#include "hypertree.h"
#include "uniqueness.h"
#include "String.h"

void write_format1(char *prefix, char *filename) {
	char inname[100];
	char hname[100];
	char string1[1000];
	char string2[1000];
	
	int i,j,no,row,column,digit;
	
	FILE *fp,*fp1,*fp2,*fp3,*fp4;
	
	//strcpy(outname,prefix);
	//strncat(outname,".out",4);
	char *outname = "output";
	strcpy(inname,prefix);
	strncat(inname,".1",2);
	
	strcpy(hname,prefix);
	strncat(hname,".1co",4);
	
	fp = fopen(outname,"w");
	fp1 = fopen(filename,"r");
	fp2 = fopen(inname,"r");
	fp3 = fopen("title","r");
	fp4 = fopen(hname,"r");
	
	fscanf(fp2,"%d%d",&row,&column);
	fscanf(fp4,"%d%d",&row,&column);
	
	fprintf(fp,"Output format:\ninput haplotype\ninput haplotype\n\ngenotype\n\noutput haplotype\noutput haplotype\n");
	for(j=0;j<16;j++) 
		fprintf(fp,"-");	
	fprintf(fp,"\n");
				
	while(fscanf(fp1,"%s",string1)!=EOF) {
		fscanf(fp3,"%d",&no);
		fscanf(fp1,"%s",string2);
		
		for(i=0;i<no;i++) {
			fprintf(fp,"%s\n",string1);
			fprintf(fp,"%s\n\n",string2);
				
			for(j=0;j<column;j++) {
				fscanf(fp2,"%d",&digit);
				fprintf(fp,"%d",digit);
			}
			fprintf(fp,"\n\n");
			
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				fprintf(fp,"%d",digit);
			}
			fprintf(fp,"\n");
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				fprintf(fp,"%d",digit);
			}
			fprintf(fp,"\n");
			
			for(j=0;j<column;j++) 
				fprintf(fp,"-");
				
			fprintf(fp,"\n");
		}
	}
	
	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	fclose(fp4);
}

bool check_line(char *line) {
	int len = strlen(line);
	int i;
	for(i=0;i<len;i++) {
		if(line[i]!=' ' || line[i]!='\n')
			return true;
	}
	return false;
}

void write_format2(char *prefix, char *filename) {
	char inname[100];
	char hname[100];
	char string1[1000];
	char string2[1000];
	char title[100];
	int i,j,no,row,column,digit;
	int which = 0;
	FILE *fp,*fp2,*fp3,*fp4;
	
	//strcpy(outname,prefix);
	//strncat(outname,".out",4);
	char *outname = "output";
	
	strcpy(inname,prefix);
	strncat(inname,".1",2);
	
	strcpy(hname,prefix);
	strncat(hname,".1co",4);
	
	fp = fopen(outname,"w");
	//fp1 = fopen(filename,"r");
	fp2 = fopen(inname,"r");
	fp3 = fopen("title","r");
	fp4 = fopen(hname,"r");
	
	ifstream infile(filename);
	fscanf(fp2,"%d%d",&row,&column);
	fscanf(fp4,"%d%d",&row,&column);
	
	fprintf(fp,"Output format:\nlabel\ninput haplotype\ninput haplotype\n\ngenotype\n\noutput haplotype\noutput haplotype\n");
	for(j=0;j<16;j++) 
		fprintf(fp,"-");	
	fprintf(fp,"\n");
	
	while(infile) {
	//while(fscanf(fp1,"%s",title)!=EOF) {
		
		if(which==0) {
			infile.getline(title,1000);
			if(!check_line(title)) {
				which = 0;
				continue;
			}
			which = 1;
		}
		
		if(which==1) {	
			infile.getline(string1,1000);
			if(!check_line(string1)) {
				which = 1;
				continue;
			}
			which = 2;
		}
		
		if(which==2) {	
			infile.getline(string2,1000);
			if(!check_line(string2)) {
				which = 2;
				continue;
			}
			which = 0;
		}
			
		fscanf(fp3,"%d",&no);
		//fscanf(fp1,"%s%s",string1,string2);
		
		for(i=0;i<no;i++) {
			fprintf(fp,"%s\n",title);
			fprintf(fp,"%s\n",string1);
			fprintf(fp,"%s\n\n",string2);
				
			for(j=0;j<column;j++) {
				fscanf(fp2,"%d",&digit);
				fprintf(fp,"%d",digit);
			}
			fprintf(fp,"\n\n");
			
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				fprintf(fp,"%d",digit);
			}
			fprintf(fp,"\n");
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				fprintf(fp,"%d",digit);
			}
			fprintf(fp,"\n");
			
			for(j=0;j<column;j++) 
				fprintf(fp,"-");
				
			fprintf(fp,"\n");
		}
	}
	
	fclose(fp);
	//fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	fclose(fp4);
}

void write_format4(char *prefix, char *filename) {
	char inname[100];
	char hname[100];
	char string1[1000];
	char title[100];
	int j,row,column,digit,erow;
	int which = 0 ;
	FILE *fp,*fp2,*fp4;
	
	//strcpy(outname,prefix);
	//strncat(outname,".out",4);
	char *outname = "output";
	
	strcpy(inname,prefix);
	strncat(inname,".1",2);
	
	strcpy(hname,prefix);
	strncat(hname,".1co",4);
	
	fp = fopen(outname,"w");
	//fp1 = fopen(filename,"r");
	fp2 = fopen(inname,"r");
	fp4 = fopen(hname,"r");
	ifstream infile(filename);
	
	fscanf(fp2,"%d%d",&erow,&column);
	fscanf(fp4,"%d%d",&row,&column);
	
	fprintf(fp,"Output format:\nlabel\ninput genotype\n\noutput haplotype\noutput haplotype\n");
	for(j=0;j<16;j++) 
		fprintf(fp,"-");	
	fprintf(fp,"\n");
	
	//infile.getline(title,1000);
	//while(!check_line(title))
	//	infile.getline(title,1000);
	//printf("line is %s\n",title);
	
	//for(i=0;i<erow;i++) {
	//while(fscanf(fp1,"%s",title)!=EOF) {
	while(infile) {	
		if(which==0) {
			infile.getline(title,1000);
			if(!check_line(title)) {
				which = 0;
				continue;
			}
			which = 1;
		}
		
		if(which==1) {
			infile.getline(string1,1000);
			if(!check_line(string1)) {
				which = 1;
				continue;
			}
			which = 0;
		}
			
		//fscanf(fp1,"%s",string1);
		
		fprintf(fp,"%s\n",title);
		fprintf(fp,"%s\n\n",string1);
			
		for(j=0;j<column;j++) {
			fscanf(fp4,"%d",&digit);
			fprintf(fp,"%d",digit);
		}
		fprintf(fp,"\n");
		for(j=0;j<column;j++) {
			fscanf(fp4,"%d",&digit);
			fprintf(fp,"%d",digit);
		}
		fprintf(fp,"\n");
			
		for(j=0;j<column;j++) 
			fprintf(fp,"-");
				
		fprintf(fp,"\n");
	}
	
	fclose(fp);
	//fclose(fp1);
	fclose(fp2);
	fclose(fp4);
}

void write_format5(char *prefix, char *filename) {
	char inname[100];
	char hname[100];
	char string1[1000];
	char string2[1000];
	char *first,*second;
	int i,j,no,row,column,digit;
	char nucli,newline;
	
	FILE *fp,*fp1,*fp2,*fp3,*fp4;
	
	char *outname = "output";
	strcpy(inname,prefix);
	strncat(inname,".1",2);
	
	strcpy(hname,prefix);
	strncat(hname,".1co",4);
	
	fp = fopen(outname,"w");
	fp1 = fopen(filename,"r");
	fp2 = fopen(inname,"r");
	fp3 = fopen("title","r");
	fp4 = fopen(hname,"r");
	
	fprintf(fp,"Output format:\ninput haplotype\ninput haplotype\n\ngenotype\n\noutput haplotype\noutput haplotype\n");
	for(j=0;j<16;j++) 
		fprintf(fp,"-");	
	fprintf(fp,"\n");
	
	fscanf(fp2,"%d%d",&row,&column);
	fscanf(fp4,"%d%d",&row,&column);
	
	first = new char[column];
	second = new char[column];
	
	for(i=0;i<column;i++) {
		fscanf(fp3,"%c%c%c",&first[i],&second[i],&newline);
	}
		
	while(fscanf(fp1,"%s",string1)!=EOF) {
		fscanf(fp3,"%d",&no);
		fscanf(fp1,"%s",string2);
		
		for(i=0;i<no;i++) {
			fprintf(fp,"%s\n",string1);
			fprintf(fp,"%s\n\n",string2);
				
			for(j=0;j<column;j++) {
				if(string1[j]==string2[j])
					nucli = string1[j];
				else
					nucli = 'X';
				fprintf(fp,"%c",nucli);
			}
			fprintf(fp,"\n\n");
			
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				if(digit==0)
					nucli = first[j];
				else
					nucli = second[j];
					
				fprintf(fp,"%c",nucli);
			}
			fprintf(fp,"\n");
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				if(digit==0)
					nucli = first[j];
				else
					nucli = second[j];
				fprintf(fp,"%c",nucli);
			}
			fprintf(fp,"\n");
			
			for(j=0;j<column;j++) 
				fprintf(fp,"-");
				
			fprintf(fp,"\n");
		}
	}
	
	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	fclose(fp4);
}

void write_format6(char *prefix, char *filename) {
	char inname[100];
	char hname[100];
	char string1[1000];
	char string2[1000];
	char title[100];
	char *first,*second;
	int i,j,no,row,column,digit;
	char nucli,newline;
	int which = 0;
	FILE *fp,*fp2,*fp3,*fp4;
	
	char *outname = "output";
	strcpy(inname,prefix);
	strncat(inname,".1",2);
	
	strcpy(hname,prefix);
	strncat(hname,".1co",4);
	
	fp = fopen(outname,"w");
	//fp1 = fopen(filename,"r");
	ifstream infile(filename);
	fp2 = fopen(inname,"r");
	fp3 = fopen("title","r");
	fp4 = fopen(hname,"r");
	
	fprintf(fp,"Output format:\nlabel\ninput haplotype\ninput haplotype\n\ngenotype\n\noutput haplotype\noutput haplotype\n");
	for(j=0;j<16;j++) 
		fprintf(fp,"-");	
	fprintf(fp,"\n");
	
	fscanf(fp2,"%d%d",&row,&column);
	fscanf(fp4,"%d%d",&row,&column);
	
	first = new char[column];
	second = new char[column];
	
	for(i=0;i<column;i++) {
		fscanf(fp3,"%c%c%c",&first[i],&second[i],&newline);
	}
	
	while(infile) {	
		if(which==0) {
			infile.getline(title,1000);
			if(!check_line(title)) {
				which = 0;
				continue;
			}
			which = 1;
		}
		
		if(which==1) {	
			infile.getline(string1,1000);
			if(!check_line(string1)) {
				which = 1;
				continue;
			}
			which = 2;
		}
		
		if(which==2) {	
			infile.getline(string2,1000);
			if(!check_line(string2)) {
				which = 2;
				continue;
			}
			which = 0;
		}
		
		
		fscanf(fp3,"%d",&no);
		
		for(i=0;i<no;i++) {
			fprintf(fp,"%s\n",title);
			fprintf(fp,"%s\n",string1);
			fprintf(fp,"%s\n\n",string2);
				
			for(j=0;j<column;j++) {
				if(string1[j]==string2[j])
					nucli = string1[j];
				else
					nucli = 'X';
				fprintf(fp,"%c",nucli);
			}
			fprintf(fp,"\n\n");
			
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				if(digit==0)
					nucli = first[j];
				else
					nucli = second[j];
					
				fprintf(fp,"%c",nucli);
			}
			fprintf(fp,"\n");
			for(j=0;j<column;j++) {
				fscanf(fp4,"%d",&digit);
				if(digit==0)
					nucli = first[j];
				else
					nucli = second[j];
				fprintf(fp,"%c",nucli);
			}
			fprintf(fp,"\n");
			
			for(j=0;j<column;j++) 
				fprintf(fp,"-");
				
			fprintf(fp,"\n");
		}
	}
	
	fclose(fp);
	//fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	fclose(fp4);
}

void write_format7(char *prefix, char *filename) {
	char inname[100];
	char hname[100];
	char string1[1000];
	char string2[1000];
	char string3[1000];
	
	int j,row,column,digit;
	
	FILE *fp,*fp1,*fp4;
	
	//strcpy(outname,prefix);
	//strncat(outname,".out",4);
	char *outname = "output";
	
	strcpy(inname,prefix);
	strncat(inname,".1",2);
	
	strcpy(hname,prefix);
	strncat(hname,"co",4);
	
	fp = fopen(outname,"a");
	fp1 = fopen("hapsav.1","r");
	fp4 = fopen(hname,"r");
	
	//fprintf(fp,"Output format:\ninput haplotype\ninput haplotype\n\ngenotype\n\noutput haplotype\noutput haplotype\n");
	for(j=0;j<16;j++) 
		fprintf(fp,"-");	
	fprintf(fp,"\n");
	
	fscanf(fp1,"%d%d%d",&row,&column,&column);
	fscanf(fp4,"%d%d",&row,&column);
		
	while(fscanf(fp1,"%s",string1)!=EOF) {
		fscanf(fp1,"%s",string2);
		fscanf(fp1,"%s",string3);
		
		fprintf(fp,"%s\n",string2);
		fprintf(fp,"%s\n\n",string3);
		fprintf(fp,"%s\n\n",string1);
				
		for(j=0;j<column;j++) {
			fscanf(fp4,"%d",&digit);
			fprintf(fp,"%d",digit);
		}
		fprintf(fp,"\n");
		for(j=0;j<column;j++) {
			fscanf(fp4,"%d",&digit);
			fprintf(fp,"%d",digit);
		}
		fprintf(fp,"\n");	
		for(j=0;j<column;j++) 
			fprintf(fp,"-");
				
		fprintf(fp,"\n");	
	}
	
	fclose(fp);
	fclose(fp1);
	fclose(fp4);
}

void write_format3(char *prefix, char *filename) {
	char inname[100];
	char hname[100];
	char string1[1000];
	
	int j,row,column,digit;
	
	FILE *fp,*fp1,*fp2,*fp4;
	
	//strcpy(outname,prefix);
	//strncat(outname,".out",4);
	char *outname = "output";
	
	strcpy(inname,prefix);
	strncat(inname,".1",2);
	
	strcpy(hname,prefix);
	strncat(hname,".1co",4);
	
	fp = fopen(outname,"w");
	fp1 = fopen(filename,"r");
	fp2 = fopen(inname,"r");
	
	fp4 = fopen(hname,"r");
	
	fscanf(fp2,"%d%d",&row,&column);
	fscanf(fp4,"%d%d",&row,&column);
	
	fprintf(fp,"Output format:\ninput genotype\n\noutput haplotype\noutput haplotype\n");
	for(j=0;j<16;j++) 
		fprintf(fp,"-");	
	fprintf(fp,"\n");
		
	while(fscanf(fp1,"%s",string1)!=EOF) {
		fprintf(fp,"%s\n\n",string1);
				
			
		for(j=0;j<column;j++) {
			fscanf(fp4,"%d",&digit);
			fprintf(fp,"%d",digit);
		}
		fprintf(fp,"\n");
		for(j=0;j<column;j++) {
			fscanf(fp4,"%d",&digit);
			fprintf(fp,"%d",digit);
		}
		fprintf(fp,"\n");
			
		for(j=0;j<column;j++) 
			fprintf(fp,"-");
				
		fprintf(fp,"\n");
	}
	
	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	fclose(fp4);
}

void write_tree(char *prefix,int is) {
	char treefile[100],temp[100];
	FILE *fp1,*fp2;
	
	//strcpy(outfile,prefix);
	//strncat(outfile,".out",4);
	char *outfile = "output";
	
	strcpy(treefile,prefix);
	strncat(treefile,".1ct",4);
	
	fp1 = fopen(outfile,"a");
	fp2 = fopen(treefile,"r");
	fprintf(fp1,"The tree is:\n");
	
	while(fscanf(fp2,"%s",temp)!=EOF) {
		fprintf(fp1,"%s ",temp);	
	}
	
	fprintf(fp1,"\n\n");

	if(is==0)
		fprintf(fp1,"The tree is not unique\n");
	else
		fprintf(fp1,"The tree is unique\n");
			
	fclose(fp1);
	fclose(fp2);
}

char *put_to_array(char *filename,char *geno,int *r,int *c) {
	FILE *fp;
	int row,column,digit,i;
	fp = fopen(filename,"r");
	
	fscanf(fp,"%d%d",&row,&column);
	geno = new char[row*column+1];
	
	for(i=0;i<row*column;i++) {
		fscanf(fp,"%d",&digit);
		geno[i] = (char)48+digit;
	}
	
	*r = row;
	*c = column;
	
	fclose(fp);
	return geno;
}

int final_value = 0;

int pick_columns(char *geno,int start,int end,int start_pos,int cur_pos,int row,int column) {
	FILE *fp,*fpp;
	int i,j,newpos,check,uu;

	//if(cur_pos==start_pos) {
	//	final_value = cur_pos;
	//	return 1;
	//}

	fp = fopen("rr","w");
	
	fprintf(fp,"%d %d\n",row,cur_pos-start_pos);
	
	for(j=0;j<row;j++) {
		for(i=start_pos;i<cur_pos;i++) {
			fprintf(fp,"%c ",geno[j*column+i]);
		}
		fprintf(fp,"\n");
	}
	
	fclose(fp);
	
	system("check_tree.out rr");
	fpp = fopen("cc","r");
	fscanf(fp,"%d",&check);
	fclose(fpp);
	
	if(check==1) {
		fp = fopen("dd","r");
		fscanf(fp,"%d",&uu);
		fclose(fp);
		
		if(uu==0) {
			check=3;
		} 
	}
		
	if(check==0) {
		//printf("%d %d no tree\n",start_pos,cur_pos);
		
		newpos = (start+cur_pos)/2;
		if(newpos == cur_pos) {
			return 0;
		}else
			return pick_columns(geno,start,cur_pos,start_pos,newpos,row,column);
	} else if(check==3) {
		//printf("%d %d nonunique tree\n",start_pos,cur_pos);
		newpos = (cur_pos+end)/2;
		
		if(newpos == cur_pos) {
			cur_pos = cur_pos - 1;
			if(cur_pos<start_pos)
				return 0;
			return pick_columns(geno,start_pos,cur_pos,start_pos,cur_pos,row,column);
		}
		else
			return pick_columns(geno,cur_pos,end,start_pos,newpos,row,column);		
	} else {
		//printf("%d %d has tree\n",start_pos,cur_pos);
		final_value = cur_pos;
		newpos = (cur_pos+end)/2;
		if(newpos == cur_pos) {
			return 1;
		}
		else
			return pick_columns(geno,cur_pos,end,start_pos,newpos,row,column);
		
	}
}

int different = 0;

void write_output(int *outarray,int row,int column) {
	FILE *fp,*fp1;
	char input[1000];
	int i,j;
	int num_diff = 0;
	
	fp = fopen("output","w");
	fp1 = fopen("hapsav.1","r");
	
	for(i=0;i<row;i++) {
		num_diff = 0;
		fscanf(fp1,"%s",input);
		
		fscanf(fp1,"%s",input);
		fprintf(fp,"%s\n",input);
		fscanf(fp1,"%s",input);
		fprintf(fp,"%s\n\n",input);
		
		for(j=0;j<column;j++) {
			fprintf(fp,"%d",outarray[i*column+j]);			
		}
		fprintf(fp,"\n");
		i++;
		for(j=0;j<column;j++) {
			fprintf(fp,"%d",outarray[i*column+j]);			
		}
		fprintf(fp,"\n");
		
		
		
		for(j=0;j<column;j++) {
			if(input[j]!=(char)outarray[i*column+j]+48)
				num_diff++;
		}
		
		if(num_diff>0) {
			fprintf(fp,"This pair is different from the orignal one and there are %d differences\n",num_diff);
			different++;
		}
					
		for(j=0;j<column;j++) {
			fprintf(fp,"-");			
		}
		
		fprintf(fp,"\n");
	}
	
	fclose(fp);
	fclose(fp1);
}

int *error;

void compare_to_origin(int start, int end, int row, int column, int *outarray) {
	FILE *fp1,*fp2;
	fp1 = fopen("hapsav.1","r");
	fp2 = fopen("rrco","r");
	char *os1 = new char[column+1];
	char *os2 = new char[column+1];
	char *as1 = new char[end-start+1];
	char *as2 = new char[end-start+1];
		
	//printf("%d %d %d\n",start,end,row);
	int i,j,digit;
	
	fscanf(fp2,"%d%d",&digit,&digit);
	int count = 0;
	
	for(i=0;i<row;i++) {
		fscanf(fp1,"%s",os1);
		fscanf(fp1,"%s",os1);
		fscanf(fp1,"%s",os2);
		
		//printf("%s\n%s\n\n",os1,os2);
		for(j=0;j<end-start;j++) {
			fscanf(fp2,"%d",&digit);
			as1[j] = (char)digit+48;	
		}
		
		for(j=0;j<end-start;j++) {
			fscanf(fp2,"%d",&digit);
			as2[j] = (char)digit+48;	
		}
		as1[j]= '\0';
		as2[j]= '\0';
		
		//printf("%s\n%s\n\n",as1,as2);
		int test1 = 1;
		int test2 = 1;
		int k = 0;
		
		for(j=start;j<end;j++) {
			if(as1[k]!=os1[j])
				test1 = 0;
			
			if(as2[k]!=os2[j])
				test2 = 0;
			k++;	
		}
		
		
		if(test1==0 && test2==0) {
			test1 = test2 = 1;
			k = 0;
			for(j=start;j<end;j++) {
				if(as2[k]!=os1[j]) 
					test1 = 0;
				
				if(as1[k]!=os2[j]) 
					test2 = 0;
				
				k++;	
			}
			
			if(test1*test2==0) {
				//printf("Some pairs are not identical\n");
				count++;
				error[i] = 1;
			} 
			
			k = 0;
			for(j=start;j<end;j++) { 
				outarray[2*i*column+j] = (int)as2[k]-48;
				outarray[(2*i+1)*column+j] = (int)as1[k]-48;	
				k++;
			}
			
		} else if(test1*test2==0) {
			//printf("Some pairs are not identical\n");
			count++;
		} else {
			k = 0;
			for(j=start;j<end;j++) { 
				outarray[2*i*column+j] = (int)as1[k]-48;
				outarray[(2*i+1)*column+j] = (int)as2[k]-48;	
				k++;
			}
		}
		
	}
	
	if(count>0)
		printf("There are %d different pairs in this segment\n",count);
		
	fclose(fp1);
	fclose(fp2);
}

void handle_single_column(char *geno,int i,int row,int column,int *outarray) {
	int j;
	FILE *fp1;
	fp1 = fopen("hapsav.1","r");
	
	char *os1 = new char[column+1];
	char *os2 = new char[column+1];
	
	for(j=0;j<row;j++) {
		fscanf(fp1,"%s",os1);
		fscanf(fp1,"%s",os1);
		fscanf(fp1,"%s",os2);
		
		if(geno[j*column+i]!='2') {
			outarray[2*j*column+i] = (int)os1[i]-48;
			outarray[(2*j+1)*column+i] = (int)os2[i]-48;
		} else {
			outarray[2*j*column+i] = 1;
			outarray[(2*j+1)*column+i] = 0;
		}
	}
	fclose(fp1);
}

int main(void) {
	char filename[100];
	char *genfile = "temp";
	char ofile[100];
	FILE *fp;
	int number;
	char command[200];
	char prefix[100];
	char *geno;
	int i,j,row,column;
	
	fp = fopen("output","w");
	fclose(fp);
	int *outarray,type;
	int ll = 0;
	int record[1000];
	
	while(1) {
		printf("Please input the filename: ");
		scanf("%s",filename);
		fp = fopen(filename,"r");
		if(fp == NULL) {
			printf("No such file or directory\n");
			continue;
		}
		fclose(fp);
		
		while(1) {
			printf("Please input the number of the file format: ( Please refer to the file \"FORMAT\" ): ");
			scanf("%d",&number);
			if(number<1 || number>7) {
				printf("Input number must be from 1 to 6\n");
				continue;
			}
			
			printf("Would you like to see (1): the detailed segments starting from each site (2): consecutive and nonoverlapped segments? ");
			scanf("%d",&type);
			
			switch(number) {
				case 1:
					strcpy(command,"perl extract1.pl ");
					break;
				case 2:
					strcpy(command,"perl extract2.pl ");
					break;
				case 3:
					strcpy(command,"perl extract3.pl ");
					break;
				case 4:
					strcpy(command,"perl extract4.pl ");
					break;
				case 5:
					strcpy(command,"perl extract5.pl ");
					break;
				case 6:
					strcpy(command,"perl extract6.pl ");
					break;
				case 7:
					strcpy(command,"perl change01.pl ");
					strncat(command,filename,strlen(filename));
					system(command);
					strcpy(command,"perl extract7.pl ");
					break;
			}
			
			strncat(command,filename,strlen(filename));
			if(number==7)
				strncat(command,"o",1);
			
			strcpy(prefix,genfile);
			
			strncat(command," ",1);
			strncat(command,genfile,strlen(genfile));
			
			system(command);
			
			strcpy(ofile,genfile);
			strncat(ofile,".1",2);
			
			geno = put_to_array(ofile,geno,&row,&column);
			
			outarray = new int[2*row*column];
			error = new int[row];
			
			for(i=0;i<row;i++)
				error[i] = 0;
				
			i=0;
			j=column;
			final_value = 0;
			int uu;
			int start = 0;
			int nnn = 1;
			
			for(i=0;i<column;i++) {
				pick_columns(geno,i,j,i,j,row,column);
				if(final_value<i+1)
					final_value = i+1;
				printf("The range is from %d to %d",i+1,final_value);
				//getchar();
				//getchar();	

				fp = fopen("dd","r");
				fscanf(fp,"%d",&uu);
				//if(uu==1 || (final_value-i-1)==0)
				//	printf(" and the tree is unique");
				//else if(uu==0)
				//	printf(" and the tree is not unique");
				fclose(fp);
				
				if(i+1>start) {
					printf(" (selected)\n");
					
					record[ll] = final_value - i;
					ll++;
					
					if(number!=3 && number!=4) {
						if(final_value-i>1)
							compare_to_origin(i,final_value,row,column,outarray);
						else
							handle_single_column(geno,i,row,column,outarray);
					}
							
					nnn++;
					start = final_value;
					
					if(type!=1)
						i = final_value-1;
				}
				printf("\n");
				
			}
			
			
			write_output(outarray,2*row,column);	
			
			different = 0;
			for(i=0;i<row;i++) {
				if(error[i]==1)
					different++;
			}
			
			if(number!=3 && number!=4) 
				printf("total different pairs are %d out of %d pairs\n",different,row);
			/*
			printf("The segments are: ");
			
			for(i=0;i<ll;i++)
				printf("%d ",record[i]);
				
			printf("\n");
			
			printf("The original segments are: ");
			fp = fopen("position","r");
		
			if(fp==NULL)	{
				printf("Can't open segment file from hudson\n");
			} else {	
			while(fscanf(fp,"%d",&digit)!=EOF) {
				if(digit!=0)
					printf("%d ",digit);
			}
			printf("\n");
			}	
			*/
			break;
		}
		break;
	}
	
	return 1;
}
