Mercurial > repos > nick > duplex
diff mafft/core/restoreu.c @ 18:e4d75f9efb90 draft
planemo upload commit b'4303231da9e48b2719b4429a29b72421d24310f4\n'-dirty
author | nick |
---|---|
date | Thu, 02 Feb 2017 18:44:31 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mafft/core/restoreu.c Thu Feb 02 18:44:31 2017 -0500 @@ -0,0 +1,260 @@ +#include "mltaln.h" + +#define DEBUG 0 + +char *alignmentfile; + +static void fillorichar( int nseq, int *oripos, char **a, char **s ) +{ + int i; + char *pta, *pts; + for( i=0; i<nseq; i++ ) + { + pta = a[i]; + pts = s[oripos[i]]; + while( *pta ) + { + if( *pta != '-' ) *pta = *pts++; + if( *pta++ == 0 ) + { + fprintf( stderr, "ERROR!!\n" ); + fprintf( stderr, "alignment is inconsistent with the original sequences\n" ); + exit( 1 ); + } + } + if( *pts != 0 ) + { + fprintf( stderr, "ERROR!!\n" ); + fprintf( stderr, "alignment is inconsistent with the original sequences\n" ); + exit( 1 ); + } + } +} + +void arguments( int argc, char *argv[] ) +{ + int c; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + --argc; + goto nextoption; + case 'a': + alignmentfile = *++argv; + --argc; + goto nextoption; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + + + +int main( int argc, char *argv[] ) +{ + FILE *infp; + FILE *alfp; + char **name; + char **aname; + char **oname; + char **seq; + char **aseq; + int *nlen; + int *oripos; + char *npt, *npt0, *npt2, *pt, *pt2; + int i, o, prelen; + int nlenmin; + int njobs, njoba; + + arguments( argc, argv ); + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + + if( alignmentfile ) + { + alfp = fopen( alignmentfile, "r" ); + if( !alfp ) + { + fprintf( stderr, "Cannot open %s\n", alignmentfile ); + exit( 1 ); + } + } + else + { + fprintf( stderr, "No alignment is given.\n" ); + exit( 1 ); + } + + dorp = NOTSPECIFIED; + getnumlen_casepreserve( infp, &nlenmin ); + njobs = njob; +// fprintf( stderr, "in infp, %d x %d - %d %c\n", njob, nlenmin, nlenmax, dorp ); + + seq = AllocateCharMtx( njob, nlenmax+1 ); + name = AllocateCharMtx( njob, B+1 ); + nlen = AllocateIntVec( njob ); + oripos = AllocateIntVec( njob ); + readData_pointer_casepreserve( infp, name, nlen, seq ); + + dorp = NOTSPECIFIED; + getnumlen( alfp ); + njoba = njob; +// fprintf( stderr, "in alfp, %d x %d %c\n", njob, nlenmax, dorp ); + aseq = AllocateCharMtx( njob, nlenmax+1 ); + aname = AllocateCharMtx( njob, B+1 ); + oname = AllocateCharMtx( njob, B+1 ); + readData_pointer( alfp, aname, nlen, aseq ); + + for( i=0; i<njob; i++ ) gappick_samestring( seq[i] ); + + if( njoba != njobs ) + { + fprintf( stderr, "ERROR!!\n" ); + fprintf( stderr, "In input file,\n" ); + fprintf( stderr, "njob = %d\n", njobs ); + fprintf( stderr, "but in alignment file,\n" ); + fprintf( stderr, "njob = %d\n", njoba ); + exit( 1 ); + } + + for( i=0; i<njob; i++ ) + { +#if 0 + if( strstr( aname[i], "_seed_" ) ) + { + npt2 = aname[i] + 7; + strcpy( oname[i], "=_seed_" ); + } + else + { + npt2 = aname[i] + 1; + strcpy( oname[i], "=" ); + } + + fprintf( stderr, "npt2 = %s\n", npt2 ); + + o = oripos[i] = atoi( npt2 ); + npt = strstr( npt2, "_oe_" ); + if( npt == NULL ) + { + fprintf( stderr, "Format error!\n" ); + exit( 1 ); + } + npt += 4; + strcat( oname[i], npt+1 ); +#endif + npt0 = strstr( aname[i], "_os_" ); + if( npt0 == NULL ) + { + fprintf( stderr, "Format error!\n" ); + exit( 1 ); + } + npt2 = npt0 + 4; + o = oripos[i] = atoi( npt2 ); + + npt = strstr( aname[i], "_oe_" ); + if( npt == NULL ) + { + fprintf( stderr, "Format error!\n" ); + exit( 1 ); + } + npt += 4; + + pt2 = npt; + pt = npt2 - 4; + while( *pt ) *pt++ = *pt2++; // okashii + + prelen = npt0-aname[i]; + strncpy( oname[i], aname[i], prelen ); oname[i][prelen] = 0; + strcat( oname[i], npt0 ); + +#if 0 + pt = strstr( aname[i], "_numo_e" ); + if( pt ) pt += 8; + else pt = aname[i] + 1; + + if( strstr( pt, "_seed_" ) ) pt += 6; + + fprintf( stderr, "pt = :%s:\n", pt ); + +#endif +// fprintf( stderr, "npt0 = :%s:\n", npt0 ); +// +// reporterr( "oname[i] = %s\n", oname[i] ); +// reporterr( "aname[i] = %s\n", aname[i] ); +// reporterr( " name[i] = %s\n", name[i] ); + +// fprintf( stderr, "aname[i] = :%s:\n", aname[i] ); +// fprintf( stderr, "pt = :%s:\n", pt ); +// fprintf( stderr, "oname[i] = :%s:\n", oname[i] ); +// fprintf( stderr, "name[o] = :%s:\n", name[o] ); + + if( strncmp( npt0, name[o]+1, 10 ) ) + { + fprintf( stderr, "ERROR!!\n" ); + fprintf( stderr, "In input file,\n" ); + fprintf( stderr, "name[%d] = %s\n", o, name[o] ); + fprintf( stderr, "but in alignment file,\n" ); + fprintf( stderr, "oname[%d] = %s\n", i, oname[i] ); + fprintf( stderr, "npt0 = %s\n", npt0 ); + fprintf( stderr, "prelen = %d\n", prelen ); + fprintf( stderr, "name[%d] = %s\n", i, aname[i] ); + exit( 1 ); + } +#if 0 + else + { + fprintf( stderr, "OK!!\n" ); + fprintf( stderr, "In input file,\n" ); + fprintf( stderr, "name[%d] = %s\n", o, name[o] ); + fprintf( stderr, "and in alignment file,\n" ); + fprintf( stderr, "name[%d] = %s\n", i, aname[i] ); + fprintf( stderr, "\n" ); + } +#endif + } +// fprintf( stderr, "seq[0] = %s\n", seq[0] ); +// fprintf( stderr, "aseq[0] = %s\n", aseq[0] ); + + fillorichar( njob, oripos, aseq, seq ); + + + writeData_pointer( stdout, njob, oname, nlen, aseq ); + + FreeCharMtx( seq ); + FreeCharMtx( aseq ); + FreeCharMtx( name ); + FreeCharMtx( aname ); + FreeCharMtx( oname ); + free( nlen ); + free( oripos ); + + return( 0 ); +}