(no commit message)
[jalview.git] / forester / java / src / org / forester / test / Test.java
index b5a3aeb..05d17ac 100644 (file)
@@ -38,7 +38,6 @@ import java.util.Locale;
 import java.util.Set;
 
 import org.forester.application.support_transfer;
-import org.forester.archaeopteryx.Archaeopteryx;
 import org.forester.development.DevelopmentTools;
 import org.forester.evoinference.TestPhylogenyReconstruction;
 import org.forester.evoinference.matrix.character.CharacterStateMatrix;
@@ -63,6 +62,7 @@ import org.forester.phylogeny.Phylogeny;
 import org.forester.phylogeny.PhylogenyBranch;
 import org.forester.phylogeny.PhylogenyMethods;
 import org.forester.phylogeny.PhylogenyNode;
+import org.forester.phylogeny.PhylogenyNodeI.NH_CONVERSION_SUPPORT_VALUE_STYLE;
 import org.forester.phylogeny.data.BinaryCharacters;
 import org.forester.phylogeny.data.BranchWidth;
 import org.forester.phylogeny.data.Confidence;
@@ -71,6 +71,7 @@ import org.forester.phylogeny.data.DomainArchitecture;
 import org.forester.phylogeny.data.Event;
 import org.forester.phylogeny.data.Identifier;
 import org.forester.phylogeny.data.PhylogenyData;
+import org.forester.phylogeny.data.PhylogenyDataUtil;
 import org.forester.phylogeny.data.Polygon;
 import org.forester.phylogeny.data.PropertiesMap;
 import org.forester.phylogeny.data.Property;
@@ -231,6 +232,15 @@ public final class Test {
             System.out.println( "failed." );
             failed++;
         }
