view gecko/src/getCSB.c @ 11:cf4c0c822ca9 draft

Uploaded
author bitlab
date Wed, 18 Nov 2020 08:37:31 +0000
parents 9db88f0f32b7
children
line wrap: on
line source

/* getCSB.c



*/


#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <math.h>

#include "fragmentv3.h"
#include "fragmentv2.h"
#include "lista.h"
#define  MAX_LEVELS  900000

/* Subprograms */

void quickSortX(Fragmentv3 *f, int elements);
void quickSortScore(Fragmentv3 *f, int elements);
void quickSortY(Fragmentv3 *f, int elements, int ytotal);
void reorder( Fragmentv3* f, int nf, int ytotal);

void resetFrags(Fragmentv3* f,int nf);

Lista ordenarXY(Lista *lista,char c);
void ordenarLista(Lista *lista);

int S(Fragmentv3 f); // It returns '1' for 'f' strand and '-1' for 'r' strand;
int C(Fragmentv3 a, Fragmentv3 ci,Fragmentv3 cd, Fragmentv3 s); // Collinearity of ant, current, sig.
int L(Fragmentv3 a, Fragmentv3 c); // Linear of ant and current
int CSB(Lista *lista,Fragmentv3 *frags); // Join all posible CSB. return the number of CSB

int NewList(Lista* lista,Fragmentv3* f,int nf);
void saveCSB(Lista lista,int xtotal,int ytotal);
void saveFragments(Fragmentv3* f,int nf,int xtotal,int ytotal);

/********************/

/* Globals */
//int dist;
//int size;
char** AV;

//int MOSTRAR=1;
//int CONTADOR=0;

// Constantes extensión de gap
int INI=0;
float EXT=3;




int main(int ac,char** av){

	AV=av;
	if(ac<4){
		printf("Use: getCSB fragsv3.fil csb.fv3 csb.txt \n");
		exit(-1);
	}
	/***********************/
	/* General vars */
	int size_of_list;
	//int i;


	/* Read Fragments */
		Fragmentv3* f;
		int nf,xtotal,ytotal;
		f=readFragmentsv3(av[1],&nf,&xtotal,&ytotal);

		
	/* Reset frags */	
	resetFrags(f,nf);
	
	/* Order frags */
	reorder(f,nf,ytotal); 
	
	/* Creates a list */
	Lista lista = NULL;
	size_of_list=NewList(&lista,f,nf);
//+++++++++++++++++++++++++++	
/************ START PROGRAM ***************************************************************/
	int n=1;
	
		
	// Get CSBs
	if(size_of_list>1){
		n=CSB(&lista,f);
	}
	
	
    saveFragments(f,nf,xtotal,ytotal);

return 0;	
}








/*************************/
int NewList(Lista* lista,Fragmentv3* f,int nf){
		int i;
		int size_of_list=0;
		int m;
		m=0;
		for(i=0;i<nf;i++){
			
			if(f[i].block>=0){
				size_of_list++;
				
				f[i].block=i+1;
				f[i].id=i;
				Insertar(lista,m++,f[i],0);
			
			}else{
				f[i].id=-1;
			}
			//printf("%d\t%ld\t%ld\t%ld\t%d\n",i,f[i].id,f[i].score,f[i].length,f[i].block);
			
		}
		return size_of_list;
	}
