/* sintaxe: <executável> <arquivo de entrada> 
Serão gerados:
Arquivo de saída 1 => <arquivo de entrada>1.out => 1000 a 3000 fragmentos de tamanho entre 300 e 700 bases
Arquivo de saída 2 => <arquivo de entrada>2.out => 1000 a 3000 fragmentos de tamanho entre 300 e 500 bases
Arquivo de saída 3 => <arquivo de entrada>3.out => 1000 a 3000 fragmentos de tamanho entre 500 e 700 bases
Arquivo de saída 4 => <arquivo de entrada>4.out => 1000 fragmentos de tamanho entre 300 e 700 bases 
Arquivo de saída 5 => <arquivo de entrada>5.out => 3000 fragmentos de tamanho entre 300 e 700 bases
Arquivo de saída "final" => <arquivo de entrada>.final =>posições finais dos fragmentos mais à direita de cada arquivo.
Cada arquivo possui, para cada sequencia(fragmento), um cabeçalho indicando o número da seq. no arquivo, a posição inicial 
do fragmento na seq original e o tamanho do fragmento.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX 270000
#define LOCAL "c:\\temp\\"

FILE *in, *out1, *out2, *out3, *out4, *out5, *final, *qual1, *qual2, *qual3, *qual4, *qual5;

/*
int main(int argc, char *argv[])
{
	register int i, j;
	int var, num_frag, tam_frag, tam_frag_final, max=0, qualidade, atingiu_fim;
	int inicio,tam;
	char nome[20]="", concatenada[MAX]="";
	char seq[52];
	
	if(argc!=2)
	{
		printf("Erro de sintaxe! \n Sintaxe correta: <executavel> <arquivo de entrada>");
		return 1;
	}

	strcpy(nome,argv[1]);	
	if(!(in=fopen(nome,"r")))  //abre arquivo de entrada
	{
		printf("\nErro na abertura do arquivo de entrada");
		return 1;
	}
	
	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(out1=fopen(strcat(nome,"1"),"w"))) //abre arquivo de saída 1
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(out2=fopen(strcat(nome,"2"),"w"))) //abre arquivo de saída 2
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(out3=fopen(strcat(nome,"3"),"w"))) //abre arquivo de saída 3
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(out4=fopen(strcat(nome,"4"),"w"))) //abre arquivo de saída 4
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(out5=fopen(strcat(nome,"5"),"w"))) //abre arquivo de saída 5
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		return 1;
	}
	
	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(final=fopen(strcat(nome,".final"),"w"))) //abre arquivo de saída 6
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		return 1;
	}
	
	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(qual1=fopen(strcat(nome,"1.qual"),"w"))) //abre arquivo de saida qual1
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		return 1;
	}
	
	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(qual2=fopen(strcat(nome,"2.qual"),"w"))) //abre arquivo de saida qual2
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(qual3=fopen(strcat(nome,"3.qual"),"w"))) //abre arquivo de saida qual3
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		fclose(qual2);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(qual4=fopen(strcat(nome,"4.qual"),"w"))) //abre arquivo de saida qual4
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		fclose(qual2);
		fclose(qual3);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,argv[1]);
	if(!(qual5=fopen(strcat(nome,"5.qual"),"w"))) //abre arquivo de saida qual5
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		fclose(qual2);
		fclose(qual3);
		fclose(qual4);
		return 1;
	}

*/int main()
{
	register int i, j;
	int var, num_frag, tam_frag, tam_frag_final, max=0, qualidade, atingiu_fim;
	int inicio,tam;
	char nome[20]="", concatenada[MAX]="";
	char seq[52];
	

	if(!(in=fopen("h:\\bioinfo\\debug\\chr.1.seq","r")))  //abre arquivo de entrada
	{
		printf("\nErro na abertura do arquivo de entrada");
		return 1;
	}
	

	strcpy (nome,LOCAL);
	strcat(nome,"out1.out");
	if(!(out1=fopen(nome,"w"))) //abre arquivo de saída 1
	{
		printf("\nErro na abertura do arquivo de saída 1");
		fclose(in);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,"out2.out");
	if(!(out2=fopen(nome,"w"))) //abre arquivo de saída 2
	{
		printf("\nErro na abertura do arquivo de saída 2");
		fclose(in);
		fclose(out1);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,"out3.out");
	if(!(out3=fopen(nome,"w"))) //abre arquivo de saída 3
	{
		printf("\nErro na abertura do arquivo de saída 3");
		fclose(in);
		fclose(out1);
		fclose(out2);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,"out4.out");
	if(!(out4=fopen(nome,"w"))) //abre arquivo de saída 4
	{
		printf("\nErro na abertura do arquivo de saída 4");
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,"out5.out");
	if(!(out5=fopen(nome,"w"))) //abre arquivo de saída 5
	{
		printf("\nErro na abertura do arquivo de saída 5");
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		return 1;
	}
	
	strcpy (nome,LOCAL);
	strcat(nome,"final.out");
	if(!(final=fopen(nome,"w"))) //abre arquivo de saída 6
	{
		printf("\nErro na abertura do arquivo de saída 6");
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		return 1;
	}


	strcpy (nome,LOCAL);
	strcat(nome,"out");
	if(!(qual1=fopen(strcat(nome,"1.qual"),"w"))) //abre arquivo de saida qual1
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		return 1;
	}
	
	strcpy (nome,LOCAL);
	strcat(nome,"out");
	if(!(qual2=fopen(strcat(nome,"2.qual"),"w"))) //abre arquivo de saida qual2
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,"out");
	if(!(qual3=fopen(strcat(nome,"3.qual"),"w"))) //abre arquivo de saida qual3
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		fclose(qual2);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,"out");
	if(!(qual4=fopen(strcat(nome,"4.qual"),"w"))) //abre arquivo de saida qual4
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		fclose(qual2);
		fclose(qual3);
		return 1;
	}

	strcpy (nome,LOCAL);
	strcat(nome,"out");
	if(!(qual5=fopen(strcat(nome,"5.qual"),"w"))) //abre arquivo de saida qual5
	{
		printf("\nErro na abertura do arquivo de saída %s", nome);
		fclose(in);
		fclose(out1);
		fclose(out2);
		fclose(out3);
		fclose(out4);
		fclose(out5);
		fclose(final);
		fclose(qual1);
		fclose(qual2);
		fclose(qual3);
		fclose(qual4);
		return 1;
	}

	fgets(seq, strlen(seq), in);
	strcpy(seq, "");
	while(!feof(in))  //lê o arquivo FASTA (com 50 caracteres por linha) e concatena  linhas em uma única string
	{
		fscanf(in,"%s",seq);
		strcat(concatenada,seq);
	}
	
	tam = strlen(concatenada); //pega o tamanho da string resultante
	
	//Arquivo de saída 1: 
	num_frag = (1000 + rand()%2001); //escolhe o número de fragmentos entre 1000 e 3000 
	inicio = 0;
	atingiu_fim = 0;
	
	for(i=0;i<num_frag;i++)   
	{
		tam_frag = (300 + rand()%401);  //escolhe o tamanho do fragmento entre 300 e 700
		
		if((inicio + tam_frag)>max && (inicio + tam_frag)<=tam)
			max=inicio + tam_frag;

		if((inicio + tam_frag)>tam)
		{
			var = max = tam;
			tam_frag_final = tam - inicio;
		}
		else
		{
			var = inicio + tam_frag;
			tam_frag_final = tam_frag;
		}
		if((inicio + tam_frag)>tam && (tam - inicio)<300) //impede que sejam acessadas posições já fora da sequência
			i--;
		else
		{
			fprintf(out1,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			fprintf(qual1,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			
			for(j=inicio;j<var;j++)		//imprime o fragmento no arquivo de saída
			{
				fprintf(out1,"%c",concatenada[j]);
				if (j - inicio <= 100) {
					qualidade = rand()%15;				
				} else if (var - j <= 100) {
					qualidade = 3 + rand()%12;
				} else {
					qualidade = 40 + rand()%20 - rand()%20;
				}
				fprintf (qual1,"%d ",qualidade);
			}
		
			fprintf(out1,"\n\n");
			fprintf(qual1,"\n\n");
		}
		if (var != tam && !atingiu_fim) 
			inicio = (var - rand()%tam_frag_final);  //escolhe a posição inicial do fragmento
		else 
		{
			inicio = rand()%tam;  
			atingiu_fim = 1;
		}

	}
	
	fprintf(final,"Posição final no cromossomo:\n"); 
	fprintf(final,"Arquivo 1: 1000 a 3000 fragmentos de tamanho entre 300 e 700 bases\nPosicao: %d\n\n",max); 

	//Arquivo de saída 2: 
	
	inicio = 0;
	max=0;
	atingiu_fim = 0;
	for(i=0;i<num_frag;i++)   
	{
		
		tam_frag = (300 + rand()%201);  //escolhe o tamanho do fragmento entre 300 e 500
		if((inicio + tam_frag)>max && (inicio + tam_frag)<=tam)
			max=inicio + tam_frag;

		if((inicio + tam_frag)>tam)
		{
			var = max = tam;
			tam_frag_final = tam - inicio;
		}
		else
		{
			var = inicio + tam_frag;
			tam_frag_final = tam_frag;
		}

		if(inicio+tam_frag>tam && (tam - inicio)<300)
			i--;
		else
		{
			fprintf(out2,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			fprintf(qual2,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			
			for(j=inicio;j<var;j++)		//imprime o fragmento no arquivo de saída
			{
				fprintf(out2,"%c",concatenada[j]);
				if (j - inicio <= 100) {
					qualidade = rand()%15;				
				} else if (var - j <= 100) {
					qualidade = 3 + rand()%12;
				} else {
					qualidade = 40 + rand()%20 - rand()%20;
				}
				fprintf (qual2,"%d ",qualidade);
			}
		
			fprintf(out2,"\n\n");
			fprintf(qual2,"\n\n");
		}
		if (var != tam && !atingiu_fim) 
			inicio = (var - rand()%tam_frag_final);  //escolhe a posição inicial do fragmento
		else 
		{
			inicio = rand()%tam;  
			atingiu_fim = 1;
		}

	}
	fprintf(final,"Arquivo 2: 1000 a 3000 fragmentos de tamanho entre 300 e 500 bases\nPosicao: %d\n\n",max); 
	
	//Arquivo de saída 3: 
	max=0;
	inicio = 0;
	atingiu_fim = 0;
	for(i=0;i<num_frag;i++)   
	{
		
		tam_frag = (500 + rand()%201);  //escolhe o tamanho do fragmento entre 500 e 700
		
		if((inicio + tam_frag)>max && (inicio + tam_frag)<=tam)
			max=inicio + tam_frag;
		if((inicio + tam_frag)>tam)
		{
			var = max = tam;
			tam_frag_final = tam - inicio;
		}
		else
		{
			var = inicio + tam_frag;
			tam_frag_final = tam_frag;
		}
		
		if(inicio+tam_frag>tam && (tam - inicio)<300)
			i--;
		
		else
		{
			fprintf(out3,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			fprintf(qual3,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			
			for(j=inicio;j<var;j++)		//imprime o fragmento no arquivo de saída
			{
				fprintf(out3,"%c",concatenada[j]);
				if (j - inicio <= 100) {
					qualidade = rand()%15;				
				} else if (var - j <= 100) {
					qualidade = 3 + rand()%12;
				} else {
					qualidade = 40 + rand()%20 - rand()%20;
				}
				fprintf (qual3,"%d ",qualidade);
			}
		
			fprintf(out3,"\n\n");
			fprintf(qual3,"\n\n");
		}
		if (var != tam && !atingiu_fim) 
			inicio = (var - rand()%tam_frag_final);  //escolhe a posição inicial do fragmento
		else 
		{
			inicio = rand()%tam;  
			atingiu_fim = 1;
		}
	}
	fprintf(final,"Arquivo 3: 1000 a 3000 fragmentos de tamanho entre 500 e 700 bases\nPosicao: %d\n\n",max); 

	//Arquivo de saída 4:
	
	max=0;
	num_frag=1000; //pega 1000 fragmentos
	inicio = 0;
	atingiu_fim = 0;
	for(i=0;i<num_frag;i++)   
	{
		
		tam_frag = (300 + rand()%401);  //escolhe o tamanho do fragmento entre 300 e 700
		
		if((inicio + tam_frag)>max && (inicio + tam_frag)<=tam)
			max=inicio + tam_frag;
		if((inicio + tam_frag)>tam)
		{
			var = max = tam;
			tam_frag_final = tam - inicio;
		}
		else
		{
			var = inicio + tam_frag;
			tam_frag_final = tam_frag;
		}

		if(inicio+tam_frag>tam && (tam - inicio)<300)
			i--;
		else
		{
			fprintf(out4,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			fprintf(qual4,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			
			for(j=inicio;j<var;j++)		//imprime o fragmento no arquivo de saída
			{
				fprintf(out4,"%c",concatenada[j]);
				if (j - inicio <= 100) {
					qualidade = rand()%15;				
				} else if (var - j <= 100) {
					qualidade = 3 + rand()%12;
				} else {
					qualidade = 40 + rand()%20 - rand()%20;
				}
				fprintf (qual4,"%d ",qualidade);
			}
		
			fprintf(out4,"\n\n");
			fprintf(qual4,"\n\n");
		}
		if (var != tam && !atingiu_fim) 
			inicio = (var - rand()%tam_frag_final);  //escolhe a posição inicial do fragmento
		else 
		{
			inicio = rand()%tam;  
			atingiu_fim = 1;
		}

	}
	fprintf(final,"Arquivo 4: 1000 fragmentos de tamanho entre 300 e 700 bases\nPosicao: %d\n\n",max); 


	//Arquivo de saída 5:
	
	max=0;
	num_frag=5000; //pega 3000 fragmentos
	inicio = 0;
	atingiu_fim = 0;
	for(i=0;i<num_frag;i++)   
	{
		
		tam_frag = (300 + rand()%401);  //escolhe o tamanho do fragmento entre 300 e 700
		if((inicio + tam_frag)>max && (inicio + tam_frag)<=tam)
			max=inicio + tam_frag;
		
		if((inicio + tam_frag)>tam)
		{
			var = max = tam;
			tam_frag_final = tam - inicio;
		}
		else
		{
			var = inicio + tam_frag;
			tam_frag_final = tam_frag;
		}

		if(inicio+tam_frag>tam && (tam - inicio)<300)
			i--;
		else
		{
			fprintf(out5,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			fprintf(qual5,">chrm1_leish_%d %d %d\n",i,inicio,tam_frag_final);  //cabeçalho do fragmento
			
			for(j=inicio;j<var;j++)		//imprime o fragmento no arquivo de saída
			{
				fprintf(out5,"%c",concatenada[j]);
				if (j - inicio <= 100) {
					qualidade = rand()%15;				
				} else if (var - j <= 100) {
					qualidade = 3 + rand()%12;
				} else {
					qualidade = 40 + rand()%20 - rand()%20;
				}
				fprintf (qual5,"%d ",qualidade);
			}
		
			fprintf(out5,"\n\n");
			fprintf(qual5,"\n\n");
		}
		if (var != tam && !atingiu_fim) 
			inicio = (var - rand()%tam_frag_final);  //escolhe a posição inicial do fragmento
		else 
		{
			inicio = rand()%tam;  
			atingiu_fim = 1;
		}
	}
	fprintf(final,"Arquivo 5: 3000 fragmentos de tamanho entre 300 e 700 bases\nPosicao: %d\n\n",max); 
	
	fclose(in);
	fclose(out1);
	fclose(out2);
	fclose(out3);
	fclose(out4);
	fclose(out5);
	fclose(final);
	fclose(qual1);
	fclose(qual2);
	fclose(qual3);
	fclose(qual4);
	fclose(qual5);

	return 0;
}