in progress...
[jalview.git] / forester / java / src / org / forester / surfacing / SurfacingUtil.java
index e646ba4..3b52234 100644 (file)
@@ -96,6 +96,7 @@ import org.forester.util.CommandLineArguments;
 import org.forester.util.DescriptiveStatistics;
 import org.forester.util.ForesterUtil;
 import org.forester.util.TaxonomyColors;
+import org.forester.util.TaxonomyGroups;
 
 public final class SurfacingUtil {
 
@@ -111,8 +112,9 @@ public final class SurfacingUtil {
                                                                                               .getPerDomainEvalue() ) {
                                                                                           return -1;
                                                                                       }
-                                                                                      else if ( d1.getPerDomainEvalue() > d2
-                                                                                              .getPerDomainEvalue() ) {
+                                                                                      else if ( d1
+                                                                                              .getPerDomainEvalue() > d2
+                                                                                                      .getPerDomainEvalue() ) {
                                                                                           return 1;
                                                                                       }
                                                                                       else {
@@ -175,8 +177,8 @@ public final class SurfacingUtil {
                         break;
                 }
                 final String error = ForesterUtil
-                        .isWritableFile( new File( outdir == null ? pairwise_similarities_output_file_str : outdir
-                                + ForesterUtil.FILE_SEPARATOR + pairwise_similarities_output_file_str ) );
+                        .isWritableFile( new File( outdir == null ? pairwise_similarities_output_file_str
+                                : outdir + ForesterUtil.FILE_SEPARATOR + pairwise_similarities_output_file_str ) );
                 if ( !ForesterUtil.isEmpty( error ) ) {
                     ForesterUtil.fatalError( surfacing.PRG_NAME, error );
                 }
@@ -195,18 +197,19 @@ public final class SurfacingUtil {
         for( final String id : sorted_ids ) {
             for( int c = 0; c < matrix.getNumberOfCharacters(); ++c ) {
                 if ( ( get_gains && ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.GAIN ) )
-                        || ( !get_gains && ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.LOSS ) ) ) {
+                        || ( !get_gains
+                                && ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.LOSS ) ) ) {
                     if ( dc_type == BinaryDomainCombination.DomainCombinationType.DIRECTED_ADJACTANT ) {
                         all_binary_domains_combination_gained.add( AdjactantDirectedBinaryDomainCombination
                                 .obtainInstance( matrix.getCharacter( c ) ) );
                     }
                     else if ( dc_type == BinaryDomainCombination.DomainCombinationType.DIRECTED ) {
-                        all_binary_domains_combination_gained.add( DirectedBinaryDomainCombination
-                                .obtainInstance( matrix.getCharacter( c ) ) );
+                        all_binary_domains_combination_gained
+                                .add( DirectedBinaryDomainCombination.obtainInstance( matrix.getCharacter( c ) ) );
                     }
                     else {
-                        all_binary_domains_combination_gained.add( BasicBinaryDomainCombination.obtainInstance( matrix
-                                .getCharacter( c ) ) );
+                        all_binary_domains_combination_gained
+                                .add( BasicBinaryDomainCombination.obtainInstance( matrix.getCharacter( c ) ) );
                     }
                 }
             }
@@ -214,7 +217,8 @@ public final class SurfacingUtil {
     }
 
     public static Map<String, List<GoId>> createDomainIdToGoIdMap( final List<PfamToGoMapping> pfam_to_go_mappings ) {
-        final Map<String, List<GoId>> domain_id_to_go_ids_map = new HashMap<String, List<GoId>>( pfam_to_go_mappings.size() );
+        final Map<String, List<GoId>> domain_id_to_go_ids_map = new HashMap<String, List<GoId>>( pfam_to_go_mappings
+                .size() );
         for( final PfamToGoMapping pfam_to_go : pfam_to_go_mappings ) {
             if ( !domain_id_to_go_ids_map.containsKey( pfam_to_go.getKey() ) ) {
                 domain_id_to_go_ids_map.put( pfam_to_go.getKey(), new ArrayList<GoId>() );
@@ -238,7 +242,8 @@ public final class SurfacingUtil {
         return map;
     }
 
-    public static Phylogeny createNjTreeBasedOnMatrixToFile( final File nj_tree_outfile, final DistanceMatrix distance ) {
+    public static Phylogeny createNjTreeBasedOnMatrixToFile( final File nj_tree_outfile,
+                                                             final DistanceMatrix distance ) {
         checkForOutputFileWriteability( nj_tree_outfile );
         final NeighborJoining nj = NeighborJoining.createInstance();
         final Phylogeny phylogeny = nj.execute( ( BasicSymmetricalDistanceMatrix ) distance );
@@ -287,61 +292,89 @@ public final class SurfacingUtil {
 
     public static void createSplitWriters( final File out_dir,
                                            final String my_outfile,
-                                           final Map<Character, Writer> split_writers ) throws IOException {
-        split_writers.put( 'a', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_A.html" ) ) );
-        split_writers.put( 'b', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_B.html" ) ) );
-        split_writers.put( 'c', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_C.html" ) ) );
-        split_writers.put( 'd', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_D.html" ) ) );
-        split_writers.put( 'e', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_E.html" ) ) );
-        split_writers.put( 'f', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_F.html" ) ) );
-        split_writers.put( 'g', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_G.html" ) ) );
-        split_writers.put( 'h', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_H.html" ) ) );
-        split_writers.put( 'i', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_I.html" ) ) );
-        split_writers.put( 'j', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_J.html" ) ) );
-        split_writers.put( 'k', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_K.html" ) ) );
-        split_writers.put( 'l', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_L.html" ) ) );
-        split_writers.put( 'm', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_M.html" ) ) );
-        split_writers.put( 'n', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_N.html" ) ) );
-        split_writers.put( 'o', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_O.html" ) ) );
-        split_writers.put( 'p', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_P.html" ) ) );
-        split_writers.put( 'q', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_Q.html" ) ) );
-        split_writers.put( 'r', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_R.html" ) ) );
-        split_writers.put( 's', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_S.html" ) ) );
-        split_writers.put( 't', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_T.html" ) ) );
-        split_writers.put( 'u', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_U.html" ) ) );
-        split_writers.put( 'v', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_V.html" ) ) );
-        split_writers.put( 'w', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_W.html" ) ) );
-        split_writers.put( 'x', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_X.html" ) ) );
-        split_writers.put( 'y', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_Y.html" ) ) );
-        split_writers.put( 'z', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_Z.html" ) ) );
-        split_writers.put( '0', new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
-                + "_domains_0.html" ) ) );
+                                           final Map<Character, Writer> split_writers )
+            throws IOException {
+        split_writers.put( 'a',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_A.html" ) ) );
+        split_writers.put( 'b',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_B.html" ) ) );
+        split_writers.put( 'c',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_C.html" ) ) );
+        split_writers.put( 'd',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_D.html" ) ) );
+        split_writers.put( 'e',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_E.html" ) ) );
+        split_writers.put( 'f',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_F.html" ) ) );
+        split_writers.put( 'g',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_G.html" ) ) );
+        split_writers.put( 'h',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_H.html" ) ) );
+        split_writers.put( 'i',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_I.html" ) ) );
+        split_writers.put( 'j',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_J.html" ) ) );
+        split_writers.put( 'k',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_K.html" ) ) );
+        split_writers.put( 'l',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_L.html" ) ) );
+        split_writers.put( 'm',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_M.html" ) ) );
+        split_writers.put( 'n',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_N.html" ) ) );
+        split_writers.put( 'o',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_O.html" ) ) );
+        split_writers.put( 'p',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_P.html" ) ) );
+        split_writers.put( 'q',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_Q.html" ) ) );
+        split_writers.put( 'r',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_R.html" ) ) );
+        split_writers.put( 's',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_S.html" ) ) );
+        split_writers.put( 't',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_T.html" ) ) );
+        split_writers.put( 'u',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_U.html" ) ) );
+        split_writers.put( 'v',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_V.html" ) ) );
+        split_writers.put( 'w',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_W.html" ) ) );
+        split_writers.put( 'x',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_X.html" ) ) );
+        split_writers.put( 'y',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_Y.html" ) ) );
+        split_writers.put( 'z',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_Z.html" ) ) );
+        split_writers.put( '0',
+                           new BufferedWriter( new FileWriter( out_dir + ForesterUtil.FILE_SEPARATOR + my_outfile
+                                   + "_domains_0.html" ) ) );
     }
 
     public static Map<String, Integer> createTaxCodeToIdMap( final Phylogeny phy ) {
@@ -391,7 +424,8 @@ public final class SurfacingUtil {
                              final Writer out,
                              final String separator,
                              final String limit_to_species,
-                             final Map<String, List<Integer>> average_protein_lengths_by_dc ) throws IOException {
+                             final Map<String, List<Integer>> average_protein_lengths_by_dc )
+            throws IOException {
         for( final Protein protein : proteins ) {
             if ( ForesterUtil.isEmpty( limit_to_species )
                     || protein.getSpecies().getSpeciesId().equalsIgnoreCase( limit_to_species ) ) {
@@ -420,13 +454,13 @@ public final class SurfacingUtil {
                     }
                     out.write( "]" );
                     out.write( separator );
-                    if ( !( ForesterUtil.isEmpty( protein.getDescription() ) || protein.getDescription()
-                            .equals( SurfacingConstants.NONE ) ) ) {
+                    if ( !( ForesterUtil.isEmpty( protein.getDescription() )
+                            || protein.getDescription().equals( SurfacingConstants.NONE ) ) ) {
                         out.write( protein.getDescription() );
                     }
                     out.write( separator );
-                    if ( !( ForesterUtil.isEmpty( protein.getAccession() ) || protein.getAccession()
-                            .equals( SurfacingConstants.NONE ) ) ) {
+                    if ( !( ForesterUtil.isEmpty( protein.getAccession() )
+                            || protein.getAccession().equals( SurfacingConstants.NONE ) ) ) {
                         out.write( protein.getAccession() );
                     }
                     out.write( SurfacingConstants.NL );
@@ -524,7 +558,8 @@ public final class SurfacingUtil {
     public static void executeDomainLengthAnalysis( final String[][] input_file_properties,
                                                     final int number_of_genomes,
                                                     final DomainLengthsTable domain_lengths_table,
-                                                    final File outfile ) throws IOException {
+                                                    final File outfile )
+            throws IOException {
         final DecimalFormat df = new DecimalFormat( "#.00" );
         checkForOutputFileWriteability( outfile );
         final BufferedWriter out = new BufferedWriter( new FileWriter( outfile ) );
@@ -582,21 +617,22 @@ public final class SurfacingUtil {
 
     /**
      * Warning: This side-effects 'all_bin_domain_combinations_encountered'!
-     * 
-     * 
+     *
+     *
      * @param output_file
      * @param all_bin_domain_combinations_changed
      * @param sum_of_all_domains_encountered
      * @param all_bin_domain_combinations_encountered
      * @param is_gains_analysis
-     * @param protein_length_stats_by_dc 
+     * @param protein_length_stats_by_dc
      * @throws IOException
      */
     public static void executeFitchGainsAnalysis( final File output_file,
                                                   final List<BinaryDomainCombination> all_bin_domain_combinations_changed,
                                                   final int sum_of_all_domains_encountered,
                                                   final SortedSet<BinaryDomainCombination> all_bin_domain_combinations_encountered,
-                                                  final boolean is_gains_analysis ) throws IOException {
+                                                  final boolean is_gains_analysis )
+            throws IOException {
         checkForOutputFileWriteability( output_file );
         final Writer out = ForesterUtil.createBufferedWriter( output_file );
         final SortedMap<Object, Integer> bdc_to_counts = ForesterUtil
@@ -659,17 +695,17 @@ public final class SurfacingUtil {
         out.write( "All domains                                                          : "
                 + sum_of_all_domains_encountered );
         out.close();
-        ForesterUtil.programMessage( surfacing.PRG_NAME,
-                                     "Wrote fitch domain combination dynamics counts analysis to \"" + output_file
-                                             + "\"" );
+        ForesterUtil
+                .programMessage( surfacing.PRG_NAME,
+                                 "Wrote fitch domain combination dynamics counts analysis to \"" + output_file + "\"" );
     }
 
     /**
-     * 
-     * @param all_binary_domains_combination_lost_fitch 
-     * @param use_last_in_fitch_parsimony 
-     * @param perform_dc_fich 
-     * @param consider_directedness_and_adjacency_for_bin_combinations 
+     *
+     * @param all_binary_domains_combination_lost_fitch
+     * @param use_last_in_fitch_parsimony
+     * @param perform_dc_fich
+     * @param consider_directedness_and_adjacency_for_bin_combinations
      * @param all_binary_domains_combination_gained if null ignored, otherwise this is to list all binary domain combinations
      * which were gained under unweighted (Fitch) parsimony.
      */
@@ -714,10 +750,12 @@ public final class SurfacingUtil {
         else {
             domain_parsimony.executeDolloParsimonyOnDomainPresence();
         }
-        SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossMatrix(), outfile_name
-                + surfacing.PARSIMONY_OUTPUT_GL_SUFFIX_DOLLO_DOMAINS, Format.FORESTER );
-        SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossCountsMatrix(), outfile_name
-                + surfacing.PARSIMONY_OUTPUT_GL_COUNTS_SUFFIX_DOLLO_DOMAINS, Format.FORESTER );
+        SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossMatrix(),
+                                         outfile_name + surfacing.PARSIMONY_OUTPUT_GL_SUFFIX_DOLLO_DOMAINS,
+                                         Format.FORESTER );
+        SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossCountsMatrix(),
+                                         outfile_name + surfacing.PARSIMONY_OUTPUT_GL_COUNTS_SUFFIX_DOLLO_DOMAINS,
+                                         Format.FORESTER );
         SurfacingUtil.writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
                                                            CharacterStateMatrix.GainLossStates.GAIN,
                                                            outfile_name + surfacing.PARSIMONY_OUTPUT_DOLLO_GAINS_D,
@@ -730,8 +768,12 @@ public final class SurfacingUtil {
                                                            sep,
                                                            ForesterUtil.LINE_SEPARATOR,
                                                            null );
-        SurfacingUtil.writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(), null, outfile_name
-                + surfacing.PARSIMONY_OUTPUT_DOLLO_PRESENT_D, sep, ForesterUtil.LINE_SEPARATOR, null );
+        SurfacingUtil.writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
+                                                           null,
+                                                           outfile_name + surfacing.PARSIMONY_OUTPUT_DOLLO_PRESENT_D,
+                                                           sep,
+                                                           ForesterUtil.LINE_SEPARATOR,
+                                                           null );
         //HTML:
         writeBinaryStatesMatrixToList( domain_id_to_go_ids_map,
                                        go_id_to_term_map,
@@ -765,30 +807,30 @@ public final class SurfacingUtil {
                                        all_pfams_lost_as_domains,
                                        "_dollo_losses_d",
                                        tax_code_to_id_map );
-        //        writeBinaryStatesMatrixToList( domain_id_to_go_ids_map,
-        //                                       go_id_to_term_map,
-        //                                       go_namespace_limit,
-        //                                       false,
-        //                                       domain_parsimony.getGainLossMatrix(),
-        //                                       null,
-        //                                       outfile_name + surfacing.PARSIMONY_OUTPUT_DOLLO_PRESENT_HTML_D,
-        //                                       sep,
-        //                                       ForesterUtil.LINE_SEPARATOR,
-        //                                       "Dollo Parsimony | Present | Domains",
-        //                                       "",
-        //                                       domain_id_to_secondary_features_maps,
-        //                                       all_pfams_encountered,
-        //                                       null,
-        //                                       "_dollo_present_d",
-        //                                       tax_code_to_id_map );
+        writeBinaryStatesMatrixToList( domain_id_to_go_ids_map,
+                                       go_id_to_term_map,
+                                       go_namespace_limit,
+                                       false,
+                                       domain_parsimony.getGainLossMatrix(),
+                                       null,
+                                       outfile_name + surfacing.PARSIMONY_OUTPUT_DOLLO_PRESENT_HTML_D,
+                                       sep,
+                                       ForesterUtil.LINE_SEPARATOR,
+                                       "Dollo Parsimony | Present | Domains",
+                                       "",
+                                       domain_id_to_secondary_features_maps,
+                                       all_pfams_encountered,
+                                       null,
+                                       "_dollo_present_d",
+                                       tax_code_to_id_map );
         preparePhylogeny( local_phylogeny_l,
                           domain_parsimony,
                           date_time,
                           "Dollo parsimony on domain presence/absence",
                           "dollo_on_domains_" + outfile_name,
                           parameters_str );
-        SurfacingUtil.writePhylogenyToFile( local_phylogeny_l, outfile_name
-                + surfacing.DOMAINS_PARSIMONY_TREE_OUTPUT_SUFFIX_DOLLO );
+        SurfacingUtil.writePhylogenyToFile( local_phylogeny_l,
+                                            outfile_name + surfacing.DOMAINS_PARSIMONY_TREE_OUTPUT_SUFFIX_DOLLO );
         try {
             writeAllDomainsChangedOnAllSubtrees( local_phylogeny_l, true, outfile_name, "_dollo_all_gains_d" );
             writeAllDomainsChangedOnAllSubtrees( local_phylogeny_l, false, outfile_name, "_dollo_all_losses_d" );
@@ -803,23 +845,27 @@ public final class SurfacingUtil {
             local_phylogeny_l = phylogeny.copy();
             String randomization = "no";
             if ( radomize_fitch_parsimony ) {
-                domain_parsimony.executeFitchParsimonyOnBinaryDomainCombintion( random_number_seed_for_fitch_parsimony );
+                domain_parsimony
+                        .executeFitchParsimonyOnBinaryDomainCombintion( random_number_seed_for_fitch_parsimony );
                 randomization = "yes, seed = " + random_number_seed_for_fitch_parsimony;
             }
             else {
                 domain_parsimony.executeFitchParsimonyOnBinaryDomainCombintion( use_last_in_fitch_parsimony );
             }
-            SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossMatrix(), outfile_name
-                    + surfacing.PARSIMONY_OUTPUT_GL_SUFFIX_FITCH_BINARY_COMBINATIONS, Format.FORESTER );
-            SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossCountsMatrix(), outfile_name
-                    + surfacing.PARSIMONY_OUTPUT_GL_COUNTS_SUFFIX_FITCH_BINARY_COMBINATIONS, Format.FORESTER );
-            SurfacingUtil
-                    .writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
-                                                          CharacterStateMatrix.GainLossStates.GAIN,
-                                                          outfile_name + surfacing.PARSIMONY_OUTPUT_FITCH_GAINS_BC,
-                                                          sep,
-                                                          ForesterUtil.LINE_SEPARATOR,
-                                                          null );
+            SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossMatrix(),
+                                             outfile_name
+                                                     + surfacing.PARSIMONY_OUTPUT_GL_SUFFIX_FITCH_BINARY_COMBINATIONS,
+                                             Format.FORESTER );
+            SurfacingUtil.writeMatrixToFile( domain_parsimony.getGainLossCountsMatrix(),
+                                             outfile_name
+                                                     + surfacing.PARSIMONY_OUTPUT_GL_COUNTS_SUFFIX_FITCH_BINARY_COMBINATIONS,
+                                             Format.FORESTER );
+            SurfacingUtil.writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
+                                                               CharacterStateMatrix.GainLossStates.GAIN,
+                                                               outfile_name + surfacing.PARSIMONY_OUTPUT_FITCH_GAINS_BC,
+                                                               sep,
+                                                               ForesterUtil.LINE_SEPARATOR,
+                                                               null );
             SurfacingUtil.writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
                                                                CharacterStateMatrix.GainLossStates.LOSS,
                                                                outfile_name
@@ -827,30 +873,30 @@ public final class SurfacingUtil {
                                                                sep,
                                                                ForesterUtil.LINE_SEPARATOR,
                                                                null );
-            SurfacingUtil.writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(), null, outfile_name
-                    + surfacing.PARSIMONY_OUTPUT_FITCH_PRESENT_BC, sep, ForesterUtil.LINE_SEPARATOR, null );
+            SurfacingUtil.writeBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
+                                                               null,
+                                                               outfile_name
+                                                                       + surfacing.PARSIMONY_OUTPUT_FITCH_PRESENT_BC,
+                                                               sep,
+                                                               ForesterUtil.LINE_SEPARATOR,
+                                                               null );
             if ( all_binary_domains_combination_gained_fitch != null ) {
-                collectChangedDomainCombinationsFromBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
-                                                                                    dc_type,
-                                                                                    all_binary_domains_combination_gained_fitch,
-                                                                                    true );
+                collectChangedDomainCombinationsFromBinaryStatesMatrixAsListToFile( domain_parsimony
+                        .getGainLossMatrix(), dc_type, all_binary_domains_combination_gained_fitch, true );
             }
             if ( all_binary_domains_combination_lost_fitch != null ) {
-                collectChangedDomainCombinationsFromBinaryStatesMatrixAsListToFile( domain_parsimony.getGainLossMatrix(),
-                                                                                    dc_type,
-                                                                                    all_binary_domains_combination_lost_fitch,
-                                                                                    false );
+                collectChangedDomainCombinationsFromBinaryStatesMatrixAsListToFile( domain_parsimony
+                        .getGainLossMatrix(), dc_type, all_binary_domains_combination_lost_fitch, false );
             }
             if ( output_binary_domain_combinations_for_graphs ) {
-                SurfacingUtil
-                        .writeBinaryStatesMatrixAsListToFileForBinaryCombinationsForGraphAnalysis( domain_parsimony
-                                                                                                           .getGainLossMatrix(),
-                                                                                                   null,
-                                                                                                   outfile_name
-                                                                                                           + surfacing.PARSIMONY_OUTPUT_FITCH_PRESENT_BC_OUTPUTFILE_SUFFIX_FOR_GRAPH_ANALYSIS,
-                                                                                                   sep,
-                                                                                                   ForesterUtil.LINE_SEPARATOR,
-                                                                                                   BinaryDomainCombination.OutputFormat.DOT );
+                SurfacingUtil.writeBinaryStatesMatrixAsListToFileForBinaryCombinationsForGraphAnalysis( domain_parsimony
+                        .getGainLossMatrix(),
+                                                                                                        null,
+                                                                                                        outfile_name
+                                                                                                                + surfacing.PARSIMONY_OUTPUT_FITCH_PRESENT_BC_OUTPUTFILE_SUFFIX_FOR_GRAPH_ANALYSIS,
+                                                                                                        sep,
+                                                                                                        ForesterUtil.LINE_SEPARATOR,
+                                                                                                        BinaryDomainCombination.OutputFormat.DOT );
             }
             // HTML:
             writeBinaryStatesMatrixToList( domain_id_to_go_ids_map,
@@ -905,11 +951,13 @@ public final class SurfacingUtil {
                                             go_id_to_term_map,
                                             outfile_name,
                                             all_pfams_encountered );
-            writePfamsToFile( outfile_name + surfacing.ALL_PFAMS_GAINED_AS_DOMAINS_SUFFIX, all_pfams_gained_as_domains );
+            writePfamsToFile( outfile_name + surfacing.ALL_PFAMS_GAINED_AS_DOMAINS_SUFFIX,
+                              all_pfams_gained_as_domains );
             writePfamsToFile( outfile_name + surfacing.ALL_PFAMS_LOST_AS_DOMAINS_SUFFIX, all_pfams_lost_as_domains );
             writePfamsToFile( outfile_name + surfacing.ALL_PFAMS_GAINED_AS_DC_SUFFIX,
                               all_pfams_gained_as_dom_combinations );
-            writePfamsToFile( outfile_name + surfacing.ALL_PFAMS_LOST_AS_DC_SUFFIX, all_pfams_lost_as_dom_combinations );
+            writePfamsToFile( outfile_name + surfacing.ALL_PFAMS_LOST_AS_DC_SUFFIX,
+                              all_pfams_lost_as_dom_combinations );
             preparePhylogeny( local_phylogeny_l,
                               domain_parsimony,
                               date_time,
@@ -917,8 +965,10 @@ public final class SurfacingUtil {
                                       + randomization,
                               "fitch_on_binary_domain_combinations_" + outfile_name,
                               parameters_str );
-            SurfacingUtil.writePhylogenyToFile( local_phylogeny_l, outfile_name
-                    + surfacing.BINARY_DOMAIN_COMBINATIONS_PARSIMONY_TREE_OUTPUT_SUFFIX_FITCH );
+            SurfacingUtil
+                    .writePhylogenyToFile( local_phylogeny_l,
+                                           outfile_name
+                                                   + surfacing.BINARY_DOMAIN_COMBINATIONS_PARSIMONY_TREE_OUTPUT_SUFFIX_FITCH );
             calculateIndependentDomainCombinationGains( local_phylogeny_l,
                                                         outfile_name
                                                                 + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_COUNTS_OUTPUT_SUFFIX,
@@ -951,42 +1001,43 @@ public final class SurfacingUtil {
                       phylogeny );
         Phylogeny local_phylogeny_copy = phylogeny.copy();
         secondary_features_parsimony.executeDolloParsimonyOnSecondaryFeatures( mapping_results_map );
-        SurfacingUtil.writeMatrixToFile( secondary_features_parsimony.getGainLossMatrix(), outfile_name
-                + surfacing.PARSIMONY_OUTPUT_GL_SUFFIX_DOLLO_SECONDARY_FEATURES, Format.FORESTER );
-        SurfacingUtil.writeMatrixToFile( secondary_features_parsimony.getGainLossCountsMatrix(), outfile_name
-                + surfacing.PARSIMONY_OUTPUT_GL_COUNTS_SUFFIX_DOLLO_SECONDARY_FEATURES, Format.FORESTER );
-        SurfacingUtil
-                .writeBinaryStatesMatrixAsListToFile( secondary_features_parsimony.getGainLossMatrix(),
-                                                      CharacterStateMatrix.GainLossStates.GAIN,
-                                                      outfile_name
-                                                              + surfacing.PARSIMONY_OUTPUT_DOLLO_GAINS_SECONDARY_FEATURES,
-                                                      sep,
-                                                      ForesterUtil.LINE_SEPARATOR,
-                                                      null );
-        SurfacingUtil
-                .writeBinaryStatesMatrixAsListToFile( secondary_features_parsimony.getGainLossMatrix(),
-                                                      CharacterStateMatrix.GainLossStates.LOSS,
-                                                      outfile_name
-                                                              + surfacing.PARSIMONY_OUTPUT_DOLLO_LOSSES_SECONDARY_FEATURES,
-                                                      sep,
-                                                      ForesterUtil.LINE_SEPARATOR,
-                                                      null );
-        SurfacingUtil
-                .writeBinaryStatesMatrixAsListToFile( secondary_features_parsimony.getGainLossMatrix(),
-                                                      null,
-                                                      outfile_name
-                                                              + surfacing.PARSIMONY_OUTPUT_DOLLO_PRESENT_SECONDARY_FEATURES,
-                                                      sep,
-                                                      ForesterUtil.LINE_SEPARATOR,
-                                                      null );
+        SurfacingUtil.writeMatrixToFile( secondary_features_parsimony.getGainLossMatrix(),
+                                         outfile_name + surfacing.PARSIMONY_OUTPUT_GL_SUFFIX_DOLLO_SECONDARY_FEATURES,
+                                         Format.FORESTER );
+        SurfacingUtil.writeMatrixToFile( secondary_features_parsimony.getGainLossCountsMatrix(),
+                                         outfile_name
+                                                 + surfacing.PARSIMONY_OUTPUT_GL_COUNTS_SUFFIX_DOLLO_SECONDARY_FEATURES,
+                                         Format.FORESTER );
+        SurfacingUtil.writeBinaryStatesMatrixAsListToFile( secondary_features_parsimony.getGainLossMatrix(),
+                                                           CharacterStateMatrix.GainLossStates.GAIN,
+                                                           outfile_name
+                                                                   + surfacing.PARSIMONY_OUTPUT_DOLLO_GAINS_SECONDARY_FEATURES,
+                                                           sep,
+                                                           ForesterUtil.LINE_SEPARATOR,
+                                                           null );
+        SurfacingUtil.writeBinaryStatesMatrixAsListToFile( secondary_features_parsimony.getGainLossMatrix(),
+                                                           CharacterStateMatrix.GainLossStates.LOSS,
+                                                           outfile_name
+                                                                   + surfacing.PARSIMONY_OUTPUT_DOLLO_LOSSES_SECONDARY_FEATURES,
+                                                           sep,
+                                                           ForesterUtil.LINE_SEPARATOR,
+                                                           null );
+        SurfacingUtil.writeBinaryStatesMatrixAsListToFile( secondary_features_parsimony.getGainLossMatrix(),
+                                                           null,
+                                                           outfile_name
+                                                                   + surfacing.PARSIMONY_OUTPUT_DOLLO_PRESENT_SECONDARY_FEATURES,
+                                                           sep,
+                                                           ForesterUtil.LINE_SEPARATOR,
+                                                           null );
         preparePhylogeny( local_phylogeny_copy,
                           secondary_features_parsimony,
                           date_time,
                           "Dollo parsimony on secondary feature presence/absence",
                           "dollo_on_secondary_features_" + outfile_name,
                           parameters_str );
-        SurfacingUtil.writePhylogenyToFile( local_phylogeny_copy, outfile_name
-                + surfacing.SECONDARY_FEATURES_PARSIMONY_TREE_OUTPUT_SUFFIX_DOLLO );
+        SurfacingUtil
+                .writePhylogenyToFile( local_phylogeny_copy,
+                                       outfile_name + surfacing.SECONDARY_FEATURES_PARSIMONY_TREE_OUTPUT_SUFFIX_DOLLO );
         // FITCH DOMAIN COMBINATIONS
         // -------------------------
         local_phylogeny_copy = phylogeny.copy();
@@ -1000,15 +1051,25 @@ public final class SurfacingUtil {
                                   + randomization,
                           "fitch_on_binary_domain_combinations_" + outfile_name,
                           parameters_str );
-        SurfacingUtil.writePhylogenyToFile( local_phylogeny_copy, outfile_name
-                + surfacing.BINARY_DOMAIN_COMBINATIONS_PARSIMONY_TREE_OUTPUT_SUFFIX_FITCH_MAPPED );
-        calculateIndependentDomainCombinationGains( local_phylogeny_copy, outfile_name
-                + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_COUNTS_MAPPED_OUTPUT_SUFFIX, outfile_name
-                + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_DC_MAPPED_OUTPUT_SUFFIX, outfile_name
-                + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_DC_FOR_GO_MAPPING_MAPPED_OUTPUT_SUFFIX, outfile_name
-                + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_DC_FOR_GO_MAPPING_MAPPED_OUTPUT_UNIQUE_SUFFIX, outfile_name
-                + "_MAPPED_indep_dc_gains_fitch_lca_ranks.txt", outfile_name
-                + "_MAPPED_indep_dc_gains_fitch_lca_taxonomies.txt", null, null, null, null );
+        SurfacingUtil
+                .writePhylogenyToFile( local_phylogeny_copy,
+                                       outfile_name
+                                               + surfacing.BINARY_DOMAIN_COMBINATIONS_PARSIMONY_TREE_OUTPUT_SUFFIX_FITCH_MAPPED );
+        calculateIndependentDomainCombinationGains( local_phylogeny_copy,
+                                                    outfile_name
+                                                            + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_COUNTS_MAPPED_OUTPUT_SUFFIX,
+                                                    outfile_name
+                                                            + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_DC_MAPPED_OUTPUT_SUFFIX,
+                                                    outfile_name
+                                                            + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_DC_FOR_GO_MAPPING_MAPPED_OUTPUT_SUFFIX,
+                                                    outfile_name
+                                                            + surfacing.INDEPENDENT_DC_GAINS_FITCH_PARS_DC_FOR_GO_MAPPING_MAPPED_OUTPUT_UNIQUE_SUFFIX,
+                                                    outfile_name + "_MAPPED_indep_dc_gains_fitch_lca_ranks.txt",
+                                                    outfile_name + "_MAPPED_indep_dc_gains_fitch_lca_taxonomies.txt",
+                                                    null,
+                                                    null,
+                                                    null,
+                                                    null );
     }
 
     public static void executePlusMinusAnalysis( final File output_file,
@@ -1053,23 +1114,26 @@ public final class SurfacingUtil {
         catch ( final IOException e ) {
             ForesterUtil.fatalError( surfacing.PRG_NAME, e.getLocalizedMessage() );
         }
-        ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote plus minus domain analysis results to \""
-                + html_out_dom + "\"" );
-        ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote plus minus domain analysis results to \""
-                + plain_out_dom + "\"" );
-        ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote plus minus domain analysis results to \"" + html_out_dc
-                + "\"" );
-        ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote plus minus domain analysis based passing GO ids to \""
-                + passing_domains_go_ids_out_dom + "\"" );
-        ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote plus minus domain analysis based all GO ids to \""
-                + all_domains_go_ids_out_dom + "\"" );
+        ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                     "Wrote plus minus domain analysis results to \"" + html_out_dom + "\"" );
+        ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                     "Wrote plus minus domain analysis results to \"" + plain_out_dom + "\"" );
+        ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                     "Wrote plus minus domain analysis results to \"" + html_out_dc + "\"" );
+        ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                     "Wrote plus minus domain analysis based passing GO ids to \""
+                                             + passing_domains_go_ids_out_dom + "\"" );
+        ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                     "Wrote plus minus domain analysis based all GO ids to \""
+                                             + all_domains_go_ids_out_dom + "\"" );
     }
 
     public static void extractProteinNames( final List<Protein> proteins,
                                             final List<String> query_domain_ids_nc_order,
                                             final Writer out,
                                             final String separator,
-                                            final String limit_to_species ) throws IOException {
+                                            final String limit_to_species )
+            throws IOException {
         for( final Protein protein : proteins ) {
             if ( ForesterUtil.isEmpty( limit_to_species )
                     || protein.getSpecies().getSpeciesId().equalsIgnoreCase( limit_to_species ) ) {
@@ -1098,13 +1162,13 @@ public final class SurfacingUtil {
                     }
                     out.write( "]" );
                     out.write( separator );
-                    if ( !( ForesterUtil.isEmpty( protein.getDescription() ) || protein.getDescription()
-                            .equals( SurfacingConstants.NONE ) ) ) {
+                    if ( !( ForesterUtil.isEmpty( protein.getDescription() )
+                            || protein.getDescription().equals( SurfacingConstants.NONE ) ) ) {
                         out.write( protein.getDescription() );
                     }
                     out.write( separator );
-                    if ( !( ForesterUtil.isEmpty( protein.getAccession() ) || protein.getAccession()
-                            .equals( SurfacingConstants.NONE ) ) ) {
+                    if ( !( ForesterUtil.isEmpty( protein.getAccession() )
+                            || protein.getAccession().equals( SurfacingConstants.NONE ) ) ) {
                         out.write( protein.getAccession() );
                     }
                     out.write( SurfacingConstants.NL );
@@ -1119,7 +1183,8 @@ public final class SurfacingUtil {
                                             final Writer out,
                                             final String separator,
                                             final String limit_to_species,
-                                            final double domain_e_cutoff ) throws IOException {
+                                            final double domain_e_cutoff )
+            throws IOException {
         //System.out.println( "Per domain E-value: " + domain_e_cutoff );
         for( final Species species : protein_lists_per_species.keySet() ) {
             //System.out.println( species + ":" );
@@ -1173,13 +1238,13 @@ public final class SurfacingUtil {
                             out.write( ":" + domain.getPerDomainEvalue() );
                         }
                         out.write( "}" );
-                        if ( !( ForesterUtil.isEmpty( protein.getDescription() ) || protein.getDescription()
-                                .equals( SurfacingConstants.NONE ) ) ) {
+                        if ( !( ForesterUtil.isEmpty( protein.getDescription() )
+                                || protein.getDescription().equals( SurfacingConstants.NONE ) ) ) {
                             out.write( protein.getDescription() );
                         }
                         out.write( separator );
-                        if ( !( ForesterUtil.isEmpty( protein.getAccession() ) || protein.getAccession()
-                                .equals( SurfacingConstants.NONE ) ) ) {
+                        if ( !( ForesterUtil.isEmpty( protein.getAccession() )
+                                || protein.getAccession().equals( SurfacingConstants.NONE ) ) ) {
                             out.write( protein.getAccession() );
                         }
                         out.write( SurfacingConstants.NL );
@@ -1224,10 +1289,10 @@ public final class SurfacingUtil {
         while ( it.hasNext() ) {
             final PhylogenyNode n = it.next();
             if ( ForesterUtil.isEmpty( n.getName() )
-                    && ( !n.getNodeData().isHasTaxonomy() || ForesterUtil.isEmpty( n.getNodeData().getTaxonomy()
-                            .getScientificName() ) )
-                    && ( !n.getNodeData().isHasTaxonomy() || ForesterUtil.isEmpty( n.getNodeData().getTaxonomy()
-                            .getCommonName() ) ) ) {
+                    && ( !n.getNodeData().isHasTaxonomy()
+                            || ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() ) )
+                    && ( !n.getNodeData().isHasTaxonomy()
+                            || ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getCommonName() ) ) ) {
                 if ( n.getParent() != null ) {
                     names.append( " " );
                     names.append( n.getParent().getName() );
@@ -1261,25 +1326,27 @@ public final class SurfacingUtil {
             Phylogeny intree = null;
             final String error = ForesterUtil.isReadableFile( intree_file );
             if ( !ForesterUtil.isEmpty( error ) ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "cannot read input tree file [" + intree_file + "]: "
-                        + error );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "cannot read input tree file [" + intree_file + "]: " + error );
             }
             try {
                 final Phylogeny[] p_array = ParserBasedPhylogenyFactory.getInstance()
                         .create( intree_file, ParserUtils.createParserDependingOnFileType( intree_file, true ) );
                 if ( p_array.length < 1 ) {
-                    ForesterUtil.fatalError( surfacing.PRG_NAME, "file [" + intree_file
-                            + "] does not contain any phylogeny in phyloXML format" );
+                    ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                             "file [" + intree_file
+                                                     + "] does not contain any phylogeny in phyloXML format" );
                 }
                 else if ( p_array.length > 1 ) {
-                    ForesterUtil.fatalError( surfacing.PRG_NAME, "file [" + intree_file
-                            + "] contains more than one phylogeny in phyloXML format" );
+                    ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                             "file [" + intree_file
+                                                     + "] contains more than one phylogeny in phyloXML format" );
                 }
                 intree = p_array[ 0 ];
             }
             catch ( final Exception e ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "failed to read input tree from file [" + intree_file
-                        + "]: " + error );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "failed to read input tree from file [" + intree_file + "]: " + error );
             }
             if ( ( intree == null ) || intree.isEmpty() ) {
                 ForesterUtil.fatalError( surfacing.PRG_NAME, "input tree [" + intree_file + "] is empty" );
@@ -1287,23 +1354,17 @@ public final class SurfacingUtil {
             if ( !intree.isRooted() ) {
                 ForesterUtil.fatalError( surfacing.PRG_NAME, "input tree [" + intree_file + "] is not rooted" );
             }
-            if ( intree.getNumberOfExternalNodes() < number_of_genomes ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME,
-                                         "number of external nodes [" + intree.getNumberOfExternalNodes()
-                                                 + "] of input tree [" + intree_file
-                                                 + "] is smaller than the number of genomes the be analyzed ["
-                                                 + number_of_genomes + "]" );
-            }
             final StringBuilder parent_names = new StringBuilder();
             final int nodes_lacking_name = getNumberOfNodesLackingName( intree, parent_names );
             if ( nodes_lacking_name > 0 ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "input tree [" + intree_file + "] has "
-                        + nodes_lacking_name + " node(s) lacking a name [parent names:" + parent_names + "]" );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "input tree [" + intree_file + "] has " + nodes_lacking_name
+                                                 + " node(s) lacking a name [parent names:" + parent_names + "]" );
             }
             preparePhylogenyForParsimonyAnalyses( intree, input_file_properties );
             if ( !intree.isCompletelyBinary() ) {
-                ForesterUtil.printWarningMessage( surfacing.PRG_NAME, "input tree [" + intree_file
-                        + "] is not completely binary" );
+                ForesterUtil.printWarningMessage( surfacing.PRG_NAME,
+                                                  "input tree [" + intree_file + "] is not completely binary" );
             }
             intrees[ i++ ] = intree;
         }
@@ -1314,24 +1375,27 @@ public final class SurfacingUtil {
         Phylogeny intree = null;
         final String error = ForesterUtil.isReadableFile( intree_file );
         if ( !ForesterUtil.isEmpty( error ) ) {
-            ForesterUtil.fatalError( surfacing.PRG_NAME, "cannot read input tree file [" + intree_file + "]: " + error );
+            ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                     "cannot read input tree file [" + intree_file + "]: " + error );
         }
         try {
             final Phylogeny[] phys = ParserBasedPhylogenyFactory.getInstance()
                     .create( intree_file, ParserUtils.createParserDependingOnFileType( intree_file, true ) );
             if ( phys.length < 1 ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "file [" + intree_file
-                        + "] does not contain any phylogeny in phyloXML format" );
+                ForesterUtil
+                        .fatalError( surfacing.PRG_NAME,
+                                     "file [" + intree_file + "] does not contain any phylogeny in phyloXML format" );
             }
             else if ( phys.length > 1 ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "file [" + intree_file
-                        + "] contains more than one phylogeny in phyloXML format" );
+                ForesterUtil
+                        .fatalError( surfacing.PRG_NAME,
+                                     "file [" + intree_file + "] contains more than one phylogeny in phyloXML format" );
             }
             intree = phys[ 0 ];
         }
         catch ( final Exception e ) {
-            ForesterUtil.fatalError( surfacing.PRG_NAME, "failed to read input tree from file [" + intree_file + "]: "
-                    + error );
+            ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                     "failed to read input tree from file [" + intree_file + "]: " + error );
         }
         if ( ( intree == null ) || intree.isEmpty() ) {
             ForesterUtil.fatalError( surfacing.PRG_NAME, "input tree [" + intree_file + "] is empty" );
@@ -1402,8 +1466,8 @@ public final class SurfacingUtil {
                 while ( n != null ) {
                     if ( n.getNodeData().isHasTaxonomy()
                             && !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() ) ) {
-                        group = ForesterUtil.obtainNormalizedTaxonomyGroup( n.getNodeData().getTaxonomy()
-                                .getScientificName() );
+                        group = ForesterUtil
+                                .obtainNormalizedTaxonomyGroup( n.getNodeData().getTaxonomy().getScientificName() );
                     }
                     if ( ForesterUtil.isEmpty( group ) && !ForesterUtil.isEmpty( n.getName() ) ) {
                         group = ForesterUtil.obtainNormalizedTaxonomyGroup( n.getName() );
@@ -1414,7 +1478,7 @@ public final class SurfacingUtil {
                     n = n.getParent();
                 }
                 if ( ForesterUtil.isEmpty( group ) ) {
-                    throw new IllegalArgumentException( "no group found for taxonomy code \"" + tax_code + "\"" );
+                    group = TaxonomyGroups.OTHER;
                 }
                 _TAXCODE_TAXGROUP_MAP.put( tax_code, group );
             }
@@ -1499,8 +1563,9 @@ public final class SurfacingUtil {
         final String[] genomes = new String[ input_file_properties.length ];
         for( int i = 0; i < input_file_properties.length; ++i ) {
             if ( intree.getNodes( input_file_properties[ i ][ 1 ] ).size() > 1 ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "node named [" + input_file_properties[ i ][ 1 ]
-                        + "] is not unique in input tree " + intree.getName() );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "node named [" + input_file_properties[ i ][ 1 ]
+                                                 + "] is not unique in input tree " + intree.getName() );
             }
             genomes[ i ] = input_file_properties[ i ][ 1 ];
         }
@@ -1528,7 +1593,6 @@ public final class SurfacingUtil {
                 }
             }
         }
-        //
         final List<String> igns = PhylogenyMethods.deleteExternalNodesPositiveSelection( genomes, intree );
         if ( igns.size() > 0 ) {
             System.out.println( "Not using the following " + igns.size() + " nodes:" );
@@ -1537,15 +1601,29 @@ public final class SurfacingUtil {
             }
             System.out.println( "--" );
         }
+        //Test for node names:
+        final SortedSet<String> not_found = new TreeSet<String>();
+        final SortedSet<String> not_unique = new TreeSet<String>();
         for( final String[] input_file_propertie : input_file_properties ) {
-            try {
-                intree.getNode( input_file_propertie[ 1 ] );
+            final String name = input_file_propertie[ 1 ];
+            final List<PhylogenyNode> nodes = intree.getNodes( name );
+            if ( ( nodes == null ) || ( nodes.size() < 1 ) ) {
+                not_found.add( name );
             }
-            catch ( final IllegalArgumentException e ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "node named [" + input_file_propertie[ 1 ]
-                        + "] not present/not unique in input tree" );
+            if ( nodes.size() > 1 ) {
+                not_unique.add( name );
             }
         }
+        if ( not_found.size() > 0 ) {
+            ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                     "the following " + not_found.size()
+                                             + " node(s) are not present in the input tree: " + not_found );
+        }
+        if ( not_unique.size() > 0 ) {
+            ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                     "the following " + not_unique.size()
+                                             + " node(s) are not unique in the input tree: " + not_unique );
+        }
     }
 
     public static void printOutPercentageOfMultidomainProteins( final SortedMap<Integer, Integer> all_genomes_domains_per_potein_histo,
@@ -1594,17 +1672,17 @@ public final class SurfacingUtil {
         final Set<String> paths = new HashSet<String>();
         for( int i = 0; i < input_file_properties.length; ++i ) {
             if ( !PhyloXmlUtil.TAXOMONY_CODE_PATTERN.matcher( input_file_properties[ i ][ 1 ] ).matches() ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "illegal format for species code: "
-                        + input_file_properties[ i ][ 1 ] );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "illegal format for species code: " + input_file_properties[ i ][ 1 ] );
             }
             if ( specs.contains( input_file_properties[ i ][ 1 ] ) ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "species code " + input_file_properties[ i ][ 1 ]
-                        + " is not unique" );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "species code " + input_file_properties[ i ][ 1 ] + " is not unique" );
             }
             specs.add( input_file_properties[ i ][ 1 ] );
             if ( paths.contains( input_file_properties[ i ][ 0 ] ) ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "path " + input_file_properties[ i ][ 0 ]
-                        + " is not unique" );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "path " + input_file_properties[ i ][ 0 ] + " is not unique" );
             }
             paths.add( input_file_properties[ i ][ 0 ] );
             final String error = ForesterUtil.isReadableFile( new File( input_file_properties[ i ][ 0 ] ) );
@@ -1622,8 +1700,9 @@ public final class SurfacingUtil {
                                                        final List<Object> numbers ) {
         if ( cla.isOptionSet( surfacing.PLUS_MINUS_ANALYSIS_OPTION ) ) {
             if ( !cla.isOptionValueSet( surfacing.PLUS_MINUS_ANALYSIS_OPTION ) ) {
-                ForesterUtil.fatalError( surfacing.PRG_NAME, "no value for 'plus-minus' file: -"
-                        + surfacing.PLUS_MINUS_ANALYSIS_OPTION + "=<file>" );
+                ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                         "no value for 'plus-minus' file: -" + surfacing.PLUS_MINUS_ANALYSIS_OPTION
+                                                 + "=<file>" );
             }
             final File plus_minus_file = new File( cla.getOptionValue( surfacing.PLUS_MINUS_ANALYSIS_OPTION ) );
             final String msg = ForesterUtil.isReadableFile( plus_minus_file );
@@ -1691,18 +1770,18 @@ public final class SurfacingUtil {
                         factor = Double.parseDouble( species.substring( 3 ) );
                     }
                     catch ( final NumberFormatException e ) {
-                        ForesterUtil.fatalError( surfacing.PRG_NAME, "could not parse double value for factor from: \""
-                                + species.substring( 3 ) + "\"" );
+                        ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                                 "could not parse double value for factor from: \""
+                                                         + species.substring( 3 ) + "\"" );
                     }
                 }
                 else if ( species.startsWith( "#" ) ) {
                     // Comment, ignore.
                 }
                 else {
-                    ForesterUtil
-                            .fatalError( surfacing.PRG_NAME,
-                                         "species/genome names in 'plus minus' file must begin with '*' (high copy target genome), '+' (high copy base genomes), '-' (low copy genomes), '$D=<integer>' minimal Difference (default is 1), '$F=<double>' factor (default is 1.0), double), or '#' (ignore) suffix, encountered: \""
-                                                 + species + "\"" );
+                    ForesterUtil.fatalError( surfacing.PRG_NAME,
+                                             "species/genome names in 'plus minus' file must begin with '*' (high copy target genome), '+' (high copy base genomes), '-' (low copy genomes), '$D=<integer>' minimal Difference (default is 1), '$F=<double>' factor (default is 1.0), double), or '#' (ignore) suffix, encountered: \""
+                                                     + species + "\"" );
                 }
                 numbers.add( new Integer( min_diff + "" ) );
                 numbers.add( new Double( factor + "" ) );
@@ -1715,8 +1794,8 @@ public final class SurfacingUtil {
 
     /*
      * species | protein id | n-terminal domain | c-terminal domain | n-terminal domain per domain E-value | c-terminal domain per domain E-value
-     * 
-     * 
+     *
+     *
      */
     static public StringBuffer proteinToDomainCombinations( final Protein protein,
                                                             final String protein_id,
@@ -1836,7 +1915,8 @@ public final class SurfacingUtil {
     public static void writeAllDomainsChangedOnAllSubtrees( final Phylogeny p,
                                                             final boolean get_gains,
                                                             final String outdir,
-                                                            final String suffix_for_filename ) throws IOException {
+                                                            final String suffix_for_filename )
+            throws IOException {
         CharacterStateMatrix.GainLossStates state = CharacterStateMatrix.GainLossStates.GAIN;
         if ( !get_gains ) {
             state = CharacterStateMatrix.GainLossStates.LOSS;
@@ -1887,14 +1967,17 @@ public final class SurfacingUtil {
             ForesterUtil.fatalError( surfacing.PRG_NAME, e.getMessage() );
         }
         if ( input_file_properties[ i ].length == 3 ) {
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote binary domain combination for \""
-                    + input_file_properties[ i ][ 0 ] + "\" (" + input_file_properties[ i ][ 1 ] + ", "
-                    + input_file_properties[ i ][ 2 ] + ") to: \"" + dc_outfile_dot + "\"" );
+            ForesterUtil
+                    .programMessage( surfacing.PRG_NAME,
+                                     "Wrote binary domain combination for \"" + input_file_properties[ i ][ 0 ] + "\" ("
+                                             + input_file_properties[ i ][ 1 ] + ", " + input_file_properties[ i ][ 2 ]
+                                             + ") to: \"" + dc_outfile_dot + "\"" );
         }
         else {
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote binary domain combination for \""
-                    + input_file_properties[ i ][ 0 ] + "\" (" + input_file_properties[ i ][ 1 ] + ") to: \""
-                    + dc_outfile_dot + "\"" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Wrote binary domain combination for \"" + input_file_properties[ i ][ 0 ]
+                                                 + "\" (" + input_file_properties[ i ][ 1 ] + ") to: \""
+                                                 + dc_outfile_dot + "\"" );
         }
     }
 
@@ -1919,9 +2002,10 @@ public final class SurfacingUtil {
                 for( int c = 0; c < matrix.getNumberOfCharacters(); ++c ) {
                     // Not nice:
                     // using null to indicate either UNCHANGED_PRESENT or GAIN.
-                    if ( ( matrix.getState( id, c ) == state )
-                            || ( ( state == null ) && ( ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.GAIN ) || ( matrix
-                                    .getState( id, c ) == CharacterStateMatrix.GainLossStates.UNCHANGED_PRESENT ) ) ) ) {
+                    if ( ( matrix.getState( id, c ) == state ) || ( ( state == null )
+                            && ( ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.GAIN ) || ( matrix
+                                    .getState( id,
+                                               c ) == CharacterStateMatrix.GainLossStates.UNCHANGED_PRESENT ) ) ) ) {
                         out.write( matrix.getCharacter( c ) );
                         if ( ( descriptions != null ) && !descriptions.isEmpty()
                                 && descriptions.containsKey( matrix.getCharacter( c ) ) ) {
@@ -1962,9 +2046,10 @@ public final class SurfacingUtil {
                 for( int c = 0; c < matrix.getNumberOfCharacters(); ++c ) {
                     // Not nice:
                     // using null to indicate either UNCHANGED_PRESENT or GAIN.
-                    if ( ( matrix.getState( id, c ) == state )
-                            || ( ( state == null ) && ( ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.GAIN ) || ( matrix
-                                    .getState( id, c ) == CharacterStateMatrix.GainLossStates.UNCHANGED_PRESENT ) ) ) ) {
+                    if ( ( matrix.getState( id, c ) == state ) || ( ( state == null )
+                            && ( ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.GAIN ) || ( matrix
+                                    .getState( id,
+                                               c ) == CharacterStateMatrix.GainLossStates.UNCHANGED_PRESENT ) ) ) ) {
                         BinaryDomainCombination bdc = null;
                         try {
                             bdc = BasicBinaryDomainCombination.obtainInstance( matrix.getCharacter( c ) );
@@ -2096,9 +2181,9 @@ public final class SurfacingUtil {
                 for( int c = 0; c < matrix.getNumberOfCharacters(); ++c ) {
                     // Not nice:
                     // using null to indicate either UNCHANGED_PRESENT or GAIN.
-                    if ( ( matrix.getState( id, c ) == state )
-                            || ( ( state == null ) && ( ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.UNCHANGED_PRESENT ) || ( matrix
-                                    .getState( id, c ) == CharacterStateMatrix.GainLossStates.GAIN ) ) ) ) {
+                    if ( ( matrix.getState( id, c ) == state ) || ( ( state == null )
+                            && ( ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.UNCHANGED_PRESENT )
+                                    || ( matrix.getState( id, c ) == CharacterStateMatrix.GainLossStates.GAIN ) ) ) ) {
                         final String character = matrix.getCharacter( c );
                         String domain_0 = "";
                         String domain_1 = "";
@@ -2153,7 +2238,7 @@ public final class SurfacingUtil {
                 out.write( SurfacingConstants.NL );
                 out.write( "<hr>" );
                 out.write( SurfacingConstants.NL );
-            } // for( final String id : sorted_ids ) {  
+            } // for( final String id : sorted_ids ) {
             out.write( "</body>" );
             out.write( SurfacingConstants.NL );
             out.write( "</html>" );
@@ -2190,13 +2275,14 @@ public final class SurfacingUtil {
         final DescriptiveStatistics stats = gwcd.getPerGenomeDomainPromiscuityStatistics();
         try {
             per_genome_domain_promiscuity_statistics_writer.write( input_file_properties[ i ][ 1 ] + "\t" );
-            per_genome_domain_promiscuity_statistics_writer.write( FORMATTER_3.format( stats.arithmeticMean() ) + "\t" );
+            per_genome_domain_promiscuity_statistics_writer
+                    .write( FORMATTER_3.format( stats.arithmeticMean() ) + "\t" );
             if ( stats.getN() < 2 ) {
                 per_genome_domain_promiscuity_statistics_writer.write( "n/a" + "\t" );
             }
             else {
-                per_genome_domain_promiscuity_statistics_writer.write( FORMATTER_3.format( stats
-                        .sampleStandardDeviation() ) + "\t" );
+                per_genome_domain_promiscuity_statistics_writer
+                        .write( FORMATTER_3.format( stats.sampleStandardDeviation() ) + "\t" );
             }
             per_genome_domain_promiscuity_statistics_writer.write( FORMATTER_3.format( stats.median() ) + "\t" );
             per_genome_domain_promiscuity_statistics_writer.write( ( int ) stats.getMin() + "\t" );
@@ -2212,14 +2298,16 @@ public final class SurfacingUtil {
             ForesterUtil.fatalError( surfacing.PRG_NAME, e.getMessage() );
         }
         if ( input_file_properties[ i ].length == 3 ) {
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote domain combination counts for \""
-                    + input_file_properties[ i ][ 0 ] + "\" (" + input_file_properties[ i ][ 1 ] + ", "
-                    + input_file_properties[ i ][ 2 ] + ") to: \"" + dc_outfile + "\"" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Wrote domain combination counts for \"" + input_file_properties[ i ][ 0 ]
+                                                 + "\" (" + input_file_properties[ i ][ 1 ] + ", "
+                                                 + input_file_properties[ i ][ 2 ] + ") to: \"" + dc_outfile + "\"" );
         }
         else {
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote domain combination counts for \""
-                    + input_file_properties[ i ][ 0 ] + "\" (" + input_file_properties[ i ][ 1 ] + ") to: \""
-                    + dc_outfile + "\"" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Wrote domain combination counts for \"" + input_file_properties[ i ][ 0 ]
+                                                 + "\" (" + input_file_properties[ i ][ 1 ] + ") to: \"" + dc_outfile
+                                                 + "\"" );
         }
     }
 
@@ -2236,7 +2324,8 @@ public final class SurfacingUtil {
                                                       final boolean verbose,
                                                       final Map<String, Integer> tax_code_to_id_map,
                                                       final Phylogeny phy,
-                                                      final Set<String> pos_filter_doms ) throws IOException {
+                                                      final Set<String> pos_filter_doms )
+            throws IOException {
         if ( ( single_writer != null ) && ( ( split_writers == null ) || split_writers.isEmpty() ) ) {
             split_writers = new HashMap<Character, Writer>();
             split_writers.put( '_', single_writer );
@@ -2277,7 +2366,8 @@ public final class SurfacingUtil {
                 ( similarity ).setSpeciesOrder( species_order );
             }
             if ( single_writer != null ) {
-                if ( !ForesterUtil.isEmpty( pos_filter_doms ) && pos_filter_doms.contains( similarity.getDomainId() ) ) {
+                if ( !ForesterUtil.isEmpty( pos_filter_doms )
+                        && pos_filter_doms.contains( similarity.getDomainId() ) ) {
                     single_writer.write( "<tr><td><b><a href=\"#" + similarity.getDomainId()
                             + "\"><span style=\"color:#00ff00\">" + similarity.getDomainId()
                             + "</span></a></b></td></tr>" );
@@ -2289,12 +2379,13 @@ public final class SurfacingUtil {
                 single_writer.write( SurfacingConstants.NL );
             }
             else {
-                Writer local_writer = split_writers.get( ( similarity.getDomainId().charAt( 0 ) + "" ).toLowerCase()
-                        .charAt( 0 ) );
+                Writer local_writer = split_writers
+                        .get( ( similarity.getDomainId().charAt( 0 ) + "" ).toLowerCase().charAt( 0 ) );
                 if ( local_writer == null ) {
                     local_writer = split_writers.get( '0' );
                 }
-                if ( !ForesterUtil.isEmpty( pos_filter_doms ) && pos_filter_doms.contains( similarity.getDomainId() ) ) {
+                if ( !ForesterUtil.isEmpty( pos_filter_doms )
+                        && pos_filter_doms.contains( similarity.getDomainId() ) ) {
                     local_writer.write( "<tr><td><b><a href=\"#" + similarity.getDomainId()
                             + "\"><span style=\"color:#00ff00\">" + similarity.getDomainId()
                             + "</span></a></b></td></tr>" );
@@ -2362,17 +2453,16 @@ public final class SurfacingUtil {
                 ( similarity ).setSpeciesOrder( species_order );
             }
             if ( simple_tab_writer != null ) {
-                simple_tab_writer.write( similarity.toStringBuffer( PRINT_OPTION.SIMPLE_TAB_DELIMITED,
-                                                                    tax_code_to_id_map,
-                                                                    null ).toString() );
+                simple_tab_writer.write( similarity
+                        .toStringBuffer( PRINT_OPTION.SIMPLE_TAB_DELIMITED, tax_code_to_id_map, null ).toString() );
             }
             if ( single_writer != null ) {
                 single_writer.write( similarity.toStringBuffer( print_option, tax_code_to_id_map, phy ).toString() );
                 single_writer.write( SurfacingConstants.NL );
             }
             else {
-                Writer local_writer = split_writers.get( ( similarity.getDomainId().charAt( 0 ) + "" ).toLowerCase()
-                        .charAt( 0 ) );
+                Writer local_writer = split_writers
+                        .get( ( similarity.getDomainId().charAt( 0 ) + "" ).toLowerCase().charAt( 0 ) );
                 if ( local_writer == null ) {
                     local_writer = split_writers.get( '0' );
                 }
@@ -2490,8 +2580,8 @@ public final class SurfacingUtil {
             writer.toPhyloXML( new File( filename ), phylogeny, 1 );
         }
         catch ( final IOException e ) {
-            ForesterUtil.printWarningMessage( surfacing.PRG_NAME, "failed to write phylogeny to \"" + filename + "\": "
-                    + e );
+            ForesterUtil.printWarningMessage( surfacing.PRG_NAME,
+                                              "failed to write phylogeny to \"" + filename + "\": " + e );
         }
         ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote phylogeny to \"" + filename + "\"" );
     }
@@ -2501,12 +2591,12 @@ public final class SurfacingUtil {
                                             final SortedSet<String> filter,
                                             final List<GenomeWideCombinableDomains> gwcd_list ) {
         try {
-            writeMatrixToFile( DomainParsimonyCalculator.createMatrixOfDomainPresenceOrAbsence( gwcd_list,
-                                                                                                positive_filter_file == null ? null
-                                                                                                        : filter ),
+            writeMatrixToFile( DomainParsimonyCalculator
+                    .createMatrixOfDomainPresenceOrAbsence( gwcd_list, positive_filter_file == null ? null : filter ),
                                output_file + surfacing.DOMAINS_PRESENT_NEXUS,
                                Format.NEXUS_BINARY );
-            writeMatrixToFile( DomainParsimonyCalculator.createMatrixOfBinaryDomainCombinationPresenceOrAbsence( gwcd_list ),
+            writeMatrixToFile( DomainParsimonyCalculator
+                    .createMatrixOfBinaryDomainCombinationPresenceOrAbsence( gwcd_list ),
                                output_file + surfacing.BDC_PRESENT_NEXUS,
                                Format.NEXUS_BINARY );
         }
@@ -2528,7 +2618,8 @@ public final class SurfacingUtil {
             if ( !ForesterUtil.isEmpty( pos_filter_doms ) && !pos_filter_doms.contains( domain ) ) {
                 continue;
             }
-            final File out = new File( output_dir + ForesterUtil.FILE_SEPARATOR + domain + surfacing.SEQ_EXTRACT_SUFFIX );
+            final File out = new File( output_dir + ForesterUtil.FILE_SEPARATOR + domain
+                    + surfacing.SEQ_EXTRACT_SUFFIX );
             checkForOutputFileWriteability( out );
             try {
                 final Writer proteins_file_writer = new BufferedWriter( new FileWriter( out ) );
@@ -2549,7 +2640,8 @@ public final class SurfacingUtil {
 
     public static void writeTaxonomyLinks( final Writer writer,
                                            final String species,
-                                           final Map<String, Integer> tax_code_to_id_map ) throws IOException {
+                                           final Map<String, Integer> tax_code_to_id_map )
+            throws IOException {
         if ( ( species.length() > 1 ) && ( species.indexOf( '_' ) < 1 ) ) {
             writer.write( " [" );
             if ( ( tax_code_to_id_map != null ) && tax_code_to_id_map.containsKey( species ) ) {
@@ -2671,25 +2763,25 @@ public final class SurfacingUtil {
                     if ( !dc_reapp_counts_to_protein_length_stats.containsKey( count ) ) {
                         dc_reapp_counts_to_protein_length_stats.put( count, new BasicDescriptiveStatistics() );
                     }
-                    dc_reapp_counts_to_protein_length_stats.get( count ).addValue( protein_length_stats_by_dc.get( dc )
-                            .arithmeticMean() );
+                    dc_reapp_counts_to_protein_length_stats.get( count )
+                            .addValue( protein_length_stats_by_dc.get( dc ).arithmeticMean() );
                 }
                 if ( domain_number_stats_by_dc != null ) {
                     if ( !dc_reapp_counts_to_domain_number_stats.containsKey( count ) ) {
                         dc_reapp_counts_to_domain_number_stats.put( count, new BasicDescriptiveStatistics() );
                     }
-                    dc_reapp_counts_to_domain_number_stats.get( count ).addValue( domain_number_stats_by_dc.get( dc )
-                            .arithmeticMean() );
+                    dc_reapp_counts_to_domain_number_stats.get( count )
+                            .addValue( domain_number_stats_by_dc.get( dc ).arithmeticMean() );
                 }
                 if ( domain_length_stats_by_domain != null ) {
                     if ( !dc_reapp_counts_to_domain_lengths_stats.containsKey( count ) ) {
                         dc_reapp_counts_to_domain_lengths_stats.put( count, new BasicDescriptiveStatistics() );
                     }
                     final String[] ds = dc.split( "=" );
-                    dc_reapp_counts_to_domain_lengths_stats.get( count ).addValue( domain_length_stats_by_domain
-                            .get( ds[ 0 ] ).arithmeticMean() );
-                    dc_reapp_counts_to_domain_lengths_stats.get( count ).addValue( domain_length_stats_by_domain
-                            .get( ds[ 1 ] ).arithmeticMean() );
+                    dc_reapp_counts_to_domain_lengths_stats.get( count )
+                            .addValue( domain_length_stats_by_domain.get( ds[ 0 ] ).arithmeticMean() );
+                    dc_reapp_counts_to_domain_lengths_stats.get( count )
+                            .addValue( domain_length_stats_by_domain.get( ds[ 1 ] ).arithmeticMean() );
                 }
                 if ( count > 1 ) {
                     more_than_once.add( dc );
@@ -2812,8 +2904,8 @@ public final class SurfacingUtil {
                                      ForesterUtil.LINE_SEPARATOR );
             out_for_rank_counts.close();
             out_for_ancestor_species_counts.close();
-            if ( !ForesterUtil.isEmpty( outfilename_for_protein_stats )
-                    && ( ( domain_length_stats_by_domain != null ) || ( protein_length_stats_by_dc != null ) || ( domain_number_stats_by_dc != null ) ) ) {
+            if ( !ForesterUtil.isEmpty( outfilename_for_protein_stats ) && ( ( domain_length_stats_by_domain != null )
+                    || ( protein_length_stats_by_dc != null ) || ( domain_number_stats_by_dc != null ) ) ) {
                 final BufferedWriter w = new BufferedWriter( new FileWriter( outfilename_for_protein_stats ) );
                 w.write( "Domain Lengths: " );
                 w.write( "\n" );
@@ -2868,8 +2960,8 @@ public final class SurfacingUtil {
                 w.write( "\n" );
                 w.write( "N: " + gained_multiple_times_domain_length_count );
                 w.write( "\n" );
-                w.write( "Avg: "
-                        + ( ( double ) gained_multiple_times_domain_length_sum / gained_multiple_times_domain_length_count ) );
+                w.write( "Avg: " + ( ( double ) gained_multiple_times_domain_length_sum
+                        / gained_multiple_times_domain_length_count ) );
                 w.write( "\n" );
                 w.write( "\n" );
                 w.write( "\n" );
@@ -2902,10 +2994,12 @@ public final class SurfacingUtil {
         catch ( final IOException e ) {
             ForesterUtil.printWarningMessage( surfacing.PRG_NAME, "Failure to write: " + e );
         }
-        ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote independent domain combination gains fitch counts to ["
-                + outfilename_for_counts + "]" );
-        ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote independent domain combination gains fitch lists to ["
-                + outfilename_for_dc + "]" );
+        ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                     "Wrote independent domain combination gains fitch counts to ["
+                                             + outfilename_for_counts + "]" );
+        ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                     "Wrote independent domain combination gains fitch lists to [" + outfilename_for_dc
+                                             + "]" );
         ForesterUtil.programMessage( surfacing.PRG_NAME,
                                      "Wrote independent domain combination gains fitch lists to (for GO mapping) ["
                                              + outfilename_for_dc_for_go_mapping + "]" );
@@ -3016,8 +3110,8 @@ public final class SurfacingUtil {
     private static List<String> splitDomainCombination( final String dc ) {
         final String[] s = dc.split( "=" );
         if ( s.length != 2 ) {
-            ForesterUtil.printErrorMessage( surfacing.PRG_NAME, "Stringyfied domain combination has illegal format: "
-                    + dc );
+            ForesterUtil.printErrorMessage( surfacing.PRG_NAME,
+                                            "Stringyfied domain combination has illegal format: " + dc );
             System.exit( -1 );
         }
         final List<String> l = new ArrayList<String>( 2 );
@@ -3033,7 +3127,8 @@ public final class SurfacingUtil {
         final File all_pfams_encountered_file = new File( outfile_name + surfacing.ALL_PFAMS_ENCOUNTERED_SUFFIX );
         final File all_pfams_encountered_with_go_annotation_file = new File( outfile_name
                 + surfacing.ALL_PFAMS_ENCOUNTERED_WITH_GO_ANNOTATION_SUFFIX );
-        final File encountered_pfams_summary_file = new File( outfile_name + surfacing.ENCOUNTERED_PFAMS_SUMMARY_SUFFIX );
+        final File encountered_pfams_summary_file = new File( outfile_name
+                + surfacing.ENCOUNTERED_PFAMS_SUMMARY_SUFFIX );
         int biological_process_counter = 0;
         int cellular_component_counter = 0;
         int molecular_function_counter = 0;
@@ -3100,42 +3195,61 @@ public final class SurfacingUtil {
             }
             all_pfams_encountered_writer.close();
             all_pfams_encountered_with_go_annotation_writer.close();
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote all [" + all_pfams_encountered.size()
-                    + "] encountered Pfams to: \"" + all_pfams_encountered_file + "\"" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote all [" + pfams_with_mappings_counter
-                    + "] encountered Pfams with GO mappings to: \"" + all_pfams_encountered_with_go_annotation_file
-                    + "\"" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote summary (including all ["
-                    + pfams_without_mappings_counter + "] encountered Pfams without GO mappings) to: \""
-                    + encountered_pfams_summary_file + "\"" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Sum of Pfams encountered                : "
-                    + all_pfams_encountered.size() );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Pfams without a mapping                 : "
-                    + pfams_without_mappings_counter + " ["
-                    + ( ( 100 * pfams_without_mappings_counter ) / all_pfams_encountered.size() ) + "%]" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Pfams without mapping to proc. or func. : "
-                    + pfams_without_mappings_to_bp_or_mf_counter + " ["
-                    + ( ( 100 * pfams_without_mappings_to_bp_or_mf_counter ) / all_pfams_encountered.size() ) + "%]" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Pfams with a mapping                    : "
-                    + pfams_with_mappings_counter + " ["
-                    + ( ( 100 * pfams_with_mappings_counter ) / all_pfams_encountered.size() ) + "%]" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Pfams with a mapping to proc. or func.  : "
-                    + pfams_with_mappings_to_bp_or_mf_counter + " ["
-                    + ( ( 100 * pfams_with_mappings_to_bp_or_mf_counter ) / all_pfams_encountered.size() ) + "%]" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Pfams with mapping to biological process: "
-                    + biological_process_counter + " ["
-                    + ( ( 100 * biological_process_counter ) / all_pfams_encountered.size() ) + "%]" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Pfams with mapping to molecular function: "
-                    + molecular_function_counter + " ["
-                    + ( ( 100 * molecular_function_counter ) / all_pfams_encountered.size() ) + "%]" );
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Pfams with mapping to cellular component: "
-                    + cellular_component_counter + " ["
-                    + ( ( 100 * cellular_component_counter ) / all_pfams_encountered.size() ) + "%]" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Wrote all [" + all_pfams_encountered.size() + "] encountered Pfams to: \""
+                                                 + all_pfams_encountered_file + "\"" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Wrote all [" + pfams_with_mappings_counter
+                                                 + "] encountered Pfams with GO mappings to: \""
+                                                 + all_pfams_encountered_with_go_annotation_file + "\"" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Wrote summary (including all [" + pfams_without_mappings_counter
+                                                 + "] encountered Pfams without GO mappings) to: \""
+                                                 + encountered_pfams_summary_file + "\"" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Sum of Pfams encountered                : " + all_pfams_encountered.size() );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Pfams without a mapping                 : " + pfams_without_mappings_counter
+                                                 + " [" + ( ( 100 * pfams_without_mappings_counter )
+                                                         / all_pfams_encountered.size() )
+                                                 + "%]" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Pfams without mapping to proc. or func. : "
+                                                 + pfams_without_mappings_to_bp_or_mf_counter + " ["
+                                                 + ( ( 100 * pfams_without_mappings_to_bp_or_mf_counter )
+                                                         / all_pfams_encountered.size() )
+                                                 + "%]" );
+            ForesterUtil
+                    .programMessage( surfacing.PRG_NAME,
+                                     "Pfams with a mapping                    : " + pfams_with_mappings_counter + " ["
+                                             + ( ( 100 * pfams_with_mappings_counter ) / all_pfams_encountered.size() )
+                                             + "%]" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Pfams with a mapping to proc. or func.  : "
+                                                 + pfams_with_mappings_to_bp_or_mf_counter + " ["
+                                                 + ( ( 100 * pfams_with_mappings_to_bp_or_mf_counter )
+                                                         / all_pfams_encountered.size() )
+                                                 + "%]" );
+            ForesterUtil
+                    .programMessage( surfacing.PRG_NAME,
+                                     "Pfams with mapping to biological process: " + biological_process_counter + " ["
+                                             + ( ( 100 * biological_process_counter ) / all_pfams_encountered.size() )
+                                             + "%]" );
+            ForesterUtil
+                    .programMessage( surfacing.PRG_NAME,
+                                     "Pfams with mapping to molecular function: " + molecular_function_counter + " ["
+                                             + ( ( 100 * molecular_function_counter ) / all_pfams_encountered.size() )
+                                             + "%]" );
+            ForesterUtil
+                    .programMessage( surfacing.PRG_NAME,
+                                     "Pfams with mapping to cellular component: " + cellular_component_counter + " ["
+                                             + ( ( 100 * cellular_component_counter ) / all_pfams_encountered.size() )
+                                             + "%]" );
             summary_writer.write( ForesterUtil.LINE_SEPARATOR );
             summary_writer.write( "# Sum of Pfams encountered                : " + all_pfams_encountered.size() );
             summary_writer.write( ForesterUtil.LINE_SEPARATOR );
-            summary_writer.write( "# Pfams without a mapping                 : " + pfams_without_mappings_counter
-                    + " [" + ( ( 100 * pfams_without_mappings_counter ) / all_pfams_encountered.size() ) + "%]" );
+            summary_writer.write( "# Pfams without a mapping                 : " + pfams_without_mappings_counter + " ["
+                    + ( ( 100 * pfams_without_mappings_counter ) / all_pfams_encountered.size() ) + "%]" );
             summary_writer.write( ForesterUtil.LINE_SEPARATOR );
             summary_writer.write( "# Pfams without mapping to proc. or func. : "
                     + pfams_without_mappings_to_bp_or_mf_counter + " ["
@@ -3182,14 +3296,15 @@ public final class SurfacingUtil {
                                          final String prefix_for_html,
                                          final String character_separator_for_non_html_output,
                                          final Map<String, Set<String>>[] domain_id_to_secondary_features_maps,
-                                         final Set<GoId> all_go_ids ) throws IOException {
+                                         final Set<GoId> all_go_ids )
+            throws IOException {
         boolean any_go_annotation_present = false;
         boolean first_has_no_go = false;
         int domain_count = 2; // To distinguish between domains and binary domain combinations.
         if ( ForesterUtil.isEmpty( domain_1 ) ) {
             domain_count = 1;
         }
-        // The following has a difficult to understand logic.  
+        // The following has a difficult to understand logic.
         for( int d = 0; d < domain_count; ++d ) {
             List<GoId> go_ids = null;
             boolean go_annotation_present = false;
@@ -3262,7 +3377,7 @@ public final class SurfacingUtil {
                     out.write( SurfacingConstants.NL );
                 }
             }
-        } //  for( int d = 0; d < domain_count; ++d ) 
+        } //  for( int d = 0; d < domain_count; ++d )
         if ( !any_go_annotation_present ) {
             out.write( "<tr>" );
             writeDomainIdsToHtml( out, domain_0, domain_1, prefix_for_html, domain_id_to_secondary_features_maps );
@@ -3293,7 +3408,8 @@ public final class SurfacingUtil {
 
     private static void writeDomainsToIndividualFilePerTreeNode( final Writer individual_files_writer,
                                                                  final String domain_0,
-                                                                 final String domain_1 ) throws IOException {
+                                                                 final String domain_1 )
+            throws IOException {
         individual_files_writer.write( domain_0 );
         individual_files_writer.write( ForesterUtil.LINE_SEPARATOR );
         if ( !ForesterUtil.isEmpty( domain_1 ) ) {
@@ -3310,8 +3426,8 @@ public final class SurfacingUtil {
                 writer.write( ForesterUtil.LINE_SEPARATOR );
             }
             writer.close();
-            ForesterUtil.programMessage( surfacing.PRG_NAME, "Wrote " + pfams.size() + " pfams to [" + outfile_name
-                    + "]" );
+            ForesterUtil.programMessage( surfacing.PRG_NAME,
+                                         "Wrote " + pfams.size() + " pfams to [" + outfile_name + "]" );
         }
         catch ( final IOException e ) {
             ForesterUtil.printWarningMessage( surfacing.PRG_NAME, "Failure to write: " + e );