+        System.out.print( "NHX parsing (MrBayes): " );
+        if ( Test.testNHXParsingMB() ) {
+            System.out.println( "OK." );
+            succeeded++;
+        }
+        else {
+            System.out.println( "failed." );
+            failed++;
+        }
         System.out.print( "Nexus characters parsing: " );
         if ( Test.testNexusCharactersParsing() ) {
             System.out.println( "OK." );
@@ -795,11 +805,11 @@ public final class Test {
             }
             final PhylogenyNode n1 = new PhylogenyNode();
             final PhylogenyNode n2 = PhylogenyNode
-                    .createInstanceFromNhxString( "", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             final PhylogenyNode n3 = PhylogenyNode
-                    .createInstanceFromNhxString( "n3", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n3", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             final PhylogenyNode n4 = PhylogenyNode
-                    .createInstanceFromNhxString( "n4:0.01", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n4:0.01", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( n1.isHasAssignedEvent() ) {
                 return false;
             }
@@ -3403,11 +3413,11 @@ public final class Test {
             parser1.parse();
             final HmmscanPerDomainTableParser parser2 = new HmmscanPerDomainTableParser( new File( test_dir
                     + ForesterUtil.getFileSeparator() + "hmmscan30b3_output_2" ), "MONBR", INDIVIDUAL_SCORE_CUTOFF.NONE );
-            final List<Protein> domain_collections = parser2.parse();
+            final List<Protein> proteins = parser2.parse();
             if ( parser2.getProteinsEncountered() != 4 ) {
                 return false;
             }
-            if ( domain_collections.size() != 4 ) {
+            if ( proteins.size() != 4 ) {
                 return false;
             }
             if ( parser2.getDomainsEncountered() != 69 ) {
@@ -3419,11 +3429,19 @@ public final class Test {
             if ( parser2.getDomainsIgnoredDueToEval() != 0 ) {
                 return false;
             }
-            final Protein p1 = domain_collections.get( 0 );
+            final Protein p1 = proteins.get( 0 );
             if ( p1.getNumberOfProteinDomains() != 15 ) {
                 return false;
             }
-            final Protein p4 = domain_collections.get( 3 );
+            final Protein p2 = proteins.get( 1 );
+            if ( p2.getNumberOfProteinDomains() != 51 ) {
+                return false;
+            }
+            final Protein p3 = proteins.get( 2 );
+            if ( p3.getNumberOfProteinDomains() != 2 ) {
+                return false;
+            }
+            final Protein p4 = proteins.get( 3 );
             if ( p4.getNumberOfProteinDomains() != 1 ) {
                 return false;
             }
@@ -4210,7 +4228,7 @@ public final class Test {
                 return false;
             }
             final NHXParser nhxp = new NHXParser();
-            nhxp.setTaxonomyExtraction( ForesterUtil.TAXONOMY_EXTRACTION.NO );
+            nhxp.setTaxonomyExtraction( PhylogenyMethods.TAXONOMY_EXTRACTION.NO );
             nhxp.setReplaceUnderscores( true );
             final Phylogeny uc0 = factory.create( "(A__A_,_B_B)", nhxp )[ 0 ];
             if ( !uc0.getRoot().getChildNode( 0 ).getName().equals( "A A " ) ) {
@@ -4436,6 +4454,49 @@ public final class Test {
             if ( ( p46.length != 1 ) || !p46[ 0 ].isEmpty() ) {
                 return false;
             }
+            final Phylogeny p47 = factory.create( new StringBuffer( "((A,B)ab:2[0.44],C)" ), new NHXParser() )[ 0 ];
+            if ( !isEqual( 0.44, p47.getNode( "ab" ).getBranchData().getConfidence( 0 ).getValue() ) ) {
+                return false;
+            }
+            final Phylogeny p48 = factory.create( new StringBuffer( "((A,B)ab:2[88],C)" ), new NHXParser() )[ 0 ];
+            if ( !isEqual( 88, p48.getNode( "ab" ).getBranchData().getConfidence( 0 ).getValue() ) ) {
+                return false;
+            }
+            final Phylogeny p49 = factory
+                    .create( new StringBuffer( "((A,B)a[comment:a,b;(a)]b:2[0.44][comment(a,b,b);],C)" ),
+                             new NHXParser() )[ 0 ];
+            if ( !isEqual( 0.44, p49.getNode( "ab" ).getBranchData().getConfidence( 0 ).getValue() ) ) {
+                return false;
+            }
+            final Phylogeny p50 = factory.create( new StringBuffer( "((\"A\",B)ab:2[88],C)" ), new NHXParser() )[ 0 ];
+            if ( p50.getNode( "A" ) == null ) {
+                return false;
+            }
+            if ( !p50.toNewHampshire( false, NH_CONVERSION_SUPPORT_VALUE_STYLE.IN_SQUARE_BRACKETS )
+                    .equals( "((A,B)ab:2.0[88.0],C);" ) ) {
+                return false;
+            }
+            if ( !p50.toNewHampshire( false, NH_CONVERSION_SUPPORT_VALUE_STYLE.NONE ).equals( "((A,B)ab:2.0,C);" ) ) {
+                return false;
+            }
+            if ( !p50.toNewHampshire( false, NH_CONVERSION_SUPPORT_VALUE_STYLE.AS_INTERNAL_NODE_NAMES )
+                    .equals( "((A,B)88.0:2.0,C);" ) ) {
+                return false;
+            }
+            final Phylogeny p51 = factory.create( new StringBuffer( "((\"A(A\",B)ab:2[88],C)" ), new NHXParser() )[ 0 ];
+            if ( p51.getNode( "A(A" ) == null ) {
+                return false;
+            }
+            final Phylogeny p52 = factory.create( new StringBuffer( "(('A(A',B)ab:2[88],C)" ), new NHXParser() )[ 0 ];
+            if ( p52.getNode( "A(A" ) == null ) {
+                return false;
+            }
+            final Phylogeny p53 = factory
+                    .create( new StringBuffer( "(('A(A',\"B (x (a' ,b) f(x);\"[com])[ment]ab:2[88],C)" ),
+                             new NHXParser() )[ 0 ];
+            if ( p53.getNode( "B (x (a' ,b) f(x);" ) == null ) {
+                return false;
+            }
         }
         catch ( final Exception e ) {
             e.printStackTrace( System.out );
@@ -4493,7 +4554,7 @@ public final class Test {
             if ( !n3.getName().equals( "n3" ) ) {
                 return false;
             }
-            if ( n3.getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) {
+            if ( n3.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) {
                 return false;
             }
             if ( n3.isDuplication() ) {
@@ -4536,7 +4597,8 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n8 = PhylogenyNode
-                    .createInstanceFromNhxString( "n8_ECOLI/12:0.01", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n8_ECOLI/12:0.01",
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n8.getName().equals( "n8_ECOLI/12" ) ) {
                 return false;
             }
@@ -4545,7 +4607,7 @@ public final class Test {
             }
             final PhylogenyNode n9 = PhylogenyNode
                     .createInstanceFromNhxString( "n9_ECOLI/12=12:0.01",
-                                                  ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n9.getName().equals( "n9_ECOLI/12=12" ) ) {
                 return false;
             }
@@ -4553,20 +4615,20 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n10 = PhylogenyNode
-                    .createInstanceFromNhxString( "n10.ECOLI", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n10.ECOLI", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n10.getName().equals( "n10.ECOLI" ) ) {
                 return false;
             }
             final PhylogenyNode n20 = PhylogenyNode
-                    .createInstanceFromNhxString( "n20_ECOLI/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n20_ECOLI/1-2", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n20.getName().equals( "n20_ECOLI/1-2" ) ) {
                 return false;
             }
             if ( !PhylogenyMethods.getSpecies( n20 ).equals( "ECOLI" ) ) {
                 return false;
             }
-            final PhylogenyNode n20x = PhylogenyNode.createInstanceFromNhxString( "n20_ECOL1/1-2",
-                                                                                  ForesterUtil.TAXONOMY_EXTRACTION.YES );
+            final PhylogenyNode n20x = PhylogenyNode
+                    .createInstanceFromNhxString( "n20_ECOL1/1-2", PhylogenyMethods.TAXONOMY_EXTRACTION.YES );
             if ( !n20x.getName().equals( "n20_ECOL1/1-2" ) ) {
                 return false;
             }
@@ -4574,7 +4636,7 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n20xx = PhylogenyNode
-                    .createInstanceFromNhxString( "n20_eCOL1/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n20_eCOL1/1-2", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n20xx.getName().equals( "n20_eCOL1/1-2" ) ) {
                 return false;
             }
@@ -4582,7 +4644,7 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n20xxx = PhylogenyNode
-                    .createInstanceFromNhxString( "n20_ecoli/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n20_ecoli/1-2", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n20xxx.getName().equals( "n20_ecoli/1-2" ) ) {
                 return false;
             }
@@ -4590,15 +4652,15 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n20xxxx = PhylogenyNode
-                    .createInstanceFromNhxString( "n20_Ecoli/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n20_Ecoli/1-2", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n20xxxx.getName().equals( "n20_Ecoli/1-2" ) ) {
                 return false;
             }
             if ( PhylogenyMethods.getSpecies( n20xxxx ).length() > 0 ) {
                 return false;
             }
-            final PhylogenyNode n21 = PhylogenyNode.createInstanceFromNhxString( "n21_PIG",
-                                                                                 ForesterUtil.TAXONOMY_EXTRACTION.YES );
+            final PhylogenyNode n21 = PhylogenyNode
+                    .createInstanceFromNhxString( "n21_PIG", PhylogenyMethods.TAXONOMY_EXTRACTION.YES );
             if ( !n21.getName().equals( "n21_PIG" ) ) {
                 return false;
             }
@@ -4606,7 +4668,7 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n21x = PhylogenyNode
-                    .createInstanceFromNhxString( "n21_PIG", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n21_PIG", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n21x.getName().equals( "n21_PIG" ) ) {
                 return false;
             }
@@ -4614,7 +4676,7 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n22 = PhylogenyNode
-                    .createInstanceFromNhxString( "n22/PIG", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n22/PIG", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n22.getName().equals( "n22/PIG" ) ) {
                 return false;
             }
@@ -4622,7 +4684,7 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n23 = PhylogenyNode
-                    .createInstanceFromNhxString( "n23/PIG_1", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "n23/PIG_1", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n23.getName().equals( "n23/PIG_1" ) ) {
                 return false;
             }
@@ -4631,7 +4693,8 @@ public final class Test {
             }
             if ( NHXParser.LIMIT_SPECIES_NAMES_TO_FIVE_CHARS ) {
                 final PhylogenyNode a = PhylogenyNode
-                        .createInstanceFromNhxString( "n10_ECOLI/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                        .createInstanceFromNhxString( "n10_ECOLI/1-2",
+                                                      PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
                 if ( !a.getName().equals( "n10_ECOLI/1-2" ) ) {
                     return false;
                 }
@@ -4640,7 +4703,7 @@ public final class Test {
                 }
                 final PhylogenyNode b = PhylogenyNode
                         .createInstanceFromNhxString( "n10_ECOLI1/1-2",
-                                                      ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                      PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
                 if ( !b.getName().equals( "n10_ECOLI1/1-2" ) ) {
                     return false;
                 }
@@ -4649,7 +4712,7 @@ public final class Test {
                 }
                 final PhylogenyNode c = PhylogenyNode
                         .createInstanceFromNhxString( "n10_RATAF12/1000-2000",
-                                                      ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                      PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
                 if ( !c.getName().equals( "n10_RATAF12/1000-2000" ) ) {
                     return false;
                 }
@@ -4657,7 +4720,8 @@ public final class Test {
                     return false;
                 }
                 final PhylogenyNode d = PhylogenyNode
-                        .createInstanceFromNhxString( "n10_RAT1/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                        .createInstanceFromNhxString( "n10_RAT1/1-2",
+                                                      PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
                 if ( !d.getName().equals( "n10_RAT1/1-2" ) ) {
                     return false;
                 }
@@ -4665,7 +4729,7 @@ public final class Test {
                     return false;
                 }
                 final PhylogenyNode e = PhylogenyNode
-                        .createInstanceFromNhxString( "n10_RAT1", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                        .createInstanceFromNhxString( "n10_RAT1", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
                 if ( !e.getName().equals( "n10_RAT1" ) ) {
                     return false;
                 }
@@ -4675,7 +4739,7 @@ public final class Test {
             }
             final PhylogenyNode n11 = PhylogenyNode
                     .createInstanceFromNhxString( "n111111_ECOLI/jdj:0.4",
-                                                  ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n11.getName().equals( "n111111_ECOLI/jdj" ) ) {
                 return false;
             }
@@ -4687,7 +4751,7 @@ public final class Test {
             }
             final PhylogenyNode n12 = PhylogenyNode
                     .createInstanceFromNhxString( "n111111-ECOLI---/jdj:0.4",
-                                                  ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n12.getName().equals( "n111111-ECOLI---/jdj" ) ) {
                 return false;
             }
@@ -4729,7 +4793,7 @@ public final class Test {
             if ( PhylogenyMethods.getConfidenceValue( n1 ) != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
                 return false;
             }
-            if ( n1.getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) {
+            if ( n1.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) {
                 return false;
             }
             if ( n2.getName().compareTo( "" ) != 0 ) {
@@ -4738,7 +4802,7 @@ public final class Test {
             if ( PhylogenyMethods.getConfidenceValue( n2 ) != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
                 return false;
             }
-            if ( n2.getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) {
+            if ( n2.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) {
                 return false;
             }
             final PhylogenyNode n00 = PhylogenyNode
@@ -4776,7 +4840,8 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n13 = PhylogenyNode
-                    .createInstanceFromNhxString( "blah_12345/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "blah_12345/1-2",
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n13.getName().equals( "blah_12345/1-2" ) ) {
                 return false;
             }
@@ -4784,7 +4849,8 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n14 = PhylogenyNode
-                    .createInstanceFromNhxString( "blah_12X45/1-2", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( "blah_12X45/1-2",
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n14.getName().equals( "blah_12X45/1-2" ) ) {
                 return false;
             }
@@ -4793,7 +4859,7 @@ public final class Test {
             }
             final PhylogenyNode n15 = PhylogenyNode
                     .createInstanceFromNhxString( "something_wicked[123]",
-                                                  ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n15.getName().equals( "something_wicked" ) ) {
                 return false;
             }
@@ -4805,7 +4871,7 @@ public final class Test {
             }
             final PhylogenyNode n16 = PhylogenyNode
                     .createInstanceFromNhxString( "something_wicked2[9]",
-                                                  ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n16.getName().equals( "something_wicked2" ) ) {
                 return false;
             }
@@ -4817,7 +4883,7 @@ public final class Test {
             }
             final PhylogenyNode n17 = PhylogenyNode
                     .createInstanceFromNhxString( "something_wicked3[a]",
-                                                  ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                                                  PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !n17.getName().equals( "something_wicked3" ) ) {
                 return false;
             }
@@ -4825,7 +4891,7 @@ public final class Test {
                 return false;
             }
             final PhylogenyNode n18 = PhylogenyNode
-                    .createInstanceFromNhxString( ":0.5[91]", ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
+                    .createInstanceFromNhxString( ":0.5[91]", PhylogenyMethods.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
             if ( !isEqual( n18.getDistanceToParent(), 0.5 ) ) {
                 return false;
             }
@@ -4855,7 +4921,7 @@ public final class Test {
             if ( !p2[ 0 ].toNewHampshireX().equals( p2_S ) ) {
                 return false;
             }
-            final String p2b_S = "(((((((A:0.2[&NHX:S=qwerty]):0.2[&:S=uiop]):0.3[&NHX:S=asdf]):0.4[S=zxc]):0.5[]):0.6[&&NH:S=asd]):0.7[&&HX:S=za]):0.8[&&:S=zaq]";
+            final String p2b_S = "(((((((A:0.2[&NHX:S=qw,erty]):0.2[&:S=u(io)p]):0.3[&NHX:S=asdf]):0.4[S=zxc]):0.5[]):0.6[&&NH:S=asd]):0.7[&&HX:S=za]):0.8[&&:S=zaq]";
             final Phylogeny[] p2b = factory.create( p2b_S, new NHXParser() );
             if ( !p2b[ 0 ].toNewHampshireX().equals( "(((((((A:0.2):0.2):0.3):0.4):0.5):0.6):0.7):0.8" ) ) {
                 return false;
@@ -5014,6 +5080,60 @@ public final class Test {
         return true;
     }
 
+    private static boolean testNHXParsingMB() {
+        try {
+            final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
+            final Phylogeny p1 = factory.create( "(1[&prob=0.9500000000000000e+00,prob_stddev=0.1100000000000000e+00,"
+                    + "prob_range={1.000000000000000e+00,1.000000000000000e+00},prob(percent)=\"100\","
+                    + "prob+-sd=\"100+-0\"]:4.129000000000000e-02[&length_mean=4.153987461671767e-02,"
+                    + "length_median=4.129000000000000e-02,length_95%HPD={3.217800000000000e-02,"
+                    + "5.026800000000000e-02}],2[&prob=0.810000000000000e+00,prob_stddev=0.000000000000000e+00,"
+                    + "prob_range={1.000000000000000e+00,1.000000000000000e+00},prob(percent)=\"100\","
+                    + "prob+-sd=\"100+-0\"]:6.375699999999999e-02[&length_mean=6.395210411945065e-02,"
+                    + "length_median=6.375699999999999e-02,length_95%HPD={5.388600000000000e-02,"
+                    + "7.369400000000000e-02}])", new NHXParser() )[ 0 ];
+            if ( !isEqual( p1.getNode( "1" ).getDistanceToParent(), 4.129e-02 ) ) {
+                return false;
+            }
+            if ( !isEqual( p1.getNode( "1" ).getBranchData().getConfidence( 0 ).getValue(), 0.9500000000000000e+00 ) ) {
+                return false;
+            }
+            if ( !isEqual( p1.getNode( "1" ).getBranchData().getConfidence( 0 ).getStandardDeviation(),
+                           0.1100000000000000e+00 ) ) {
+                return false;
+            }
+            if ( !isEqual( p1.getNode( "2" ).getDistanceToParent(), 6.375699999999999e-02 ) ) {
+                return false;
+            }
+            if ( !isEqual( p1.getNode( "2" ).getBranchData().getConfidence( 0 ).getValue(), 0.810000000000000e+00 ) ) {
+                return false;
+            }
+            final Phylogeny p2 = factory
+                    .create( "(1[something_else(?)s,prob=0.9500000000000000e+00{}(((,p)rob_stddev=0.110000000000e+00,"
+                                     + "prob_range={1.000000000000000e+00,1.000000000000000e+00},prob(percent)=\"100\","
+                                     + "prob+-sd=\"100+-0\"]:4.129000000000000e-02[&length_mean=4.153987461671767e-02,"
+                                     + "length_median=4.129000000000000e-02,length_95%HPD={3.217800000000000e-02,"
+                                     + "5.026800000000000e-02}],2[&prob=0.810000000000000e+00,prob_stddev=0.000000000000000e+00,"
+                                     + "prob_range={1.000000000000000e+00,1.000000000000000e+00},prob(percent)=\"100\","
+                                     + "prob+-sd=\"100+-0\"]:6.375699999999999e-02[&length_mean=6.395210411945065e-02,"
+                                     + "length_median=6.375699999999999e-02,length_95%HPD={5.388600000000000e-02,"
+                                     + "7.369400000000000e-02}])",
+                             new NHXParser() )[ 0 ];
+            if ( p2.getNode( "1" ) == null ) {
+                return false;
+            }
+            if ( p2.getNode( "2" ) == null ) {
+                return false;
+            }
+        }
+        catch ( final Exception e ) {
+            e.printStackTrace( System.out );
+            System.exit( -1 );
+            return false;
+        }
+        return true;
+    }
+
     private static boolean testPhylogenyBranch() {
         try {
             final PhylogenyNode a1 = PhylogenyNode.createInstanceFromNhxString( "a" );
@@ -7753,13 +7873,15 @@ public final class Test {
             if ( !results.get( 0 ).getScientificName().equals( "Nematostella vectensis" ) ) {
                 return false;
             }
-            if ( !results.get( 0 ).getLineage()[ 0 ].equals( "Eukaryota" ) ) {
+            if ( !results.get( 0 ).getLineage().get( 1 ).equals( "Eukaryota" ) ) {
                 return false;
             }
-            if ( !results.get( 0 ).getLineage()[ 1 ].equals( "Metazoa" ) ) {
+            if ( !results.get( 0 ).getLineage().get( 2 ).equals( "Metazoa" ) ) {
                 return false;
             }
-            if ( !results.get( 0 ).getLineage()[ results.get( 0 ).getLineage().length - 1 ].equals( "Nematostella" ) ) {
+            if ( !results.get( 0 ).getLineage().get( results.get( 0 ).getLineage().size() - 1 )
+                    .equals( "Nematostella vectensis" ) ) {
+                System.out.println( results.get( 0 ).getLineage() );
                 return false;
             }
         }