/***************************************************/
/***************************************************/
void saveFragments(Fragmentv3 *frags,int nf,int xtotal,int ytotal){

FILE* fs;
	if((fs=fopen(AV[2],"wb"))==NULL){
		printf("***ERROR Opening output file %s\n",AV[2]);
		exit(-1);
	}
FILE* ftxt;
	if((ftxt=fopen(AV[3],"w"))==NULL){
		printf("***ERROR Opening output file %s\n",AV[3]);
		exit(-1);
	}
//printf("abierto %s\n",av[4]);
Fragmentv3 fragv3;

	uint64_t xtotal64,ytotal64;
	xtotal64 = xtotal;
	ytotal64 = ytotal;
	fwrite(&xtotal,sizeof(int),1,fs);
	fwrite(&ytotal,sizeof(int),1,fs);
//	fwrite(&xtotal,sizeof(int),1,fs);
//	fwrite(&ytotal,sizeof(int),1,fs);



	
	int i;
	for(i=0;i<nf;i++){
		fragv3=frags[i];
		fwrite(&fragv3,sizeof(Fragmentv3),1,fs);
		fprintf(ftxt,"%ld\t%ld\t%ld\t%ld\t%ld\t%c\t%ld\t%d\n",fragv3.xIni,fragv3.yIni,fragv3.xFin,fragv3.yFin,fragv3.length,fragv3.strand,fragv3.score,fragv3.block);

		
	}
	
	fclose(fs);
	fclose(ftxt);
	
	//getchar();
}
/****************/
void saveCSB(Lista lista,int xtotal,int ytotal){

FILE* fs;
	if((fs=fopen(AV[2],"wb"))==NULL){
		printf("***ERROR Opening output file %s\n",AV[2]);
		exit(-1);
	}
FILE* ftxt;
	if((ftxt=fopen(AV[3],"w"))==NULL){
		printf("***ERROR Opening output file %s\n",AV[3]);
		exit(-1);
	}
//printf("abierto %s\n",av[4]);
Fragmentv3 fragv3;

	uint64_t xtotal64,ytotal64;
	xtotal64 = xtotal;
	ytotal64 = ytotal;
	fwrite(&xtotal,sizeof(int),1,fs);
	fwrite(&ytotal,sizeof(int),1,fs);
//	fwrite(&xtotal,sizeof(int),1,fs);
//	fwrite(&ytotal,sizeof(int),1,fs);


	pNodo nodo;
	nodo=lista;
	printf("-------------------------\n");
	fprintf(ftxt,"xIni\tyIni\txFin\tyFin\tlength\tstrand\tscore\n");
	
	while(nodo && nodo->siguiente){
		fragv3 = nodo->f;
		fwrite(&fragv3,sizeof(Fragmentv3),1,fs);
		fprintf(ftxt,"%ld\t%ld\t%ld\t%ld\t%ld\t%c\t%ld\t%d\n",fragv3.xIni,fragv3.yIni,fragv3.xFin,fragv3.yFin,fragv3.length,fragv3.strand,fragv3.score,fragv3.block);

		nodo= nodo->siguiente;
	}
	
	fclose(fs);
	fclose(ftxt);
	printf("------------FINJ-------------\n");
	//getchar();
}
/***************************************************/
int S(Fragmentv3 f){

	if(f.strand=='f')return 1;
	if(f.strand=='r')return -1;
	return 0;
}
/***************************************************/
int C(Fragmentv3 a, Fragmentv3 ci, Fragmentv3 cd, Fragmentv3 s){

	if( L(a,ci) && L(cd,s) )return 1;
	return 0;
}
/***************************************************/
int L(Fragmentv3 a, Fragmentv3 c){

	int A,C;
	A=a.seqY;
	C=c.seqY;
	if( ( (A-S(a)) == (C-2*S(c)) ) && (S(c) == S(a))  )return 1;
	return 0;
}
/***************************************************/
int CSB(Lista *lista,Fragmentv3 *frags){
	int n=1;


	int penal=0;
	int joined=1;
	
	pNodo nodo; 
	while(joined){
		joined = 0;
		nodo = *lista;
		while(!nodo->anterior)nodo=nodo->siguiente;
		while(nodo->siguiente) {
		
		
		
				if( L(nodo->anterior->f,nodo->f) ){
					
					penal = INI + EXT*(abs( nodo->anterior->f.xFin- nodo->f.xIni)+abs( nodo->anterior->f.yFin- nodo->f.yIni)); 
					//printf("penal:%d\n",penal);
					
					nodo->anterior->f.xFin = nodo->f.xFin;
					nodo->anterior->f.yFin = nodo->f.yFin;
					//nodo->anterior->f.score = nodo->anterior->f.score + nodo->f.score;
					nodo->anterior->f.score = nodo->anterior->f.score + nodo->f.score- penal;
					nodo->anterior->f.length = abs(nodo->anterior->f.yFin - nodo->anterior->f.yIni);
					
					nodo->anterior->f.seqY = nodo->f.seqY;
					nodo->anterior->f.seqX = nodo->f.seqX;
					//nodo->anterior->f.block=n;
					//frags[nodo->f.id].block=n;
					//frags[nodo->anterior->f.id].block=n;
					frags[nodo->f.id].block=frags[nodo->anterior->f.id].block;
					
					
					
					joined = 1;
					Borrar(lista, nodo->valor);
					
				}else{
				
					
					nodo = nodo->siguiente;
					n++;
					
				}
		}
		// Para el ultimo
		if( L(nodo->anterior->f,nodo->f) ){
			penal = INI + EXT*(abs( nodo->anterior->f.xFin- nodo->f.xIni)+abs( nodo->anterior->f.yFin- nodo->f.yIni)); 
			//printf("penal:%d\n",penal);
			
			nodo->anterior->f.xFin = nodo->f.xFin;
			nodo->anterior->f.yFin = nodo->f.yFin;
			//nodo->anterior->f.score = nodo->anterior->f.score + nodo->f.score;
			nodo->anterior->f.score = nodo->anterior->f.score + nodo->f.score- penal;
			nodo->anterior->f.length = abs(nodo->anterior->f.yFin - nodo->anterior->f.yIni);
			
			nodo->anterior->f.seqY = nodo->f.seqY;
			nodo->anterior->f.seqX = nodo->f.seqX;
			
			frags[nodo->f.id].block=frags[nodo->anterior->f.id].block;
					
			joined = 1;	
			Borrar(lista, nodo->valor);
		}
		if(n>=1)ordenarLista(lista);
	}
	return n;
}
/***************************************************/
Lista ordenarXY(Lista *lista,char c){

	Lista nueva=NULL;
	pNodo nodo= *lista;
	nodo = *lista;
/*******************************************/	
/* Primero buscamos el valor menor, para que sea el primero en insertarse */

	int valor=0;
	pNodo primero=nodo;
	
	//while(nodo->anterior)nodo=nodo->anterior;
	if(c=='x'){valor=nodo->f.seqX;primero=nodo;}
	if(c=='y'){valor=nodo->f.seqY;primero=nodo;}
	
	
	while(nodo){
		if(c=='x'){
			if(valor>=nodo->f.seqX && nodo->f.block>=0){
				valor=nodo->f.seqX;
				primero=nodo;
			}
		
		}else{
			if(valor>=nodo->f.seqY && nodo->f.block>=0){
				valor=nodo->f.seqY;
				primero=nodo;
			}
		
		}
		nodo=nodo->siguiente;
	}
//	if(c=='x'){printf("aqui primero->f.seqX: %d valor:%d\n",primero->f.seqX,valor);}
//	if(c=='y'){printf("aqui primero->f.seqY: %d valor:%d\n",primero->f.seqY,valor);}
	

	//Insertamos el primero 
	if(c=='x'){
//		printf("X insertamos en la posicion %d\n",primero->f.seqX);
		Insertar(&nueva,primero->f.seqX,primero->f,primero->n_event);
		Borrar(lista,primero->valor);
	}else{
///		printf("Y insertamos en la posicion %d\n",primero->f.seqY);
		Insertar(&nueva,primero->f.seqY,primero->f,primero->n_event);
//		printf("ya hemos insertado\n");
		Borrar(lista,primero->valor);
	}

/*******************************************/
	
	nodo = *lista;
	while(nodo->anterior)nodo=nodo->anterior;
	while(nodo){
		// Insertarmos en el orden de XY
		if(c=='x'){
			Insertar(&nueva,nodo->f.seqX,nodo->f,nodo->n_event);
		}else{
			Insertar(&nueva,nodo->f.seqY,nodo->f,nodo->n_event);
			
		}
		nodo = nodo->siguiente;
	}

	
	pNodo newNodo = nueva;
	newNodo = nueva;
	int i=0;
	while(newNodo){
		if(c=='x'){
			
			newNodo->f.seqX=i++;
		}else{
			newNodo->f.seqY=i++;
		}
		
		newNodo = newNodo->siguiente;
	}

	return nueva;

	
}
/****************************************/
void reorder( Fragmentv3* f, int nf, int ytotal){
	int i;
	int j;

	/* Sort Y*/
	quickSortY(&f[0],nf,ytotal);
	j=0;
	for(i=0;i<nf;i++){
		if(f[i].block>=0)f[i].seqY=j++;
	}
		

	/* Sort X*/
	quickSortX(&f[0],nf);
	j=0;
	for(i=0;i<nf;i++){
		if(f[i].block>=0)f[i].seqX=j++;
	}
	

}
/******/
void resetFrags(Fragmentv3* f, int nf){
int i;
for(i=0;i<nf;i++){
	f[i].gap=0;

	f[i].events=0;
	f[i].id=i;
	
	f[i].reversions=0;

}

}
/**** Ordenar lista ****/
void ordenarLista(Lista *lista){

			// Ordenamos
			Lista nueva = NULL;
			nueva=ordenarXY(lista,'y');
			BorrarLista(lista);
			*lista=nueva;
			
			
			
			// Ahora por X
			Lista nuevaX = NULL;
			nuevaX=ordenarXY(lista,'x');
			BorrarLista(lista);
			*lista=nuevaX;
}

