public List<PfamToGoMapping> parse() throws IOException {
        final String error = ForesterUtil.isReadableFile( getInputFile() );
        if ( !ForesterUtil.isEmpty( error ) ) {
            throw new IOException( error );
        }
        final BufferedReader br = new BufferedReader( new FileReader( getInputFile() ) );
        String line;
        final List<PfamToGoMapping> mappings = new ArrayList<PfamToGoMapping>();
        int line_number = 0;
        try {
            while ( ( line = br.readLine() ) != null ) {
                line_number++;
                line = line.trim();
                if ( ( line.length() > 0 ) && !line.startsWith( "!" ) ) {
                    final Matcher m = PFAM_TO_GO_PATTERN.matcher( line );
                    if ( !m.matches() ) {
                        throw new IOException( "unexpected format [\"" + line + "\"]" );
                    }
                    if ( m.groupCount() != 2 ) {
                        throw new IOException( "unexpected format [\"" + line + "\"]" );
                    }
                    final String pfam = m.group( 1 );
                    final String go = m.group( 2 );
                    if ( ForesterUtil.isEmpty( pfam ) || ForesterUtil.isEmpty( go ) ) {
                        throw new IOException( "unexpected format [\"" + line + "\"]" );
                    }
                    final PfamToGoMapping map = new PfamToGoMapping( new DomainId( pfam ), new GoId( go ) );
                    ++_mapping_count;
                    mappings.add( map );
                }
            } // while ( ( line = br.readLine() ) != null )
        }
        catch ( final Exception e ) {
            throw new IOException( "parsing problem: " + e.getMessage() + " [at line " + line_number + "]" );
        }
        return mappings;
    }