/****************************************/

//  quickSort
//
//  This public-domain C implementation by Darel Rex Finley.
//
//  * This function assumes it is called with valid parameters.
//
//  * Example calls:
//    quickSort(&myArray[0],5); // sorts elements 0, 1, 2, 3, and 4
//    quickSort(&myArray[3],5); // sorts elements 3, 4, 5, 6, and 7
void quickSortScore(Fragmentv3 *f, int elements) {

  


  int  beg[MAX_LEVELS], end[MAX_LEVELS], i=0, L, R, swap ;
	Fragmentv3 piv;
  beg[0]=0; end[0]=elements;
  while (i>=0) {
    L=beg[i]; R=end[i]-1;
    if (L<R) {
      piv=f[L];
      while (L<R) {
        while (f[R].score>=piv.score && L<R) R--; if (L<R) f[L++]=f[R];
        while (f[L].score<=piv.score && L<R) L++; if (L<R) f[R--]=f[L]; }
      f[L]=piv; beg[i+1]=L+1; end[i+1]=end[i]; end[i++]=L;
      if (end[i]-beg[i]>end[i-1]-beg[i-1]) {
        swap=beg[i]; beg[i]=beg[i-1]; beg[i-1]=swap;
        swap=end[i]; end[i]=end[i-1]; end[i-1]=swap; }}
    else {
      i--; }}}
/*****************/
void quickSortX(Fragmentv3 *f, int elements) {

  


  int  beg[MAX_LEVELS], end[MAX_LEVELS], i=0, L, R, swap ;
	Fragmentv3 piv;
  beg[0]=0; end[0]=elements;
  while (i>=0) {
    L=beg[i]; R=end[i]-1;
    if (L<R) {
      piv=f[L];
      while (L<R) {
        while (f[R].xIni>=piv.xIni && L<R) R--; if (L<R) f[L++]=f[R];
        while (f[L].xIni<=piv.xIni && L<R) L++; if (L<R) f[R--]=f[L]; }
      f[L]=piv; beg[i+1]=L+1; end[i+1]=end[i]; end[i++]=L;
      if (end[i]-beg[i]>end[i-1]-beg[i-1]) {
        swap=beg[i]; beg[i]=beg[i-1]; beg[i-1]=swap;
        swap=end[i]; end[i]=end[i-1]; end[i-1]=swap; }}
    else {
      i--; }}}
/*****************/
void quickSortY(Fragmentv3 *f, int elements,int ytotal) {

	
	
  int  beg[MAX_LEVELS], end[MAX_LEVELS], i=0, L, R, swap ;
	Fragmentv3 piv;
	
/*	
// Change Y component
long ytemp;
	for(i=0;i<elements;i++){
		if(f[i].strand=='r'){
			//f[i].yIni=ytotal-f[i].yIni;
			//f[i].yFin=ytotal-f[i].yFin;

			ytemp=f[i].yIni;
			f[i].yIni=f[i].yFin;
			f[i].yFin=ytemp;	
		}
	}

*/
  beg[0]=0; end[0]=elements;
  while (i>=0) {
    L=beg[i]; R=end[i]-1;
    if (L<R) {
      piv=f[L];
      while (L<R) {
        while (f[R].yIni>=piv.yIni && L<R) R--; if (L<R) f[L++]=f[R];
        while (f[L].yIni<=piv.yIni && L<R) L++; if (L<R) f[R--]=f[L]; }
      f[L]=piv; beg[i+1]=L+1; end[i+1]=end[i]; end[i++]=L;
      if (end[i]-beg[i]>end[i-1]-beg[i-1]) {
        swap=beg[i]; beg[i]=beg[i-1]; beg[i-1]=swap;
        swap=end[i]; end[i]=end[i-1]; end[i-1]=swap; }}
    else {
      i--; }}

// Change Y component
/*
	for(i=0;i<elements;i++){
		if(f[i].strand=='r'){
			ytemp=f[i].yIni;
			f[i].yIni=f[i].yFin;
			f[i].yFin=ytemp;	

			//f[i].yIni=ytotal-f[i].yIni;
			//f[i].yFin=ytotal-f[i].yFin;


		}
	}
*/

}