JAL-1953 JAL-2852 added public "paintFile" method
[jalview.git] / forester / java / src / org / forester / surfacing / TestSurfacing.java
1 // $Id:
2 //
3 // FORESTER -- software libraries and applications
4 // for evolutionary biology research and applications.
5 //
6 // Copyright (C) 2008-2009 Christian M. Zmasek
7 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
8 // All rights reserved
9 //
10 // This library is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU Lesser General Public
12 // License as published by the Free Software Foundation; either
13 // version 2.1 of the License, or (at your option) any later version.
14 //
15 // This library is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public
21 // License along with this library; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 //
24 // Contact: phylosoft @ gmail . com
25 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
26
27 package org.forester.surfacing;
28
29 import java.io.File;
30 import java.util.ArrayList;
31 import java.util.HashMap;
32 import java.util.HashSet;
33 import java.util.Iterator;
34 import java.util.List;
35 import java.util.Map;
36 import java.util.Set;
37 import java.util.SortedSet;
38 import java.util.TreeSet;
39
40 import org.forester.evoinference.matrix.character.BasicCharacterStateMatrix;
41 import org.forester.evoinference.matrix.character.CharacterStateMatrix;
42 import org.forester.evoinference.matrix.character.CharacterStateMatrix.BinaryStates;
43 import org.forester.evoinference.matrix.character.CharacterStateMatrix.GainLossStates;
44 import org.forester.io.parsers.HmmPfamOutputParser;
45 import org.forester.io.parsers.nhx.NHXParser;
46 import org.forester.phylogeny.Phylogeny;
47 import org.forester.phylogeny.PhylogenyNode;
48 import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory;
49 import org.forester.phylogeny.factories.PhylogenyFactory;
50 import org.forester.protein.BasicDomain;
51 import org.forester.protein.BasicProtein;
52 import org.forester.protein.BinaryDomainCombination;
53 import org.forester.protein.BinaryDomainCombination.DomainCombinationType;
54 import org.forester.protein.Domain;
55 import org.forester.protein.Protein;
56 import org.forester.protein.ProteinId;
57 import org.forester.species.BasicSpecies;
58 import org.forester.species.Species;
59 import org.forester.util.ForesterUtil;
60
61 @SuppressWarnings( "unused")
62 public class TestSurfacing {
63
64     private final static double ZERO_DIFF = 1.0E-9;
65
66     public static boolean isEqual( final double a, final double b ) {
67         return ( ( Math.abs( a - b ) ) < TestSurfacing.ZERO_DIFF );
68     }
69
70     public static boolean test( final File test_dir ) {
71         System.out.print( "  Combinable domains: " );
72         if ( !TestSurfacing.testCombinableDomains() ) {
73             System.out.println( "failed." );
74             return false;
75         }
76         System.out.println( "OK." );
77         System.out.print( "  Directed combinable domains: " );
78         if ( !TestSurfacing.testDirectedCombinableDomains() ) {
79             System.out.println( "failed." );
80             return false;
81         }
82         System.out.println( "OK." );
83         System.out.print( "  Genome wide specific combinable domains: " );
84         if ( !TestSurfacing.testGenomeWideCombinableDomains() ) {
85             System.out.println( "failed." );
86             return false;
87         }
88         System.out.println( "OK." );
89         System.out.print( "  Domain architecture based genome similarity calculator: " );
90         if ( !TestSurfacing.testDomainArchitectureBasedGenomeSimilarityCalculator() ) {
91             System.out.println( "failed." );
92             return false;
93         }
94         System.out.println( "OK." );
95         System.out.print( "  Hmmpfam output parser: " );
96         if ( !TestSurfacing.testHmmPfamOutputParser( test_dir ) ) {
97             System.out.println( "failed." );
98             return false;
99         }
100         System.out.println( "OK." );
101         System.out.print( "  Hmmpfam output parser with filter: " );
102         if ( !TestSurfacing.testHmmPfamOutputParserWithFilter( test_dir ) ) {
103             System.out.println( "failed." );
104             return false;
105         }
106         System.out.println( "OK." );
107         System.out.print( "  Combinations based pairwise similarity calculator: " );
108         if ( !TestSurfacing.testCombinationsBasedPairwiseSimilarityCalculator() ) {
109             System.out.println( "failed." );
110             return false;
111         }
112         System.out.println( "OK." );
113         System.out.print( "  Copy number based pairwise similarity calculator: " );
114         if ( !TestSurfacing.testCopyNumberBasedPairwiseSimilarityCalculator() ) {
115             return false;
116         }
117         System.out.println( "OK." );
118         System.out.print( "  Domain combination counting: " );
119         if ( !TestSurfacing.testDomainCombinationCounting( test_dir ) ) {
120             System.out.println( "failed." );
121             return false;
122         }
123         System.out.println( "OK." );
124         System.out.print( "  Basic domain similarity calculator: " );
125         if ( !TestSurfacing.testBasicDomainSimilarityCalculator() ) {
126             System.out.println( "failed." );
127             return false;
128         }
129         System.out.println( "OK." );
130         System.out.print( "  Basic domain similarity calculator not ignoring species specific domains: " );
131         if ( !TestSurfacing.testBasicDomainSimilarityCalculatorNotIgnoringSpeciesSpeficDomains() ) {
132             System.out.println( "failed." );
133             return false;
134         }
135         System.out.println( "OK." );
136         System.out.print( "  Basic domain similarity calculator removal of singles: " );
137         if ( !TestSurfacing.testBasicDomainSimilarityCalculatorRemovalOfSingles() ) {
138             System.out.println( "failed." );
139             return false;
140         }
141         System.out.println( "OK." );
142         System.out.print( "  Domain sorting: " );
143         if ( !TestSurfacing.testDomainSorting() ) {
144             System.out.println( "failed." );
145             return false;
146         }
147         System.out.println( "OK." );
148         System.out.print( "  Binary domain combination: " );
149         if ( !TestSurfacing.testBinaryDomainCombination() ) {
150             System.out.println( "failed." );
151             return false;
152         }
153         System.out.println( "OK." );
154         System.out.print( "  Parsimony: " );
155         if ( !TestSurfacing.testParsimony() ) {
156             System.out.println( "failed." );
157             return false;
158         }
159         System.out.println( "OK." );
160         System.out.print( "  Directedness: " );
161         if ( !TestSurfacing.testDirectedness() ) {
162             System.out.println( "failed." );
163             return false;
164         }
165         System.out.println( "OK." );
166         System.out.print( "  Directedness and adjacency: " );
167         if ( !TestSurfacing.testDirectednessAndAdjacency() ) {
168             System.out.println( "failed." );
169             return false;
170         }
171         System.out.println( "OK." );
172         System.out.print( "  Dollo parsimony on secodary features: " );
173         if ( !TestSurfacing.testParsimonyOnSecondaryFeatures() ) {
174             System.out.println( "failed." );
175             return false;
176         }
177         System.out.println( "OK." );
178        
179         System.out.print( "  Binary state matrix to gain loss matrix: " );
180         if ( !TestSurfacing.testBinaryStateMatrixToGainLossMatrix( test_dir ) ) {
181             System.out.println( "failed." );
182             return false;
183         }
184         System.out.println( "OK." );
185         return true;
186     }
187
188     private static StringBuffer mapToStringBuffer( final Map<PhylogenyNode, CharacterStateMatrix.BinaryStates> map ) {
189         final StringBuffer sb = new StringBuffer();
190         for( final PhylogenyNode key : map.keySet() ) {
191             if ( !key.isExternal() ) {
192                 sb.append( key.getName() );
193                 sb.append( " : " );
194                 sb.append( map.get( key ).toString() );
195                 sb.append( ForesterUtil.getLineSeparator() );
196             }
197         }
198         return sb;
199     }
200
201     private static boolean testBasicDomainSimilarityCalculator() {
202         // mouse : ABCDE
203         // rabbit: A.C.EF
204         // ciona : A....FGX
205         // nemve : ABCDEFG
206         //
207         // domain A:
208         // m r c n
209         // m 2/(2+3) 0 4/(4+2)
210         // r 1/(1+4) 3/(3+3)
211         // c 2/(2+5)
212         // n
213         //
214         // mean = ( 2/5 + 0 + 2/3 + 1/5 + 1/2 + 2/7 ) / 6
215         // min = 0.0
216         // max = 2/3
217         // n = 6
218         //
219         //
220         // domain B:
221         // m n
222         // m 4/(4+2)
223         // n
224         //
225         // mean = 2/3
226         // min = 2/3
227         // max = 2/3
228         // sd = 0.0
229         // n = 1
230         //
231         //
232         // domain C:
233         // m r n
234         // m - 2/(2+3) 4/(4+2)
235         // r - - 3/(3+3)
236         // n - - -
237         //
238         // mean = (2/5 + 2/3 + 1/2)/3 =
239         // min = 2/5
240         // max = 2/3
241         // sd = 0.0
242         // n = 3
243         try {
244             final Domain A = new BasicDomain( "A", 1, 2, ( short ) 1, ( short ) 1, 0.15, -12 );
245             final Domain B = new BasicDomain( "B", 1, 2, ( short ) 1, ( short ) 1, 0.2, -12 );
246             final Domain C = new BasicDomain( "C", 1, 2, ( short ) 1, ( short ) 1, 0.3, -12 );
247             final Domain D = new BasicDomain( "D", 1, 2, ( short ) 1, ( short ) 1, 0.5, -12 );
248             final Domain E = new BasicDomain( "E", 1, 2, ( short ) 1, ( short ) 1, 0.5, -12 );
249             final Domain F = new BasicDomain( "F", 1, 2, ( short ) 1, ( short ) 1, 0.01, -12 );
250             final Domain G = new BasicDomain( "G", 1, 2, ( short ) 1, ( short ) 1, 0.001, -12 );
251             final Domain X = new BasicDomain( "X", 1, 2, ( short ) 1, ( short ) 1, 0.0001, -12 );
252             final Protein mouse_1 = new BasicProtein( "1", "mouse", 0 );
253             final Protein rabbit_1 = new BasicProtein( "1", "rabbit", 0 );
254             final Protein ciona_1 = new BasicProtein( "1", "ciona", 0 );
255             final Protein nemve_1 = new BasicProtein( "1", "nemve", 0 );
256             mouse_1.addProteinDomain( A );
257             mouse_1.addProteinDomain( B );
258             mouse_1.addProteinDomain( C );
259             mouse_1.addProteinDomain( D );
260             mouse_1.addProteinDomain( E );
261             rabbit_1.addProteinDomain( A );
262             rabbit_1.addProteinDomain( C );
263             rabbit_1.addProteinDomain( E );
264             rabbit_1.addProteinDomain( F );
265             rabbit_1.addProteinDomain( F );
266             rabbit_1.addProteinDomain( F );
267             rabbit_1.addProteinDomain( F );
268             rabbit_1.addProteinDomain( F );
269             rabbit_1.addProteinDomain( F );
270             ciona_1.addProteinDomain( A );
271             ciona_1.addProteinDomain( A );
272             ciona_1.addProteinDomain( A );
273             ciona_1.addProteinDomain( A );
274             ciona_1.addProteinDomain( A );
275             ciona_1.addProteinDomain( F );
276             ciona_1.addProteinDomain( G );
277             ciona_1.addProteinDomain( X );
278             nemve_1.addProteinDomain( A );
279             nemve_1.addProteinDomain( B );
280             nemve_1.addProteinDomain( C );
281             nemve_1.addProteinDomain( D );
282             nemve_1.addProteinDomain( E );
283             nemve_1.addProteinDomain( F );
284             nemve_1.addProteinDomain( G );
285             final List<Protein> protein_list_mouse = new ArrayList<Protein>();
286             final List<Protein> protein_list_rabbit = new ArrayList<Protein>();
287             final List<Protein> protein_list_ciona = new ArrayList<Protein>();
288             final List<Protein> protein_list_nemve = new ArrayList<Protein>();
289             protein_list_mouse.add( mouse_1 );
290             protein_list_rabbit.add( rabbit_1 );
291             protein_list_ciona.add( ciona_1 );
292             protein_list_nemve.add( nemve_1 );
293             final List<GenomeWideCombinableDomains> cdc_list = new ArrayList<GenomeWideCombinableDomains>();
294             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
295                                                                            true,
296                                                                            new BasicSpecies( "mouse" ) ) );
297             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
298                                                                            true,
299                                                                            new BasicSpecies( "rabbit" ) ) );
300             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
301                                                                            true,
302                                                                            new BasicSpecies( "ciona" ) ) );
303             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
304                                                                            true,
305                                                                            new BasicSpecies( "nemve" ) ) );
306             final DomainSimilarityCalculator calc = new BasicDomainSimilarityCalculator( DomainSimilarity.DomainSimilaritySortField.DOMAIN_ID,
307                                                                                          false,
308                                                                                          false,
309                                                                                          true );
310             final SortedSet<DomainSimilarity> sims = calc
311                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
312                                             cdc_list,
313                                             true,
314                                             true );
315             final Iterator<DomainSimilarity> sims_it = sims.iterator();
316             final DomainSimilarity sa = sims_it.next();
317             if ( !sa.getDomainId().equals( "A" ) ) {
318                 return false;
319             }
320             if ( sa.getSpeciesData().size() != 4 ) {
321                 return false;
322             }
323             if ( !sa.getSpecies().contains( new BasicSpecies( "ciona" ) ) ) {
324                 return false;
325             }
326             if ( !sa.getSpecies().contains( new BasicSpecies( "mouse" ) ) ) {
327                 return false;
328             }
329             if ( !sa.getSpecies().contains( new BasicSpecies( "nemve" ) ) ) {
330                 return false;
331             }
332             if ( !sa.getSpecies().contains( new BasicSpecies( "rabbit" ) ) ) {
333                 return false;
334             }
335             if ( !TestSurfacing.isEqual( sa.getMeanSimilarityScore(), ( ( 2.0 / 5 ) + 0 + ( 2.0 / 3 ) + ( 1.0 / 5 )
336                     + ( 1.0 / 2 ) + ( 2.0 / 7 ) ) / 6 ) ) {
337                 return false;
338             }
339             if ( !TestSurfacing.isEqual( sa.getStandardDeviationOfSimilarityScore(), ( 0.23410788192183737 ) ) ) {
340                 return false;
341             }
342             if ( !TestSurfacing.isEqual( sa.getMaximalSimilarityScore(), ( 2.0 / 3 ) ) ) {
343                 return false;
344             }
345             if ( !TestSurfacing.isEqual( sa.getMinimalSimilarityScore(), ( 0.0 ) ) ) {
346                 return false;
347             }
348             if ( sa.getN() != 6 ) {
349                 return false;
350             }
351             if ( sa.getMaximalDifference() != 7 ) {
352                 return false;
353             }
354             if ( sa.getMaximalDifferenceInCounts() != 3 ) {
355                 return false;
356             }
357             final DomainSimilarity sb = sims_it.next();
358             if ( !sb.getDomainId().equals( "B" ) ) {
359                 return false;
360             }
361             if ( sb.getSpeciesData().size() != 2 ) {
362                 return false;
363             }
364             if ( !sb.getSpecies().contains( new BasicSpecies( "mouse" ) ) ) {
365                 return false;
366             }
367             if ( !sb.getSpecies().contains( new BasicSpecies( "nemve" ) ) ) {
368                 return false;
369             }
370             if ( !TestSurfacing.isEqual( sb.getMeanSimilarityScore(), 2.0 / 3 ) ) {
371                 return false;
372             }
373             if ( !TestSurfacing.isEqual( sb.getStandardDeviationOfSimilarityScore(), 0.0 ) ) {
374                 return false;
375             }
376             if ( !TestSurfacing.isEqual( sb.getMaximalSimilarityScore(), ( 2.0 / 3 ) ) ) {
377                 return false;
378             }
379             if ( !TestSurfacing.isEqual( sb.getMinimalSimilarityScore(), ( 2.0 / 3 ) ) ) {
380                 return false;
381             }
382             if ( sb.getN() != 1 ) {
383                 return false;
384             }
385             if ( sb.getMaximalDifference() != 2 ) {
386                 return false;
387             }
388             if ( sb.getMaximalDifferenceInCounts() != 2 ) {
389                 return false;
390             }
391             final DomainSimilarity sc = sims_it.next();
392             if ( !sc.getDomainId().equals( "C" ) ) {
393                 return false;
394             }
395             if ( sc.getSpeciesData().size() != 3 ) {
396                 return false;
397             }
398             if ( !sc.getSpecies().contains( new BasicSpecies( "mouse" ) ) ) {
399                 return false;
400             }
401             if ( !sc.getSpecies().contains( new BasicSpecies( "rabbit" ) ) ) {
402                 return false;
403             }
404             if ( !sc.getSpecies().contains( new BasicSpecies( "nemve" ) ) ) {
405                 return false;
406             }
407             if ( !TestSurfacing.isEqual( sc.getMeanSimilarityScore(), ( ( 2.0 / 5 ) + ( 2.0 / 3 ) + ( 1.0 / 2 ) ) / 3 ) ) {
408                 return false;
409             }
410             if ( !TestSurfacing.isEqual( sc.getStandardDeviationOfSimilarityScore(), 0.13471506281091264 ) ) {
411                 return false;
412             }
413             if ( !TestSurfacing.isEqual( sc.getMaximalSimilarityScore(), ( 2.0 / 3 ) ) ) {
414                 return false;
415             }
416             if ( !TestSurfacing.isEqual( sc.getMinimalSimilarityScore(), ( 2.0 / 5 ) ) ) {
417                 return false;
418             }
419             if ( sc.getN() != 3 ) {
420                 return false;
421             }
422             if ( sc.getMaximalDifference() != 3 ) {
423                 return false;
424             }
425             if ( sc.getMaximalDifferenceInCounts() != 3 ) {
426                 return false;
427             }
428             // mouse : ....ABCDE.....
429             // rabbit: ....A.C.EFFF..
430             // ciona : AAAAA......FGX
431             // nemve : ....ABCDEFG...
432             //
433             // domain A:
434             // m r c n
435             // m 2/(2+3) 0 4/(4+2)
436             // r - 1/(1+5) 3/(3+3)
437             // c - 2/(2+6)
438             // n
439             //
440             // mean = ( 2/5 + 0 + 2/3 + 1/6 + 1/2 + 2/8 ) / 6
441             // min = 0.0
442             // max = 2/3
443             // n = 6
444             final List<GenomeWideCombinableDomains> cdc_list2 = new ArrayList<GenomeWideCombinableDomains>();
445             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
446                                                                             false,
447                                                                             new BasicSpecies( "mouse" ) ) );
448             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
449                                                                             false,
450                                                                             new BasicSpecies( "rabbit" ) ) );
451             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
452                                                                             false,
453                                                                             new BasicSpecies( "ciona" ) ) );
454             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
455                                                                             false,
456                                                                             new BasicSpecies( "nemve" ) ) );
457             final DomainSimilarityCalculator calc2 = new BasicDomainSimilarityCalculator( DomainSimilarity.DomainSimilaritySortField.DOMAIN_ID,
458                                                                                           false,
459                                                                                           false,
460                                                                                           true );
461             final SortedSet<DomainSimilarity> sims2 = calc2
462                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
463                                             cdc_list2,
464                                             false,
465                                             true );
466             final Iterator<DomainSimilarity> sims_it2 = sims2.iterator();
467             final DomainSimilarity sa2 = sims_it2.next();
468             if ( !sa2.getDomainId().equals( "A" ) ) {
469                 return false;
470             }
471             if ( sa2.getSpeciesData().size() != 4 ) {
472                 return false;
473             }
474             if ( !sa2.getSpecies().contains( new BasicSpecies( "ciona" ) ) ) {
475                 return false;
476             }
477             if ( !sa2.getSpecies().contains( new BasicSpecies( "mouse" ) ) ) {
478                 return false;
479             }
480             if ( !sa2.getSpecies().contains( new BasicSpecies( "nemve" ) ) ) {
481                 return false;
482             }
483             if ( !sa2.getSpeciesData().keySet().contains( new BasicSpecies( "rabbit" ) ) ) {
484                 return false;
485             }
486             if ( !TestSurfacing.isEqual( sa2.getMeanSimilarityScore(), ( ( 2.0 / 5 ) + 0 + ( 2.0 / 3 ) + ( 1.0 / 6 )
487                     + ( 1.0 / 2 ) + ( 2.0 / 8 ) ) / 6 ) ) {
488                 return false;
489             }
490             if ( !TestSurfacing.isEqual( sa2.getStandardDeviationOfSimilarityScore(), ( 0.2404663678647683 ) ) ) {
491                 return false;
492             }
493             if ( !TestSurfacing.isEqual( sa2.getMaximalSimilarityScore(), ( 2.0 / 3 ) ) ) {
494                 return false;
495             }
496             if ( !TestSurfacing.isEqual( sa2.getMinimalSimilarityScore(), ( 0.0 ) ) ) {
497                 return false;
498             }
499             if ( sa2.getN() != 6 ) {
500                 return false;
501             }
502             if ( sa2.getMaximalDifference() != 8 ) {
503                 return false;
504             }
505             if ( sa2.getMaximalDifferenceInCounts() != 3 ) {
506                 return false;
507             }
508             final Protein ciona_2 = new BasicProtein( "2", "ciona", 0 );
509             ciona_2.addProteinDomain( A );
510             ciona_2.addProteinDomain( A );
511             ciona_2.addProteinDomain( A );
512             ciona_2.addProteinDomain( B );
513             ciona_2.addProteinDomain( B );
514             ciona_2.addProteinDomain( B );
515             ciona_2.addProteinDomain( F );
516             ciona_2.addProteinDomain( F );
517             ciona_2.addProteinDomain( F );
518             ciona_2.addProteinDomain( F );
519             ciona_2.addProteinDomain( G );
520             ciona_2.addProteinDomain( X );
521             final Protein ciona_3 = new BasicProtein( "3", "ciona", 0 );
522             ciona_3.addProteinDomain( A );
523             ciona_3.addProteinDomain( A );
524             ciona_3.addProteinDomain( A );
525             ciona_3.addProteinDomain( A );
526             ciona_3.addProteinDomain( B );
527             ciona_3.addProteinDomain( B );
528             ciona_3.addProteinDomain( X );
529             ciona_3.addProteinDomain( X );
530             protein_list_ciona.add( ciona_2 );
531             protein_list_ciona.add( ciona_3 );
532             final List<GenomeWideCombinableDomains> cdc_list3 = new ArrayList<GenomeWideCombinableDomains>();
533             cdc_list3.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
534                                                                             true,
535                                                                             new BasicSpecies( "mouse" ) ) );
536             cdc_list3.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
537                                                                             true,
538                                                                             new BasicSpecies( "rabbit" ) ) );
539             cdc_list3.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
540                                                                             true,
541                                                                             new BasicSpecies( "ciona" ) ) );
542             cdc_list3.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
543                                                                             true,
544                                                                             new BasicSpecies( "nemve" ) ) );
545             final DomainSimilarityCalculator calc3 = new BasicDomainSimilarityCalculator( DomainSimilarity.DomainSimilaritySortField.DOMAIN_ID,
546                                                                                           false,
547                                                                                           false,
548                                                                                           true );
549             final SortedSet<DomainSimilarity> sims3 = calc3
550                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
551                                             cdc_list3,
552                                             false,
553                                             true );
554             final Iterator<DomainSimilarity> sims_it3 = sims3.iterator();
555             final DomainSimilarity sa3 = sims_it3.next();
556             if ( !sa3.getDomainId().equals( "A" ) ) {
557                 return false;
558             }
559             final SpeciesSpecificDcData ssdsd = sa3.getSpeciesData().get( new BasicSpecies( "ciona" ) );
560             if ( ssdsd.getCombinableDomainIdToCountsMap().size() != 4 ) {
561                 return false;
562             }
563             if ( ssdsd.getNumberOfProteinsExhibitingCombinationWith( "B" ) != 2 ) {
564                 return false;
565             }
566             if ( ssdsd.getNumberOfProteinsExhibitingCombinationWith( "F" ) != 2 ) {
567                 return false;
568             }
569             if ( ssdsd.getNumberOfProteinsExhibitingCombinationWith( "G" ) != 2 ) {
570                 return false;
571             }
572             if ( ssdsd.getNumberOfProteinsExhibitingCombinationWith( "X" ) != 3 ) {
573                 return false;
574             }
575             final List<GenomeWideCombinableDomains> cdc_list4 = new ArrayList<GenomeWideCombinableDomains>();
576             cdc_list4.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
577                                                                             false,
578                                                                             new BasicSpecies( "mouse" ) ) );
579             cdc_list4.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
580                                                                             false,
581                                                                             new BasicSpecies( "rabbit" ) ) );
582             cdc_list4.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
583                                                                             false,
584                                                                             new BasicSpecies( "ciona" ) ) );
585             ;
586             cdc_list4.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
587                                                                             false,
588                                                                             new BasicSpecies( "nemve" ) ) );
589             final DomainSimilarityCalculator calc4 = new BasicDomainSimilarityCalculator( DomainSimilarity.DomainSimilaritySortField.DOMAIN_ID,
590                                                                                           true,
591                                                                                           false,
592                                                                                           true );
593             final SortedSet<DomainSimilarity> sims4 = calc4
594                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
595                                             cdc_list4,
596                                             false,
597                                             true );
598             final Iterator<DomainSimilarity> sims_it4 = sims4.iterator();
599             final DomainSimilarity sa4 = sims_it4.next();
600             if ( !sa4.getDomainId().equals( "A" ) ) {
601                 return false;
602             }
603             final SpeciesSpecificDcData ssdsd4 = sa4.getSpeciesData().get( new BasicSpecies( "ciona" ) );
604             if ( ssdsd4.getCombinableDomainIdToCountsMap().size() != 5 ) {
605                 return false;
606             }
607             if ( ssdsd4.getNumberOfProteinsExhibitingCombinationWith( "A" ) != 3 ) {
608                 return false;
609             }
610             if ( ssdsd4.getNumberOfProteinsExhibitingCombinationWith( "B" ) != 2 ) {
611                 return false;
612             }
613             if ( ssdsd4.getNumberOfProteinsExhibitingCombinationWith( "F" ) != 2 ) {
614                 return false;
615             }
616             if ( ssdsd4.getNumberOfProteinsExhibitingCombinationWith( "G" ) != 2 ) {
617                 return false;
618             }
619             if ( ssdsd4.getNumberOfProteinsExhibitingCombinationWith( "X" ) != 3 ) {
620                 return false;
621             }
622             final SortedSet<DomainSimilarity> sims4_d = calc4
623                     .calculateSimilarities( new DomainCountsBasedPairwiseSimilarityCalculator(), cdc_list4, false, true );
624             final Iterator<DomainSimilarity> sims_it4_d = sims4_d.iterator();
625             final DomainSimilarity sa4_d = sims_it4_d.next();
626             if ( !sa4_d.getDomainId().equals( "A" ) ) {
627                 return false;
628             }
629             if ( sa4_d.getCombinableDomainIds( new BasicSpecies( "ciona" ) ).size() != 5 ) {
630                 return false;
631             }
632             if ( !TestSurfacing
633                     .isEqual( sa4_d.getMeanSimilarityScore(),
634                               ( ( ( ( ( ( 1 + 1 ) - ( 11.0 / 13 ) ) + 1 ) - ( 11.0 / 13 ) ) + 1 + 1 + 1 ) - ( 11.0 / 13 ) ) / 6.0 ) ) {
635                 return false;
636             }
637             if ( !TestSurfacing.isEqual( sa4_d.getMaximalSimilarityScore(), 1.0 ) ) {
638                 return false;
639             }
640             if ( !TestSurfacing.isEqual( sa4_d.getMinimalSimilarityScore(), ( 1 - ( 11.0 / 13 ) ) ) ) {
641                 return false;
642             }
643             if ( sa4_d.getN() != 6 ) {
644                 return false;
645             }
646             final SortedSet<DomainSimilarity> sims4_p = calc4
647                     .calculateSimilarities( new ProteinCountsBasedPairwiseDomainSimilarityCalculator(),
648                                             cdc_list4,
649                                             false,
650                                             true );
651             final Iterator<DomainSimilarity> sims_it4_p = sims4_p.iterator();
652             final DomainSimilarity sa4_p = sims_it4_p.next();
653             if ( !sa4_p.getDomainId().equals( "A" ) ) {
654                 return false;
655             }
656             if ( sa4_p.getCombinableDomainIds( new BasicSpecies( "ciona" ) ).size() != 5 ) {
657                 return false;
658             }
659             if ( !sa4_p.getCombinableDomainIds( new BasicSpecies( "ciona" ) ).contains( "A" ) ) {
660                 return false;
661             }
662             if ( !sa4_p.getCombinableDomainIds( new BasicSpecies( "ciona" ) ).contains( "B" ) ) {
663                 return false;
664             }
665             if ( !sa4_p.getCombinableDomainIds( new BasicSpecies( "ciona" ) ).contains( "F" ) ) {
666                 return false;
667             }
668             if ( !sa4_p.getCombinableDomainIds( new BasicSpecies( "ciona" ) ).contains( "G" ) ) {
669                 return false;
670             }
671             if ( !sa4_p.getCombinableDomainIds( new BasicSpecies( "ciona" ) ).contains( "X" ) ) {
672                 return false;
673             }
674             if ( !TestSurfacing
675                     .isEqual( sa4_p.getMeanSimilarityScore(),
676                               ( ( ( ( ( ( 1 + 1 ) - ( 2.0 / 4 ) ) + 1 ) - ( 2.0 / 4 ) ) + 1 + 1 + 1 ) - ( 2.0 / 4 ) ) / 6.0 ) ) {
677                 return false;
678             }
679             if ( !TestSurfacing.isEqual( sa4_p.getMaximalSimilarityScore(), 1 ) ) {
680                 return false;
681             }
682             if ( !TestSurfacing.isEqual( sa4_p.getMinimalSimilarityScore(), ( 1 - ( 2.0 / 4 ) ) ) ) {
683                 return false;
684             }
685             if ( sa4_p.getN() != 6 ) {
686                 return false;
687             }
688             final List<GenomeWideCombinableDomains> cdc_list5 = new ArrayList<GenomeWideCombinableDomains>();
689             cdc_list5.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
690                                                                             true,
691                                                                             new BasicSpecies( "mouse" ) ) );
692             cdc_list5.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
693                                                                             true,
694                                                                             new BasicSpecies( "rabbit" ) ) );
695             cdc_list5.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
696                                                                             true,
697                                                                             new BasicSpecies( "ciona" ) ) );
698             cdc_list5.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
699                                                                             true,
700                                                                             new BasicSpecies( "nemve" ) ) );
701             final SortedSet<DomainSimilarity> sims5_d = calc4
702                     .calculateSimilarities( new DomainCountsBasedPairwiseSimilarityCalculator(), cdc_list5, false, true );
703             final Iterator<DomainSimilarity> sims_it5_d = sims5_d.iterator();
704             final DomainSimilarity sa5_d = sims_it5_d.next();
705             if ( sa5_d.getSpecies().size() != 4 ) {
706                 return false;
707             }
708             if ( !sa5_d.getSpecies().last().equals( new BasicSpecies( "rabbit" ) ) ) {
709                 return false;
710             }
711             final SpeciesSpecificDcData ssdsd5 = sa5_d.getSpeciesData().get( new BasicSpecies( "ciona" ) );
712             if ( ssdsd5.getCombinableDomainIdToCountsMap().size() != 4 ) {
713                 return false;
714             }
715             if ( ssdsd5.getNumberOfProteinsExhibitingCombinationWith( "B" ) != 2 ) {
716                 return false;
717             }
718             if ( ssdsd5.getNumberOfProteinsExhibitingCombinationWith( "F" ) != 2 ) {
719                 return false;
720             }
721             if ( ssdsd5.getNumberOfProteinsExhibitingCombinationWith( "G" ) != 2 ) {
722                 return false;
723             }
724             if ( ssdsd5.getNumberOfProteinsExhibitingCombinationWith( "X" ) != 3 ) {
725                 return false;
726             }
727             if ( !sa5_d.getDomainId().equals( "A" ) ) {
728                 return false;
729             }
730             final Species ciona = new BasicSpecies( "ciona" );
731             if ( sa5_d.getCombinableDomainIds( ciona ).size() != 4 ) {
732                 return false;
733             }
734             if ( sa5_d.getCombinableDomainIds( ciona ).contains( "A" ) ) {
735                 return false;
736             }
737             if ( !sa5_d.getCombinableDomainIds( ciona ).contains( "B" ) ) {
738                 return false;
739             }
740             if ( !sa5_d.getCombinableDomainIds( ciona ).contains( "F" ) ) {
741                 return false;
742             }
743             if ( !sa5_d.getCombinableDomainIds( ciona ).contains( "G" ) ) {
744                 return false;
745             }
746             if ( !sa5_d.getCombinableDomainIds( ciona ).contains( "X" ) ) {
747                 return false;
748             }
749             if ( !TestSurfacing
750                     .isEqual( sa5_d.getMeanSimilarityScore(),
751                               ( ( ( ( ( ( 1 + 1 ) - ( 11.0 / 13 ) ) + 1 ) - ( 11.0 / 13 ) ) + 1 + 1 + 1 ) - ( 11.0 / 13 ) ) / 6.0 ) ) {
752                 return false;
753             }
754             if ( !TestSurfacing.isEqual( sa5_d.getMaximalSimilarityScore(), 1.0 ) ) {
755                 return false;
756             }
757             if ( !TestSurfacing.isEqual( sa5_d.getMinimalSimilarityScore(), ( 1 - ( 11.0 / 13 ) ) ) ) {
758                 return false;
759             }
760             if ( sa5_d.getN() != 6 ) {
761                 return false;
762             }
763             if ( sa5_d.getMaximalDifference() != sa5_d.getMaximalDifferenceInCounts() ) {
764                 return false;
765             }
766             if ( sa5_d.getMaximalDifference() != 11 ) {
767                 return false;
768             }
769             if ( sa5_d.getMaximalDifferenceInCounts() != 11 ) {
770                 return false;
771             }
772             final SortedSet<DomainSimilarity> sims5_p = calc4
773                     .calculateSimilarities( new ProteinCountsBasedPairwiseDomainSimilarityCalculator(),
774                                             cdc_list5,
775                                             false,
776                                             true );
777             final Iterator<DomainSimilarity> sims_it5_p = sims5_p.iterator();
778             final DomainSimilarity sa5_p = sims_it5_p.next();
779             if ( !sa5_p.getDomainId().equals( "A" ) ) {
780                 return false;
781             }
782             if ( sa5_p.getCombinableDomainIds( ciona ).size() != 4 ) {
783                 return false;
784             }
785             if ( sa5_p.getCombinableDomainIds( ciona ).contains( "A" ) ) {
786                 return false;
787             }
788             if ( !sa5_p.getCombinableDomainIds( ciona ).contains( "B" ) ) {
789                 return false;
790             }
791             if ( !sa5_p.getCombinableDomainIds( ciona ).contains( "F" ) ) {
792                 return false;
793             }
794             if ( !sa5_p.getCombinableDomainIds( ciona ).contains( "G" ) ) {
795                 return false;
796             }
797             if ( !sa5_p.getCombinableDomainIds( ciona ).contains( "X" ) ) {
798                 return false;
799             }
800             if ( !TestSurfacing
801                     .isEqual( sa5_p.getMeanSimilarityScore(),
802                               ( ( ( ( ( ( 1 + 1 ) - ( 2.0 / 4 ) ) + 1 ) - ( 2.0 / 4 ) ) + 1 + 1 + 1 ) - ( 2.0 / 4 ) ) / 6.0 ) ) {
803                 return false;
804             }
805             if ( !TestSurfacing.isEqual( sa5_p.getMaximalSimilarityScore(), 1 ) ) {
806                 return false;
807             }
808             if ( !TestSurfacing.isEqual( sa5_p.getMinimalSimilarityScore(), ( 1 - ( 2.0 / 4 ) ) ) ) {
809                 return false;
810             }
811             if ( sa5_p.getN() != 6 ) {
812                 return false;
813             }
814             if ( sa5_p.getMaximalDifference() != sa5_p.getMaximalDifferenceInCounts() ) {
815                 return false;
816             }
817             if ( sa5_p.getMaximalDifference() != 2 ) {
818                 return false;
819             }
820             if ( sa5_p.getMaximalDifferenceInCounts() != 2 ) {
821                 return false;
822             }
823             final List<GenomeWideCombinableDomains> cdc_list6 = new ArrayList<GenomeWideCombinableDomains>();
824             cdc_list6.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
825                                                                             false,
826                                                                             new BasicSpecies( "mouse" ) ) );
827             cdc_list6.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
828                                                                             false,
829                                                                             new BasicSpecies( "rabbit" ) ) );
830             cdc_list6.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
831                                                                             false,
832                                                                             new BasicSpecies( "ciona" ) ) );
833             cdc_list6.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
834                                                                             false,
835                                                                             new BasicSpecies( "nemve" ) ) );
836             final SortedSet<DomainSimilarity> sims6_d = calc4
837                     .calculateSimilarities( new DomainCountsBasedPairwiseSimilarityCalculator(), cdc_list6, false, true );
838             final Iterator<DomainSimilarity> sims_it6_d = sims6_d.iterator();
839             final DomainSimilarity sa6_d = sims_it6_d.next();
840             if ( sa6_d.getSpecies().size() != 4 ) {
841                 return false;
842             }
843             if ( !sa6_d.getSpecies().last().equals( new BasicSpecies( "rabbit" ) ) ) {
844                 return false;
845             }
846             final SpeciesSpecificDcData ssdsd6 = sa6_d.getSpeciesData().get( new BasicSpecies( "ciona" ) );
847             if ( ssdsd6.getCombinableDomainIdToCountsMap().size() != 5 ) {
848                 return false;
849             }
850             if ( ssdsd6.getNumberOfProteinsExhibitingCombinationWith( "B" ) != 2 ) {
851                 return false;
852             }
853             if ( ssdsd6.getNumberOfProteinsExhibitingCombinationWith( "F" ) != 2 ) {
854                 return false;
855             }
856             if ( ssdsd6.getNumberOfProteinsExhibitingCombinationWith( "G" ) != 2 ) {
857                 return false;
858             }
859             if ( ssdsd6.getNumberOfProteinsExhibitingCombinationWith( "X" ) != 3 ) {
860                 return false;
861             }
862             if ( !sa5_d.getDomainId().equals( "A" ) ) {
863                 return false;
864             }
865             final Species ciona6 = new BasicSpecies( "ciona" );
866             if ( sa6_d.getCombinableDomainIds( ciona6 ).size() != 5 ) {
867                 return false;
868             }
869             if ( !sa6_d.getCombinableDomainIds( ciona6 ).contains( "A" ) ) {
870                 return false;
871             }
872             if ( !sa6_d.getCombinableDomainIds( ciona6 ).contains( "B" ) ) {
873                 return false;
874             }
875             if ( !sa6_d.getCombinableDomainIds( ciona6 ).contains( "F" ) ) {
876                 return false;
877             }
878             if ( !sa6_d.getCombinableDomainIds( ciona6 ).contains( "G" ) ) {
879                 return false;
880             }
881             if ( !sa6_d.getCombinableDomainIds( ciona6 ).contains( "X" ) ) {
882                 return false;
883             }
884             if ( !TestSurfacing
885                     .isEqual( sa6_d.getMeanSimilarityScore(),
886                               ( ( ( ( ( ( 1 + 1 ) - ( 11.0 / 13 ) ) + 1 ) - ( 11.0 / 13 ) ) + 1 + 1 + 1 ) - ( 11.0 / 13 ) ) / 6.0 ) ) {
887                 return false;
888             }
889             if ( !TestSurfacing.isEqual( sa6_d.getMaximalSimilarityScore(), 1.0 ) ) {
890                 return false;
891             }
892             if ( !TestSurfacing.isEqual( sa6_d.getMinimalSimilarityScore(), ( 1 - ( 11.0 / 13 ) ) ) ) {
893                 return false;
894             }
895             if ( sa6_d.getN() != 6 ) {
896                 return false;
897             }
898             if ( sa6_d.getMaximalDifference() != sa6_d.getMaximalDifferenceInCounts() ) {
899                 return false;
900             }
901             if ( sa6_d.getMaximalDifference() != 11 ) {
902                 return false;
903             }
904             if ( sa6_d.getMaximalDifferenceInCounts() != 11 ) {
905                 return false;
906             }
907             final SortedSet<DomainSimilarity> sims6_p = calc4
908                     .calculateSimilarities( new ProteinCountsBasedPairwiseDomainSimilarityCalculator(),
909                                             cdc_list6,
910                                             false,
911                                             true );
912             final Iterator<DomainSimilarity> sims_it6_p = sims6_p.iterator();
913             final DomainSimilarity sa6_p = sims_it6_p.next();
914             if ( !sa6_p.getDomainId().equals( "A" ) ) {
915                 return false;
916             }
917             if ( sa6_p.getCombinableDomainIds( ciona ).size() != 5 ) {
918                 return false;
919             }
920             if ( !sa6_p.getCombinableDomainIds( ciona ).contains( "A" ) ) {
921                 return false;
922             }
923             if ( !sa6_p.getCombinableDomainIds( ciona ).contains( "B" ) ) {
924                 return false;
925             }
926             if ( !sa6_p.getCombinableDomainIds( ciona ).contains( "F" ) ) {
927                 return false;
928             }
929             if ( !sa6_p.getCombinableDomainIds( ciona ).contains( "G" ) ) {
930                 return false;
931             }
932             if ( !sa6_p.getCombinableDomainIds( ciona ).contains( "X" ) ) {
933                 return false;
934             }
935             if ( !TestSurfacing
936                     .isEqual( sa6_p.getMeanSimilarityScore(),
937                               ( ( ( ( ( ( 1 + 1 ) - ( 2.0 / 4 ) ) + 1 ) - ( 2.0 / 4 ) ) + 1 + 1 + 1 ) - ( 2.0 / 4 ) ) / 6.0 ) ) {
938                 return false;
939             }
940             if ( !TestSurfacing.isEqual( sa6_p.getMaximalSimilarityScore(), 1 ) ) {
941                 return false;
942             }
943             if ( !TestSurfacing.isEqual( sa6_p.getMinimalSimilarityScore(), ( 1 - ( 2.0 / 4 ) ) ) ) {
944                 return false;
945             }
946             if ( sa6_p.getN() != 6 ) {
947                 return false;
948             }
949             if ( sa6_p.getMaximalDifference() != sa6_p.getMaximalDifferenceInCounts() ) {
950                 return false;
951             }
952             if ( sa6_p.getMaximalDifference() != 2 ) {
953                 return false;
954             }
955             if ( sa6_p.getMaximalDifferenceInCounts() != 2 ) {
956                 return false;
957             }
958         }
959         catch ( final Exception e ) {
960             e.printStackTrace( System.out );
961             return false;
962         }
963         return true;
964     }
965
966     private static boolean testBasicDomainSimilarityCalculatorNotIgnoringSpeciesSpeficDomains() {
967         try {
968             final Domain A = new BasicDomain( "A", 1, 2, ( short ) 1, ( short ) 1, 0.15, -12 );
969             final Domain B = new BasicDomain( "B", 1, 2, ( short ) 1, ( short ) 1, 0.2, -12 );
970             final Domain D = new BasicDomain( "D", 1, 2, ( short ) 1, ( short ) 1, 0.5, -12 );
971             final Domain E = new BasicDomain( "E", 1, 2, ( short ) 1, ( short ) 1, 0.5, -12 );
972             final Domain F = new BasicDomain( "F", 1, 2, ( short ) 1, ( short ) 1, 0.01, -12 );
973             final Domain G = new BasicDomain( "G", 1, 2, ( short ) 1, ( short ) 1, 0.001, -12 );
974             final Domain X = new BasicDomain( "X", 1, 2, ( short ) 1, ( short ) 1, 0.0001, -12 );
975             final Protein mouse_1 = new BasicProtein( "1", "mouse", 0 );
976             final Protein rabbit_1 = new BasicProtein( "1", "rabbit", 0 );
977             final Protein ciona_1 = new BasicProtein( "1", "ciona", 0 );
978             final Protein nemve_1 = new BasicProtein( "1", "nemve", 0 );
979             mouse_1.addProteinDomain( A );
980             mouse_1.addProteinDomain( D );
981             mouse_1.addProteinDomain( E );
982             rabbit_1.addProteinDomain( B );
983             rabbit_1.addProteinDomain( E );
984             rabbit_1.addProteinDomain( F );
985             rabbit_1.addProteinDomain( F );
986             rabbit_1.addProteinDomain( F );
987             rabbit_1.addProteinDomain( F );
988             rabbit_1.addProteinDomain( F );
989             rabbit_1.addProteinDomain( F );
990             ciona_1.addProteinDomain( F );
991             ciona_1.addProteinDomain( G );
992             ciona_1.addProteinDomain( X );
993             nemve_1.addProteinDomain( D );
994             nemve_1.addProteinDomain( E );
995             nemve_1.addProteinDomain( F );
996             nemve_1.addProteinDomain( G );
997             final List<Protein> protein_list_mouse = new ArrayList<Protein>();
998             final List<Protein> protein_list_rabbit = new ArrayList<Protein>();
999             final List<Protein> protein_list_ciona = new ArrayList<Protein>();
1000             final List<Protein> protein_list_nemve = new ArrayList<Protein>();
1001             protein_list_mouse.add( mouse_1 );
1002             protein_list_rabbit.add( rabbit_1 );
1003             protein_list_ciona.add( ciona_1 );
1004             protein_list_nemve.add( nemve_1 );
1005             final List<GenomeWideCombinableDomains> cdc_list = new ArrayList<GenomeWideCombinableDomains>();
1006             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
1007                                                                            true,
1008                                                                            new BasicSpecies( "mouse" ) ) );
1009             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
1010                                                                            true,
1011                                                                            new BasicSpecies( "rabbit" ) ) );
1012             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
1013                                                                            true,
1014                                                                            new BasicSpecies( "ciona" ) ) );
1015             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
1016                                                                            true,
1017                                                                            new BasicSpecies( "nemve" ) ) );
1018             final DomainSimilarityCalculator calc = new BasicDomainSimilarityCalculator( DomainSimilarity.DomainSimilaritySortField.DOMAIN_ID,
1019                                                                                          false,
1020                                                                                          false,
1021                                                                                          true );
1022             final SortedSet<DomainSimilarity> sims = calc
1023                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
1024                                             cdc_list,
1025                                             true,
1026                                             false );
1027             final Iterator<DomainSimilarity> sims_it = sims.iterator();
1028             final DomainSimilarity sa = sims_it.next();
1029             if ( !sa.getDomainId().equals( "A" ) ) {
1030                 return false;
1031             }
1032             if ( sa.getSpeciesData().size() != 1 ) {
1033                 return false;
1034             }
1035             if ( !sa.getSpecies().contains( new BasicSpecies( "mouse" ) ) ) {
1036                 return false;
1037             }
1038             if ( !TestSurfacing.isEqual( sa.getMeanSimilarityScore(), 1.0 ) ) {
1039                 return false;
1040             }
1041             if ( !TestSurfacing.isEqual( sa.getStandardDeviationOfSimilarityScore(), 0.0 ) ) {
1042                 return false;
1043             }
1044             if ( !TestSurfacing.isEqual( sa.getMaximalSimilarityScore(), 1.0 ) ) {
1045                 return false;
1046             }
1047             if ( !TestSurfacing.isEqual( sa.getMinimalSimilarityScore(), 1.0 ) ) {
1048                 return false;
1049             }
1050             if ( sa.getN() != 0 ) {
1051                 return false;
1052             }
1053             if ( sa.getMaximalDifference() != 0 ) {
1054                 return false;
1055             }
1056             if ( sa.getMaximalDifferenceInCounts() != 0 ) {
1057                 return false;
1058             }
1059             final DomainSimilarity sb = sims_it.next();
1060             if ( !sb.getDomainId().equals( "B" ) ) {
1061                 return false;
1062             }
1063             if ( sb.getSpeciesData().size() != 1 ) {
1064                 return false;
1065             }
1066             if ( !sb.getSpecies().contains( new BasicSpecies( "rabbit" ) ) ) {
1067                 return false;
1068             }
1069             final SortedSet<DomainSimilarity> sims2 = calc
1070                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
1071                                             cdc_list,
1072                                             true,
1073                                             true );
1074             final Iterator<DomainSimilarity> sims_it2 = sims2.iterator();
1075             final DomainSimilarity sa2 = sims_it2.next();
1076             if ( !sa2.getDomainId().equals( "D" ) ) {
1077                 return false;
1078             }
1079             if ( sa2.getSpeciesData().size() != 2 ) {
1080                 return false;
1081             }
1082         }
1083         catch ( final Exception e ) {
1084             e.printStackTrace( System.out );
1085             return false;
1086         }
1087         return true;
1088     }
1089
1090     private static boolean testBasicDomainSimilarityCalculatorRemovalOfSingles() {
1091         try {
1092             final Domain A = new BasicDomain( "A", 1, 2, ( short ) 1, ( short ) 1, 0.15, -12 );
1093             final Domain B = new BasicDomain( "B", 1, 2, ( short ) 1, ( short ) 1, 0.2, -12 );
1094             final Protein mouse_1 = new BasicProtein( "1", "mouse", 0 );
1095             final Protein rabbit_1 = new BasicProtein( "1", "rabbit", 0 );
1096             final Protein ciona_1 = new BasicProtein( "1", "ciona", 0 );
1097             final Protein nemve_1 = new BasicProtein( "1", "nemve", 0 );
1098             mouse_1.addProteinDomain( A );
1099             rabbit_1.addProteinDomain( A );
1100             ciona_1.addProteinDomain( A );
1101             ciona_1.addProteinDomain( A );
1102             ciona_1.addProteinDomain( A );
1103             ciona_1.addProteinDomain( A );
1104             ciona_1.addProteinDomain( A );
1105             nemve_1.addProteinDomain( A );
1106             final List<Protein> protein_list_mouse = new ArrayList<Protein>();
1107             final List<Protein> protein_list_rabbit = new ArrayList<Protein>();
1108             final List<Protein> protein_list_ciona = new ArrayList<Protein>();
1109             final List<Protein> protein_list_nemve = new ArrayList<Protein>();
1110             protein_list_mouse.add( mouse_1 );
1111             protein_list_rabbit.add( rabbit_1 );
1112             protein_list_ciona.add( ciona_1 );
1113             protein_list_nemve.add( nemve_1 );
1114             final List<GenomeWideCombinableDomains> cdc_list = new ArrayList<GenomeWideCombinableDomains>();
1115             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse,
1116                                                                            true,
1117                                                                            new BasicSpecies( "mouse" ) ) );
1118             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit,
1119                                                                            true,
1120                                                                            new BasicSpecies( "rabbit" ) ) );
1121             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona,
1122                                                                            true,
1123                                                                            new BasicSpecies( "ciona" ) ) );
1124             cdc_list.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve,
1125                                                                            true,
1126                                                                            new BasicSpecies( "nemve" ) ) );
1127             final DomainSimilarityCalculator calc = new BasicDomainSimilarityCalculator( DomainSimilarity.DomainSimilaritySortField.DOMAIN_ID,
1128                                                                                          false,
1129                                                                                          false,
1130                                                                                          true );
1131             final SortedSet<DomainSimilarity> sims = calc
1132                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
1133                                             cdc_list,
1134                                             false,
1135                                             true );
1136             if ( sims.size() != 1 ) {
1137                 return false;
1138             }
1139             final Iterator<DomainSimilarity> sims_it = sims.iterator();
1140             final DomainSimilarity sa = sims_it.next();
1141             if ( !sa.getDomainId().equals( "A" ) ) {
1142                 return false;
1143             }
1144             if ( sa.getSpeciesData().size() != 4 ) {
1145                 return false;
1146             }
1147             if ( !sa.getSpecies().contains( new BasicSpecies( "ciona" ) ) ) {
1148                 return false;
1149             }
1150             if ( !sa.getSpecies().contains( new BasicSpecies( "mouse" ) ) ) {
1151                 return false;
1152             }
1153             if ( !sa.getSpecies().contains( new BasicSpecies( "nemve" ) ) ) {
1154                 return false;
1155             }
1156             if ( !sa.getSpecies().contains( new BasicSpecies( "rabbit" ) ) ) {
1157                 return false;
1158             }
1159             final SortedSet<DomainSimilarity> sims_ns = calc
1160                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
1161                                             cdc_list,
1162                                             true,
1163                                             true );
1164             if ( sims_ns.size() != 0 ) {
1165                 return false;
1166             }
1167             final Protein mouse_2 = new BasicProtein( "1", "mouse", 0 );
1168             final Protein rabbit_2 = new BasicProtein( "1", "rabbit", 0 );
1169             final Protein ciona_2 = new BasicProtein( "1", "ciona", 0 );
1170             final Protein nemve_2 = new BasicProtein( "1", "nemve", 0 );
1171             mouse_2.addProteinDomain( A );
1172             rabbit_2.addProteinDomain( A );
1173             ciona_2.addProteinDomain( A );
1174             ciona_2.addProteinDomain( A );
1175             ciona_2.addProteinDomain( B );
1176             ciona_2.addProteinDomain( A );
1177             ciona_2.addProteinDomain( A );
1178             ciona_2.addProteinDomain( A );
1179             nemve_2.addProteinDomain( A );
1180             final List<Protein> protein_list_mouse2 = new ArrayList<Protein>();
1181             final List<Protein> protein_list_rabbit2 = new ArrayList<Protein>();
1182             final List<Protein> protein_list_ciona2 = new ArrayList<Protein>();
1183             final List<Protein> protein_list_nemve2 = new ArrayList<Protein>();
1184             protein_list_mouse2.add( mouse_2 );
1185             protein_list_rabbit2.add( rabbit_2 );
1186             protein_list_ciona2.add( ciona_2 );
1187             protein_list_nemve2.add( nemve_2 );
1188             final List<GenomeWideCombinableDomains> cdc_list2 = new ArrayList<GenomeWideCombinableDomains>();
1189             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_mouse2,
1190                                                                             true,
1191                                                                             new BasicSpecies( "mouse" ) ) );
1192             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_rabbit2,
1193                                                                             true,
1194                                                                             new BasicSpecies( "rabbit" ) ) );
1195             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_ciona2,
1196                                                                             true,
1197                                                                             new BasicSpecies( "ciona" ) ) );
1198             cdc_list2.add( BasicGenomeWideCombinableDomains.createInstance( protein_list_nemve2,
1199                                                                             true,
1200                                                                             new BasicSpecies( "nemve" ) ) );
1201             final SortedSet<DomainSimilarity> sims2 = calc
1202                     .calculateSimilarities( new CombinationsBasedPairwiseDomainSimilarityCalculator(),
1203                                             cdc_list2,
1204                                             true,
1205                                             true );
1206             if ( sims2.size() != 1 ) {
1207                 return false;
1208             }
1209         }
1210         catch ( final Exception e ) {
1211             e.printStackTrace( System.out );
1212             return false;
1213         }
1214         return true;
1215     }
1216
1217     private static boolean testBinaryDomainCombination() {
1218         try {
1219             final BasicBinaryDomainCombination s0 = BasicBinaryDomainCombination.obtainInstance( "a", "a" );
1220             final BasicBinaryDomainCombination s1 = BasicBinaryDomainCombination.obtainInstance( "b", "a" );
1221             final BasicBinaryDomainCombination s2 = BasicBinaryDomainCombination.obtainInstance( "a", "b" );
1222             final BasicBinaryDomainCombination s3 = BasicBinaryDomainCombination.obtainInstance( "B", "A" );
1223             final BasicBinaryDomainCombination s4 = BasicBinaryDomainCombination.obtainInstance( "A", "B" );
1224             final BasicBinaryDomainCombination s5 = BasicBinaryDomainCombination.obtainInstance( "c", "a" );
1225             final BasicBinaryDomainCombination s6 = BasicBinaryDomainCombination.obtainInstance( "b", "c" );
1226             final BasicBinaryDomainCombination s7 = BasicBinaryDomainCombination.obtainInstance( "d", "a" );
1227             final BasicBinaryDomainCombination s8 = BasicBinaryDomainCombination.obtainInstance( "b", "d" );
1228             final BinaryDomainCombination s9 = BasicBinaryDomainCombination.obtainInstance( "z-z=a-aa" );
1229             if ( !s9.toString().equals( "a-aa=z-z" ) ) {
1230                 System.out.println( s9.toString() );
1231                 return false;
1232             }
1233             if ( !s0.equals( s0 ) ) {
1234                 return false;
1235             }
1236             if ( s0.equals( s1 ) ) {
1237                 return false;
1238             }
1239             if ( s1.equals( s0 ) ) {
1240                 return false;
1241             }
1242             if ( !s1.equals( s2 ) ) {
1243                 return false;
1244             }
1245             if ( !s2.equals( s1 ) ) {
1246                 return false;
1247             }
1248             if ( s2.equals( s3 ) ) {
1249                 return false;
1250             }
1251             if ( s2.equals( s3 ) ) {
1252                 return false;
1253             }
1254             if ( s2.equals( s4 ) ) {
1255                 return false;
1256             }
1257             final SortedSet<BasicBinaryDomainCombination> sorted = new TreeSet<BasicBinaryDomainCombination>();
1258             sorted.add( s0 );
1259             sorted.add( s1 );
1260             sorted.add( s2 );//
1261             sorted.add( s3 );
1262             sorted.add( s3 );//
1263             sorted.add( s3 );//
1264             sorted.add( s4 );//
1265             sorted.add( s5 );
1266             sorted.add( s6 );
1267             sorted.add( s7 );
1268             sorted.add( s7 );//
1269             sorted.add( s8 );
1270             if ( sorted.size() != 7 ) {
1271                 System.out.println( sorted.size() );
1272                 return false;
1273             }
1274             final DirectedBinaryDomainCombination aa = DirectedBinaryDomainCombination.obtainInstance( "a", "a" );
1275             final DirectedBinaryDomainCombination ba = DirectedBinaryDomainCombination.obtainInstance( "b", "a" );
1276             final DirectedBinaryDomainCombination ab = DirectedBinaryDomainCombination.obtainInstance( "a", "b" );
1277             final DirectedBinaryDomainCombination bb = DirectedBinaryDomainCombination.obtainInstance( "b", "b" );
1278             if ( !aa.equals( aa ) ) {
1279                 return false;
1280             }
1281             if ( aa.equals( bb ) ) {
1282                 return false;
1283             }
1284             if ( ab.equals( ba ) ) {
1285                 return false;
1286             }
1287             if ( ba.equals( ab ) ) {
1288                 return false;
1289             }
1290             if ( !ab.equals( ab ) ) {
1291                 return false;
1292             }
1293             if ( ab.equals( aa ) ) {
1294                 return false;
1295             }
1296             if ( ab.equals( bb ) ) {
1297                 return false;
1298             }
1299         }
1300         catch ( final Exception e ) {
1301             e.printStackTrace( System.out );
1302             return false;
1303         }
1304         return true;
1305     }
1306
1307     private static boolean testBinaryStateMatrixToGainLossMatrix( final File test_dir ) {
1308         final BinaryStates I = BinaryStates.PRESENT;
1309         final BinaryStates O = BinaryStates.ABSENT;
1310         try {
1311             final CharacterStateMatrix<BinaryStates> binary_states_matrix_0 = new BasicCharacterStateMatrix<BinaryStates>( 7,
1312                     6 );
1313             binary_states_matrix_0.setIdentifier( 0, "A" );
1314             binary_states_matrix_0.setIdentifier( 1, "B" );
1315             binary_states_matrix_0.setIdentifier( 2, "C" );
1316             binary_states_matrix_0.setIdentifier( 3, "D" );
1317             binary_states_matrix_0.setIdentifier( 4, "1" );
1318             binary_states_matrix_0.setIdentifier( 5, "2" );
1319             binary_states_matrix_0.setIdentifier( 6, "3" );
1320             binary_states_matrix_0.setState( 0, 0, O );
1321             binary_states_matrix_0.setState( 1, 0, O );
1322             binary_states_matrix_0.setState( 2, 0, O );
1323             binary_states_matrix_0.setState( 3, 0, O );
1324             binary_states_matrix_0.setState( 4, 0, O );
1325             binary_states_matrix_0.setState( 5, 0, O );
1326             binary_states_matrix_0.setState( 6, 0, O );
1327             binary_states_matrix_0.setState( 0, 1, I );
1328             binary_states_matrix_0.setState( 1, 1, O );
1329             binary_states_matrix_0.setState( 2, 1, O );
1330             binary_states_matrix_0.setState( 3, 1, O );
1331             binary_states_matrix_0.setState( 4, 1, O );
1332             binary_states_matrix_0.setState( 5, 1, O );
1333             binary_states_matrix_0.setState( 6, 1, O );
1334             binary_states_matrix_0.setState( 0, 2, O );
1335             binary_states_matrix_0.setState( 1, 2, O );
1336             binary_states_matrix_0.setState( 2, 2, O );
1337             binary_states_matrix_0.setState( 3, 2, O );
1338             binary_states_matrix_0.setState( 4, 2, I );
1339             binary_states_matrix_0.setState( 5, 2, O );
1340             binary_states_matrix_0.setState( 6, 2, O );
1341             binary_states_matrix_0.setState( 0, 3, I );
1342             binary_states_matrix_0.setState( 1, 3, O );
1343             binary_states_matrix_0.setState( 2, 3, O );
1344             binary_states_matrix_0.setState( 3, 3, O );
1345             binary_states_matrix_0.setState( 4, 3, I );
1346             binary_states_matrix_0.setState( 5, 3, O );
1347             binary_states_matrix_0.setState( 6, 3, I );
1348             binary_states_matrix_0.setState( 0, 4, I );
1349             binary_states_matrix_0.setState( 1, 4, O );
1350             binary_states_matrix_0.setState( 2, 4, I );
1351             binary_states_matrix_0.setState( 3, 4, O );
1352             binary_states_matrix_0.setState( 4, 4, I );
1353             binary_states_matrix_0.setState( 5, 4, O );
1354             binary_states_matrix_0.setState( 6, 4, I );
1355             binary_states_matrix_0.setState( 0, 5, I );
1356             binary_states_matrix_0.setState( 1, 5, I );
1357             binary_states_matrix_0.setState( 2, 5, I );
1358             binary_states_matrix_0.setState( 3, 5, I );
1359             binary_states_matrix_0.setState( 4, 5, I );
1360             binary_states_matrix_0.setState( 5, 5, I );
1361             binary_states_matrix_0.setState( 6, 5, I );
1362             final String[] character_labels_0 = new String[ 6 ];
1363             character_labels_0[ 0 ] = "first";
1364             character_labels_0[ 1 ] = "second";
1365             character_labels_0[ 2 ] = "third";
1366             character_labels_0[ 3 ] = "forth";
1367             character_labels_0[ 4 ] = "fifth";
1368             character_labels_0[ 5 ] = "sixth";
1369             final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
1370             final Phylogeny phylogeny_0 = factory.create( "(((A,B)1,C)2,D)3", new NHXParser() )[ 0 ];
1371             final DomainParsimonyCalculator dom_pars = DomainParsimonyCalculator.createInstance( phylogeny_0 );
1372             dom_pars.executeOnGivenBinaryStatesMatrix( binary_states_matrix_0, character_labels_0 );
1373             final CharacterStateMatrix<GainLossStates> gl_matrix_0 = dom_pars.getGainLossMatrix();
1374             // final StringWriter sw = new StringWriter();
1375             //  gl_matrix_0.toWriter( sw );
1376             // System.out.println( sw.toString() );
1377             if ( dom_pars.getCost() != 13 ) {
1378                 return false;
1379             }
1380             if ( dom_pars.getTotalGains() != 5 ) {
1381                 return false;
1382             }
1383             if ( dom_pars.getTotalLosses() != 8 ) {
1384                 return false;
1385             }
1386             if ( dom_pars.getTotalUnchanged() != 29 ) {
1387                 return false;
1388             }
1389             if ( gl_matrix_0.getState( "A", 1 ) != GainLossStates.GAIN ) {
1390                 return false;
1391             }
1392             if ( gl_matrix_0.getState( "A", 4 ) != GainLossStates.UNCHANGED_PRESENT ) {
1393                 return false;
1394             }
1395             if ( gl_matrix_0.getState( "B", 4 ) != GainLossStates.LOSS ) {
1396                 return false;
1397             }
1398             if ( gl_matrix_0.getState( "C", 4 ) != GainLossStates.GAIN ) {
1399                 return false;
1400             }
1401             if ( gl_matrix_0.getState( "D", 4 ) != GainLossStates.LOSS ) {
1402                 return false;
1403             }
1404             if ( gl_matrix_0.getState( "1", 4 ) != GainLossStates.GAIN ) {
1405                 return false;
1406             }
1407             if ( gl_matrix_0.getState( "2", 4 ) != GainLossStates.LOSS ) {
1408                 return false;
1409             }
1410             if ( gl_matrix_0.getState( "3", 4 ) != GainLossStates.UNCHANGED_PRESENT ) {
1411                 return false;
1412             }
1413         }
1414         catch ( final Exception e ) {
1415             e.printStackTrace( System.out );
1416             return false;
1417         }
1418         return true;
1419     }
1420
1421     private static boolean testCombinableDomains() {
1422         try {
1423             final Domain key0 = new BasicDomain( "key0", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1424             final Domain a = new BasicDomain( "a", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1425             final Domain b = new BasicDomain( "b", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1426             final Domain c = new BasicDomain( "c", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1427             final CombinableDomains cd0 = new BasicCombinableDomains( key0.getDomainId(), new BasicSpecies( "eel" ) );
1428             cd0.addCombinableDomain( a.getDomainId() );
1429             cd0.addCombinableDomain( b.getDomainId() );
1430             cd0.addCombinableDomain( b.getDomainId() );
1431             cd0.addCombinableDomain( c.getDomainId() );
1432             cd0.addCombinableDomain( c.getDomainId() );
1433             cd0.addCombinableDomain( c.getDomainId() );
1434             if ( cd0.getNumberOfCombinableDomains() != 3 ) {
1435                 return false;
1436             }
1437             if ( cd0.getNumberOfProteinsExhibitingCombination( a.getDomainId() ) != 1 ) {
1438                 return false;
1439             }
1440             if ( cd0.getNumberOfProteinsExhibitingCombination( b.getDomainId() ) != 2 ) {
1441                 return false;
1442             }
1443             if ( cd0.getNumberOfProteinsExhibitingCombination( c.getDomainId() ) != 3 ) {
1444                 return false;
1445             }
1446             if ( cd0.getNumberOfProteinsExhibitingCombination( key0.getDomainId() ) != 0 ) {
1447                 return false;
1448             }
1449             if ( cd0.getAllDomains().size() != 4 ) {
1450                 return false;
1451             }
1452             if ( !cd0.getAllDomains().contains( a.getDomainId() ) ) {
1453                 return false;
1454             }
1455             if ( !cd0.getAllDomains().contains( b.getDomainId() ) ) {
1456                 return false;
1457             }
1458             if ( !cd0.getAllDomains().contains( c.getDomainId() ) ) {
1459                 return false;
1460             }
1461             if ( !cd0.getAllDomains().contains( key0.getDomainId() ) ) {
1462                 return false;
1463             }
1464             if ( cd0.toBinaryDomainCombinations().size() != 3 ) {
1465                 return false;
1466             }
1467             final BasicBinaryDomainCombination s0 = BasicBinaryDomainCombination.obtainInstance( "key0", "a" );
1468             final BasicBinaryDomainCombination s1 = BasicBinaryDomainCombination.obtainInstance( "b", "key0" );
1469             final BasicBinaryDomainCombination s2 = BasicBinaryDomainCombination.obtainInstance( "key0", "c" );
1470             final BasicBinaryDomainCombination s3 = BasicBinaryDomainCombination.obtainInstance( "key0", "cc" );
1471             final BasicBinaryDomainCombination s4 = BasicBinaryDomainCombination.obtainInstance( "c", "key0" );
1472             if ( !cd0.toBinaryDomainCombinations().contains( s0 ) ) {
1473                 return false;
1474             }
1475             if ( !cd0.toBinaryDomainCombinations().contains( s1 ) ) {
1476                 return false;
1477             }
1478             if ( !cd0.toBinaryDomainCombinations().contains( s2 ) ) {
1479                 return false;
1480             }
1481             if ( cd0.toBinaryDomainCombinations().contains( s3 ) ) {
1482                 return false;
1483             }
1484             if ( !cd0.toBinaryDomainCombinations().contains( s4 ) ) {
1485                 return false;
1486             }
1487             final Domain key1 = new BasicDomain( "key1", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1488             final Domain a1 = new BasicDomain( "a1", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1489             final Domain b1 = new BasicDomain( "b1", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1490             final Domain c1 = new BasicDomain( "c1", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1491             final CombinableDomains cd1 = new BasicCombinableDomains( key1.getDomainId(), new BasicSpecies( "eel" ) );
1492             cd1.addCombinableDomain( a1.getDomainId() );
1493             cd1.addCombinableDomain( b1.getDomainId() );
1494             cd1.addCombinableDomain( c1.getDomainId() );
1495             cd1.addCombinableDomain( key1.getDomainId() );
1496             if ( cd1.getNumberOfCombinableDomains() != 4 ) {
1497                 return false;
1498             }
1499             if ( cd1.getNumberOfProteinsExhibitingCombination( a1.getDomainId() ) != 1 ) {
1500                 return false;
1501             }
1502             if ( cd1.getNumberOfProteinsExhibitingCombination( b1.getDomainId() ) != 1 ) {
1503                 return false;
1504             }
1505             if ( cd1.getNumberOfProteinsExhibitingCombination( c1.getDomainId() ) != 1 ) {
1506                 return false;
1507             }
1508             if ( cd1.getNumberOfProteinsExhibitingCombination( key1.getDomainId() ) != 1 ) {
1509                 return false;
1510             }
1511             if ( cd1.getAllDomains().size() != 4 ) {
1512                 return false;
1513             }
1514             if ( cd1.toBinaryDomainCombinations().size() != 4 ) {
1515                 return false;
1516             }
1517             final BasicBinaryDomainCombination kk = BasicBinaryDomainCombination.obtainInstance( "key1", "key1" );
1518             if ( !cd1.toBinaryDomainCombinations().contains( kk ) ) {
1519                 return false;
1520             }
1521         }
1522         catch ( final Exception e ) {
1523             e.printStackTrace( System.out );
1524             return false;
1525         }
1526         return true;
1527     }
1528
1529     private static boolean testCombinationsBasedPairwiseSimilarityCalculator() {
1530         try {
1531             final Domain a = new BasicDomain( "A", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1532             final Domain b = new BasicDomain( "B", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1533             final Domain c = new BasicDomain( "C", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1534             final Domain one_key = new BasicDomain( "bcl2", 4, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1535             final Domain two_key = new BasicDomain( "bcl2", 5, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1536             final CombinableDomains one = new BasicCombinableDomains( one_key.getDomainId(), new BasicSpecies( "mouse" ) );
1537             final CombinableDomains two = new BasicCombinableDomains( two_key.getDomainId(),
1538                                                                       new BasicSpecies( "rabbit" ) );
1539             one.addCombinableDomain( a.getDomainId() );
1540             one.addCombinableDomain( a.getDomainId() );
1541             two.addCombinableDomain( new BasicDomain( "A", 1, 5, ( short ) 1, ( short ) 4, 0.1, -12 ).getDomainId() );
1542             two.addCombinableDomain( b.getDomainId() );
1543             two.addCombinableDomain( c.getDomainId() );
1544             final PairwiseDomainSimilarityCalculator calc = new CombinationsBasedPairwiseDomainSimilarityCalculator();
1545             final PairwiseDomainSimilarity s1 = calc.calculateSimilarity( one, two );
1546             if ( !TestSurfacing.isEqual( s1.getSimilarityScore(), 1.0 / ( 1 + 2 ) ) ) {
1547                 return false;
1548             }
1549             if ( s1.getDifferenceInCounts() != ( 1 - 3 ) ) {
1550                 return false;
1551             }
1552             if ( ( ( CombinationsBasedPairwiseDomainSimilarity ) s1 ).getNumberOfDifferentDomains() != 2 ) {
1553                 return false;
1554             }
1555             one.addCombinableDomain( b.getDomainId() );
1556             one.addCombinableDomain( c.getDomainId() );
1557             final PairwiseDomainSimilarity s2 = calc.calculateSimilarity( one, two );
1558             if ( !TestSurfacing.isEqual( s2.getSimilarityScore(), 3.0 / ( 0 + 3 ) ) ) {
1559                 return false;
1560             }
1561             if ( s2.getDifferenceInCounts() != 0 ) {
1562                 return false;
1563             }
1564             if ( ( ( CombinationsBasedPairwiseDomainSimilarity ) s2 ).getNumberOfDifferentDomains() != 0 ) {
1565                 return false;
1566             }
1567             final Domain d = new BasicDomain( "D", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1568             final Domain e = new BasicDomain( "E", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1569             final Domain f = new BasicDomain( "F", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1570             one.addCombinableDomain( d.getDomainId() );
1571             one.addCombinableDomain( d.getDomainId() );
1572             one.addCombinableDomain( e.getDomainId() );
1573             one.addCombinableDomain( f.getDomainId() );
1574             final PairwiseDomainSimilarity s3 = calc.calculateSimilarity( one, two );
1575             if ( !TestSurfacing.isEqual( s3.getSimilarityScore(), 3.0 / ( 3 + 3 ) ) ) {
1576                 return false;
1577             }
1578             if ( s3.getDifferenceInCounts() != ( 6 - 3 ) ) {
1579                 return false;
1580             }
1581             if ( ( ( CombinationsBasedPairwiseDomainSimilarity ) s3 ).getNumberOfDifferentDomains() != 3 ) {
1582                 return false;
1583             }
1584             final Domain aaa = new BasicDomain( "aaa", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1585             final Domain bbb = new BasicDomain( "bbb", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1586             final Domain three_key = new BasicDomain( "bcl2", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1587             final Domain four_key = new BasicDomain( "bcl2", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1588             final CombinableDomains three = new BasicCombinableDomains( three_key.getDomainId(),
1589                                                                         new BasicSpecies( "mouse" ) );
1590             final CombinableDomains four = new BasicCombinableDomains( four_key.getDomainId(),
1591                                                                        new BasicSpecies( "rabbit" ) );
1592             three.addCombinableDomain( aaa.getDomainId() );
1593             four.addCombinableDomain( bbb.getDomainId() );
1594             final PairwiseDomainSimilarityCalculator calc2 = new CombinationsBasedPairwiseDomainSimilarityCalculator();
1595             final PairwiseDomainSimilarity s4 = calc2.calculateSimilarity( three, four );
1596             if ( !TestSurfacing.isEqual( s4.getSimilarityScore(), 0.0 / ( 0 + 2 ) ) ) {
1597                 return false;
1598             }
1599             final Domain aaa2 = new BasicDomain( "aaa", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1600             four.addCombinableDomain( aaa2.getDomainId() );
1601             final PairwiseDomainSimilarity s5 = calc.calculateSimilarity( three, four );
1602             if ( !TestSurfacing.isEqual( s5.getSimilarityScore(), 1.0 / ( 1 + 1 ) ) ) {
1603                 return false;
1604             }
1605         }
1606         catch ( final Exception e ) {
1607             e.printStackTrace( System.out );
1608             return false;
1609         }
1610         return true;
1611     }
1612
1613     private static boolean testCopyNumberBasedPairwiseSimilarityCalculator() {
1614         try {
1615             final Domain one_key = new BasicDomain( "bcl2", 4, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1616             final Domain two_key = new BasicDomain( "bcl2", 5, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1617             final CombinableDomains one = new BasicCombinableDomains( one_key.getDomainId(), new BasicSpecies( "mouse" ) );
1618             final CombinableDomains two = new BasicCombinableDomains( two_key.getDomainId(),
1619                                                                       new BasicSpecies( "rabbit" ) );
1620             one.setKeyDomainCount( 2 );
1621             two.setKeyDomainCount( 3 );
1622             final PairwiseDomainSimilarityCalculator calc = new DomainCountsBasedPairwiseSimilarityCalculator();
1623             PairwiseDomainSimilarity s1 = calc.calculateSimilarity( one, two );
1624             if ( !TestSurfacing.isEqual( s1.getSimilarityScore(), 1.0 - ( ( 3 - 2.0 ) / ( 2 + 3 ) ) ) ) {
1625                 return false;
1626             }
1627             if ( s1.getDifferenceInCounts() != ( 2 - 3 ) ) {
1628                 return false;
1629             }
1630             one.setKeyDomainCount( 1 );
1631             two.setKeyDomainCount( 1 );
1632             s1 = calc.calculateSimilarity( one, two );
1633             if ( !TestSurfacing.isEqual( s1.getSimilarityScore(), 1.0 ) ) {
1634                 return false;
1635             }
1636             if ( s1.getDifferenceInCounts() != ( 1 - 1 ) ) {
1637                 return false;
1638             }
1639             one.setKeyDomainCount( 1 );
1640             two.setKeyDomainCount( 1000 );
1641             s1 = calc.calculateSimilarity( one, two );
1642             if ( !TestSurfacing.isEqual( s1.getSimilarityScore(), 1.0 - ( 999.0 / 1001 ) ) ) {
1643                 return false;
1644             }
1645             if ( s1.getDifferenceInCounts() != ( 1 - 1000 ) ) {
1646                 return false;
1647             }
1648         }
1649         catch ( final Exception e ) {
1650             e.printStackTrace( System.out );
1651             return false;
1652         }
1653         return true;
1654     }
1655
1656     private static boolean testDirectedCombinableDomains() {
1657         try {
1658             final Domain key0 = new BasicDomain( "key0", 10, 20, ( short ) 1, ( short ) 4, 0.1, -12 );
1659             final Domain a = new BasicDomain( "a", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1660             final Domain b = new BasicDomain( "b", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1661             final Domain c = new BasicDomain( "c", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1662             final CombinableDomains cd0 = new DirectedCombinableDomains( key0.getDomainId(), new BasicSpecies( "eel" ) );
1663             cd0.addCombinableDomain( a.getDomainId() );
1664             cd0.addCombinableDomain( b.getDomainId() );
1665             cd0.addCombinableDomain( b.getDomainId() );
1666             cd0.addCombinableDomain( c.getDomainId() );
1667             cd0.addCombinableDomain( c.getDomainId() );
1668             cd0.addCombinableDomain( c.getDomainId() );
1669             if ( cd0.getNumberOfCombinableDomains() != 3 ) {
1670                 return false;
1671             }
1672             if ( cd0.getNumberOfProteinsExhibitingCombination( a.getDomainId() ) != 1 ) {
1673                 return false;
1674             }
1675             if ( cd0.getNumberOfProteinsExhibitingCombination( b.getDomainId() ) != 2 ) {
1676                 return false;
1677             }
1678             if ( cd0.getNumberOfProteinsExhibitingCombination( c.getDomainId() ) != 3 ) {
1679                 return false;
1680             }
1681             if ( cd0.getNumberOfProteinsExhibitingCombination( key0.getDomainId() ) != 0 ) {
1682                 return false;
1683             }
1684             if ( cd0.getAllDomains().size() != 4 ) {
1685                 return false;
1686             }
1687             if ( !cd0.getAllDomains().contains( a.getDomainId() ) ) {
1688                 return false;
1689             }
1690             if ( !cd0.getAllDomains().contains( b.getDomainId() ) ) {
1691                 return false;
1692             }
1693             if ( !cd0.getAllDomains().contains( c.getDomainId() ) ) {
1694                 return false;
1695             }
1696             if ( !cd0.getAllDomains().contains( key0.getDomainId() ) ) {
1697                 return false;
1698             }
1699             if ( cd0.toBinaryDomainCombinations().size() != 3 ) {
1700                 return false;
1701             }
1702             final BinaryDomainCombination s0 = DirectedBinaryDomainCombination.obtainInstance( "key0", "a" );
1703             final BinaryDomainCombination s1 = DirectedBinaryDomainCombination.obtainInstance( "b", "key0" );
1704             final BinaryDomainCombination s2 = DirectedBinaryDomainCombination.obtainInstance( "key0", "c" );
1705             final BinaryDomainCombination s3 = DirectedBinaryDomainCombination.obtainInstance( "key0", "cc" );
1706             final BinaryDomainCombination s4 = DirectedBinaryDomainCombination.obtainInstance( "a", "b" );
1707             final BinaryDomainCombination s5 = DirectedBinaryDomainCombination.obtainInstance( "b", "a" );
1708             final BinaryDomainCombination s6 = DirectedBinaryDomainCombination.obtainInstance( "key0", "b" );
1709             final BinaryDomainCombination s7 = DirectedBinaryDomainCombination.obtainInstance( "a", "key0" );
1710             final BinaryDomainCombination s8 = DirectedBinaryDomainCombination.obtainInstance( "c", "key0" );
1711             if ( !cd0.toBinaryDomainCombinations().contains( s0 ) ) {
1712                 return false;
1713             }
1714             if ( cd0.toBinaryDomainCombinations().contains( s1 ) ) {
1715                 return false;
1716             }
1717             if ( !cd0.toBinaryDomainCombinations().contains( s2 ) ) {
1718                 return false;
1719             }
1720             if ( cd0.toBinaryDomainCombinations().contains( s3 ) ) {
1721                 return false;
1722             }
1723             if ( cd0.toBinaryDomainCombinations().contains( s4 ) ) {
1724                 return false;
1725             }
1726             if ( cd0.toBinaryDomainCombinations().contains( s5 ) ) {
1727                 return false;
1728             }
1729             if ( !cd0.toBinaryDomainCombinations().contains( s6 ) ) {
1730                 return false;
1731             }
1732             if ( cd0.toBinaryDomainCombinations().contains( s7 ) ) {
1733                 return false;
1734             }
1735             if ( cd0.toBinaryDomainCombinations().contains( s8 ) ) {
1736                 return false;
1737             }
1738             final Domain key1 = new BasicDomain( "key1", 1, 2, ( short ) 1, ( short ) 4, 0.1, -12 );
1739             final Domain a1 = new BasicDomain( "a1", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1740             final Domain b1 = new BasicDomain( "b1", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1741             final Domain c1 = new BasicDomain( "c1", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
1742             final CombinableDomains cd1 = new DirectedCombinableDomains( key1.getDomainId(), new BasicSpecies( "eel" ) );
1743             cd1.addCombinableDomain( a1.getDomainId() );
1744             cd1.addCombinableDomain( b1.getDomainId() );
1745             cd1.addCombinableDomain( c1.getDomainId() );
1746             cd1.addCombinableDomain( key1.getDomainId() );
1747             if ( cd1.getNumberOfCombinableDomains() != 4 ) {
1748                 return false;
1749             }
1750             if ( cd1.getNumberOfProteinsExhibitingCombination( a1.getDomainId() ) != 1 ) {
1751                 return false;
1752             }
1753             if ( cd1.getNumberOfProteinsExhibitingCombination( b1.getDomainId() ) != 1 ) {
1754                 return false;
1755             }
1756             if ( cd1.getNumberOfProteinsExhibitingCombination( c1.getDomainId() ) != 1 ) {
1757                 return false;
1758             }
1759             if ( cd1.getNumberOfProteinsExhibitingCombination( key1.getDomainId() ) != 1 ) {
1760                 return false;
1761             }
1762             if ( cd1.getAllDomains().size() != 4 ) {
1763                 return false;
1764             }
1765             if ( cd1.toBinaryDomainCombinations().size() != 4 ) {
1766                 return false;
1767             }
1768             final BinaryDomainCombination kk = DirectedBinaryDomainCombination.obtainInstance( "key1", "key1" );
1769             if ( !cd1.toBinaryDomainCombinations().contains( kk ) ) {
1770                 return false;
1771             }
1772         }
1773         catch ( final Exception e ) {
1774             e.printStackTrace( System.out );
1775             return false;
1776         }
1777         return true;
1778     }
1779
1780     private static boolean testDirectedness() {
1781         try {
1782             final BinaryStates X = BinaryStates.PRESENT;
1783             final BinaryStates O = BinaryStates.ABSENT;
1784             final GainLossStates G = GainLossStates.GAIN;
1785             final GainLossStates L = GainLossStates.LOSS;
1786             final GainLossStates A = GainLossStates.UNCHANGED_ABSENT;
1787             final GainLossStates P = GainLossStates.UNCHANGED_PRESENT;
1788             final Protein one_1 = new BasicProtein( "one", "1", 0 );
1789             final Protein two_1 = new BasicProtein( "two", "1", 0 );
1790             final Protein three_1 = new BasicProtein( "three", "1", 0 );
1791             final Protein four_1 = new BasicProtein( "four", "1", 0 );
1792             final Protein five_1 = new BasicProtein( "five", "1", 0 );
1793             one_1.addProteinDomain( new BasicDomain( "B", 12, 14, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1794             one_1.addProteinDomain( new BasicDomain( "C", 13, 14, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1795             one_1.addProteinDomain( new BasicDomain( "A", 11, 12, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1796             one_1.addProteinDomain( new BasicDomain( "X", 100, 110, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1797             one_1.addProteinDomain( new BasicDomain( "Y", 200, 210, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1798             two_1.addProteinDomain( new BasicDomain( "A", 10, 20, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1799             two_1.addProteinDomain( new BasicDomain( "B", 30, 40, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1800             two_1.addProteinDomain( new BasicDomain( "Y", 1, 2, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1801             two_1.addProteinDomain( new BasicDomain( "X", 10, 11, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1802             three_1.addProteinDomain( new BasicDomain( "P", 10, 11, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1803             three_1.addProteinDomain( new BasicDomain( "M", 1, 2, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1804             three_1.addProteinDomain( new BasicDomain( "M", 5, 6, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1805             three_1.addProteinDomain( new BasicDomain( "N", 7, 8, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1806             three_1.addProteinDomain( new BasicDomain( "N", 3, 4, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1807             four_1.addProteinDomain( new BasicDomain( "XX", 10, 20, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1808             five_1.addProteinDomain( new BasicDomain( "YY", 30, 40, ( short ) 1, ( short ) 4, 0.1, -12 ) );
1809             final List<Protein> list_1 = new ArrayList<Protein>();
1810             list_1.add( one_1 );
1811             list_1.add( two_1 );
1812             list_1.add( three_1 );
1813             list_1.add( four_1 );
1814             list_1.add( five_1 );
1815             final GenomeWideCombinableDomains gwcd_1 = BasicGenomeWideCombinableDomains
1816                     .createInstance( list_1, false, new BasicSpecies( "1" ), DomainCombinationType.DIRECTED );
1817             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "A",
1818                     "B" ) ) ) {
1819                 return false;
1820             }
1821             if ( gwcd_1.toBinaryDomainCombinations()
1822                     .contains( DirectedBinaryDomainCombination.obtainInstance( "B", "A" ) ) ) {
1823                 return false;
1824             }
1825             if ( gwcd_1.toBinaryDomainCombinations()
1826                     .contains( DirectedBinaryDomainCombination.obtainInstance( "A", "A" ) ) ) {
1827                 return false;
1828             }
1829             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "A",
1830                     "C" ) ) ) {
1831                 return false;
1832             }
1833             if ( gwcd_1.toBinaryDomainCombinations()
1834                     .contains( DirectedBinaryDomainCombination.obtainInstance( "C", "A" ) ) ) {
1835                 return false;
1836             }
1837             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "B",
1838                     "C" ) ) ) {
1839                 return false;
1840             }
1841             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "C",
1842                     "X" ) ) ) {
1843                 return false;
1844             }
1845             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "C",
1846                     "Y" ) ) ) {
1847                 return false;
1848             }
1849             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "A",
1850                     "X" ) ) ) {
1851                 return false;
1852             }
1853             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "A",
1854                     "Y" ) ) ) {
1855                 return false;
1856             }
1857             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "Y",
1858                     "A" ) ) ) {
1859                 return false;
1860             }
1861             if ( gwcd_1.toBinaryDomainCombinations()
1862                     .contains( DirectedBinaryDomainCombination.obtainInstance( "X", "A" ) ) ) {
1863                 return false;
1864             }
1865             if ( gwcd_1.toBinaryDomainCombinations()
1866                     .contains( DirectedBinaryDomainCombination.obtainInstance( "C", "B" ) ) ) {
1867                 return false;
1868             }
1869             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "X",
1870                     "Y" ) ) ) {
1871                 return false;
1872             }
1873             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "Y",
1874                     "X" ) ) ) {
1875                 return false;
1876             }
1877             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "A",
1878                     "Y" ) ) ) {
1879                 return false;
1880             }
1881             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "A",
1882                     "X" ) ) ) {
1883                 return false;
1884             }
1885             if ( gwcd_1.toBinaryDomainCombinations()
1886                     .contains( DirectedBinaryDomainCombination.obtainInstance( "Y", "C" ) ) ) {
1887                 return false;
1888             }
1889             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "M",
1890                     "N" ) ) ) {
1891                 return false;
1892             }
1893             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "N",
1894                     "M" ) ) ) {
1895                 return false;
1896             }
1897             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "N",
1898                     "P" ) ) ) {
1899                 return false;
1900             }
1901             if ( !gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "M",
1902                     "P" ) ) ) {
1903                 return false;
1904             }
1905             if ( gwcd_1.toBinaryDomainCombinations()
1906                     .contains( DirectedBinaryDomainCombination.obtainInstance( "P", "N" ) ) ) {
1907                 return false;
1908             }
1909             if ( gwcd_1.toBinaryDomainCombinations()
1910                     .contains( DirectedBinaryDomainCombination.obtainInstance( "P", "M" ) ) ) {
1911                 return false;
1912             }
1913             if ( gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "XX",
1914                     "YY" ) ) ) {
1915                 return false;
1916             }
1917             if ( gwcd_1.toBinaryDomainCombinations().contains( DirectedBinaryDomainCombination.obtainInstance( "YY",
1918                     "XX" ) ) ) {
1919                 return false;
1920             }
1921             if ( gwcd_1.toBinaryDomainCombinations()
1922                     .contains( DirectedBinaryDomainCombination.obtainInstance( "B", "B" ) ) ) {
1923                 return false;
1924             }
1925             //            final List<GenomeWideCombinableDomains> gwcd_list = new ArrayList<GenomeWideCombinableDomains>();
1926             //            gwcd_list.add( gwcd_1 );
1927             //            gwcd_list.add( gwcd_2 );
1928             //            final CharacterStateMatrix<BinaryStates> matrix_d = DomainParsimonyCalculator
1929             //                    .createMatrixOfDomainPresenceOrAbsence( gwcd_list );
1930             //            final CharacterStateMatrix<BinaryStates> matrix_bc = DomainParsimonyCalculator
1931             //                    .createMatrixOfBinaryDomainCombinationPresenceOrAbsence( gwcd_list );
1932             //            if ( matrix_d.getState( 0, 0 ) != X ) {
1933             //                return false;
1934             //            }
1935             //            if ( matrix_bc.getState( 0, 0 ) != X ) {
1936             //                return false;
1937             //            }
1938             //
1939             //
1940             //            final BasicCharacterStateMatrix<BinaryStates> dm = new BasicCharacterStateMatrix<BinaryStates>( new BinaryStates[][] {
1941             //                    { X, X, X, X, X, X }, { X, X, X, X, X, X } } );
1942             //            if ( !matrix_d.equals( dm ) ) {
1943             //                return false;
1944             //            }
1945             //            final BasicCharacterStateMatrix<BinaryStates> bcm = new BasicCharacterStateMatrix<BinaryStates>( new BinaryStates[][] {
1946             //                    { X, O, X, X, X, X, O, X, X, O, X, X }, { X, X, X, O, O, O, O, X, O, O, X, X } } );
1947             //            if ( !matrix_d.equals( dm ) ) {
1948             //                return false;
1949             //            }
1950             //``````````````````````````
1951             //            final List<GenomeWideCombinableDomains> gwcd_list = new ArrayList<GenomeWideCombinableDomains>();
1952             //            gwcd_list.add( one );
1953             //            gwcd_list.add( two );
1954             //            gwcd_list.add( three );
1955             //            gwcd_list.add( four );
1956             //            final CharacterStateMatrix<BinaryStates> matrix_d = DomainParsimony
1957             //                    .createMatrixOfDomainPresenceOrAbsence( gwcd_list );
1958             //            final CharacterStateMatrix<BinaryStates> matrix_bc = DomainParsimony
1959             //                    .createMatrixOfBinaryDomainCombinationPresenceOrAbsence( gwcd_list );
1960             //            //         System.out.println( "d:"  );
1961             //            //         System.out.println(matrix_d.toStringBuffer().toString()  );
1962             //            //         System.out.println( "bc:"  );
1963             //            //        System.out.println(matrix_bc.toStringBuffer().toString()  );
1964             //            // 1 a b c e f g h l m
1965             //            // 2 a b c e f g i n o
1966             //            // 3 a b d e f g j p q
1967             //            // 4 a b d p r
1968             //            if ( matrix_d.getState( 0, 0 ) != X ) {
1969             //                return false;
1970             //            }
1971             //            if ( matrix_d.getState( 0, 1 ) != X ) {
1972             //                return false;
1973             //            }
1974             //            if ( matrix_d.getState( 0, 2 ) != X ) {
1975             //                return false;
1976             //            }
1977             //            if ( matrix_d.getState( 0, 3 ) != O ) {
1978             //                return false;
1979             //            }
1980             //            if ( matrix_d.getState( 0, 4 ) != X ) {
1981             //                return false;
1982             //            }
1983             //            if ( matrix_d.getState( 0, 5 ) != X ) {
1984             //                return false;
1985             //            }
1986             //            if ( matrix_d.getState( 0, 6 ) != X ) {
1987             //                return false;
1988             //            }
1989             //            if ( matrix_d.getState( 0, 7 ) != X ) {
1990             //                return false;
1991             //            }
1992             //            if ( matrix_d.getState( 0, 8 ) != O ) {
1993             //                return false;
1994             //            }
1995             //            // 1 a-a a-b a-c e-f e-g e-h f-g f-h g-h l-m
1996             //            // 2 a-b a-c e-f e-g e-i f-g f-i g-i n-o
1997             //            // 3 a-b a-d e-f e-g e-j f-g f-j g-j p-q
1998             //            // 4 a-b a-d p-r
1999             //            if ( matrix_bc.getState( 0, 0 ) != X ) {
2000             //                return false;
2001             //            }
2002             //            if ( matrix_bc.getState( 0, 1 ) != X ) {
2003             //                return false;
2004             //            }
2005             //            if ( matrix_bc.getState( 0, 2 ) != X ) {
2006             //                return false;
2007             //            }
2008             //            if ( matrix_bc.getState( 0, 3 ) != O ) {
2009             //                return false;
2010             //            }
2011             //            if ( matrix_bc.getState( 0, 4 ) != X ) {
2012             //                return false;
2013             //            }
2014             //            if ( matrix_bc.getState( 1, 0 ) != O ) {
2015             //                return false;
2016             //            }
2017             //            if ( matrix_bc.getState( 1, 1 ) != X ) {
2018             //                return false;
2019             //            }
2020             //            if ( matrix_bc.getState( 1, 2 ) != X ) {
2021             //                return false;
2022             //            }
2023             //            if ( matrix_bc.getState( 1, 3 ) != O ) {
2024             //                return false;
2025             //            }
2026             //            if ( matrix_bc.getState( 1, 4 ) != X ) {
2027             //                return false;
2028             //            }
2029             //            if ( matrix_bc.getState( 2, 0 ) != O ) {
2030             //                return false;
2031             //            }
2032             //            if ( matrix_bc.getState( 2, 1 ) != X ) {
2033             //                return false;
2034             //            }
2035             //            if ( matrix_bc.getState( 2, 2 ) != O ) {
2036             //                return false;
2037             //            }
2038             //            if ( matrix_bc.getState( 2, 3 ) != X ) {
2039             //                return false;
2040             //            }
2041             //            if ( matrix_bc.getState( 2, 4 ) != X ) {
2042             //                return false;
2043             //            }
2044             //            final PhylogenyFactory factory0 = ParserBasedPhylogenyFactory.getInstance();
2045             //            final String p0_str = "((one,two)1-2,(three,four)3-4)root";
2046             //            final Phylogeny p0 = factory0.create( p0_str, new NHXParser() )[ 0 ];
2047             //            final DomainParsimony dp0 = DomainParsimony.createInstance( p0, gwcd_list );
2048             //            dp0.executeDolloParsimonyOnDomainPresence();
2049             //            final CharacterStateMatrix<GainLossStates> gl_matrix_d = dp0.getGainLossMatrix();
2050             //            final CharacterStateMatrix<BinaryStates> is_matrix_d = dp0.getInternalStatesMatrix();
2051             //            dp0.executeDolloParsimonyOnBinaryDomainCombintionPresence();
2052             //            final CharacterStateMatrix<GainLossStates> gl_matrix_bc = dp0.getGainLossMatrix();
2053             //            final CharacterStateMatrix<BinaryStates> is_matrix_bc = dp0.getInternalStatesMatrix();
2054             //            if ( is_matrix_d.getState( "root", "A" ) != X ) {
2055             //                return false;
2056             //            }
2057             //            if ( is_matrix_d.getState( "root", "B" ) != X ) {
2058             //                return false;
2059             //            }
2060             //            if ( is_matrix_d.getState( "root", "C" ) != O ) {
2061             //                return false;
2062             //            }
2063             //            if ( is_matrix_d.getState( "root", "D" ) != O ) {
2064             //                return false;
2065             //            }
2066             //            if ( is_matrix_d.getState( "root", "E" ) != X ) {
2067             //                return false;
2068             //            }
2069             //            if ( is_matrix_bc.getState( "root", "A=A" ) != O ) {
2070             //                return false;
2071             //            }
2072             //            if ( is_matrix_bc.getState( "root", "A=B" ) != X ) {
2073             //                return false;
2074             //            }
2075             //            if ( is_matrix_bc.getState( "root", "A=C" ) != O ) {
2076             //                return false;
2077             //            }
2078             //            if ( is_matrix_bc.getState( "root", "A=D" ) != O ) {
2079             //                return false;
2080             //            }
2081             //            if ( is_matrix_bc.getState( "root", "G=H" ) != O ) {
2082             //                return false;
2083             //            }
2084             //            if ( is_matrix_bc.getState( "1-2", "G=H" ) != O ) {
2085             //                return false;
2086             //            }
2087             //            if ( is_matrix_bc.getState( "root", "E=F" ) != X ) {
2088             //                return false;
2089             //            }
2090             //            if ( gl_matrix_bc.getState( "root", "E=F" ) != P ) {
2091             //                return false;
2092             //            }
2093             //            if ( gl_matrix_bc.getState( "root", "A=A" ) != A ) {
2094             //                return false;
2095             //            }
2096             //            if ( gl_matrix_bc.getState( "one", "A=A" ) != G ) {
2097             //                return false;
2098             //            }
2099             //            if ( gl_matrix_bc.getState( "root", "A=B" ) != P ) {
2100             //                return false;
2101             //            }
2102             //            if ( gl_matrix_bc.getState( "3-4", "A=D" ) != G ) {
2103             //                return false;
2104             //            }
2105             //            if ( gl_matrix_bc.getState( "four", "E=F" ) != L ) {
2106             //                return false;
2107             //            }
2108             //            if ( gl_matrix_d.getState( "3-4", "P" ) != G ) {
2109             //                return false;
2110             //            }
2111             //            final Protein ab_1 = new BasicProtein( "ab", "one" );
2112             //            ab_1.addProteinDomain( a );
2113             //            ab_1.addProteinDomain( b );
2114             //            final Protein ac_1 = new BasicProtein( "ac", "one" );
2115             //            ac_1.addProteinDomain( a );
2116             //            ac_1.addProteinDomain( c );
2117             //            final Protein de_1 = new BasicProtein( "de", "one" );
2118             //            de_1.addProteinDomain( d );
2119             //            de_1.addProteinDomain( e );
2120             //            final Protein ac_2 = new BasicProtein( "ac", "two" );
2121             //            ac_2.addProteinDomain( a );
2122             //            ac_2.addProteinDomain( c );
2123             //            final Protein ab_3 = new BasicProtein( "ab", "three" );
2124             //            ab_3.addProteinDomain( a );
2125             //            ab_3.addProteinDomain( b );
2126             //            final Protein de_4 = new BasicProtein( "de", "four" );
2127             //            de_4.addProteinDomain( d );
2128             //            de_4.addProteinDomain( e );
2129             //            final Protein ab_6 = new BasicProtein( "ab", "six" );
2130             //            ab_6.addProteinDomain( a );
2131             //            ab_6.addProteinDomain( b );
2132             //            final List<Protein> spec_one = new ArrayList<Protein>();
2133             //            final List<Protein> spec_two = new ArrayList<Protein>();
2134             //            final List<Protein> spec_three = new ArrayList<Protein>();
2135             //            final List<Protein> spec_four = new ArrayList<Protein>();
2136             //            final List<Protein> spec_five = new ArrayList<Protein>();
2137             //            final List<Protein> spec_six = new ArrayList<Protein>();
2138             //            final List<Protein> spec_seven = new ArrayList<Protein>();
2139             //            spec_one.add( ab_1 );
2140             //            spec_one.add( ac_1 );
2141             //            spec_one.add( de_1 );
2142             //            spec_two.add( ac_2 );
2143             //            spec_three.add( ab_3 );
2144             //            spec_four.add( de_4 );
2145             //            spec_six.add( ab_6 );
2146             //            final GenomeWideCombinableDomains one_gwcd = BasicGenomeWideCombinableDomains
2147             //                    .createInstance( spec_one, false, new BasicSpecies( "one" ), false );
2148             //            final GenomeWideCombinableDomains two_gwcd = BasicGenomeWideCombinableDomains
2149             //                    .createInstance( spec_two, false, new BasicSpecies( "two" ), false );
2150             //            final GenomeWideCombinableDomains three_gwcd = BasicGenomeWideCombinableDomains
2151             //                    .createInstance( spec_three, false, new BasicSpecies( "three" ), false );
2152             //            final GenomeWideCombinableDomains four_gwcd = BasicGenomeWideCombinableDomains
2153             //                    .createInstance( spec_four, false, new BasicSpecies( "four" ), false );
2154             //            final GenomeWideCombinableDomains five_gwcd = BasicGenomeWideCombinableDomains
2155             //                    .createInstance( spec_five, false, new BasicSpecies( "five" ), false );
2156             //            final GenomeWideCombinableDomains six_gwcd = BasicGenomeWideCombinableDomains
2157             //                    .createInstance( spec_six, false, new BasicSpecies( "six" ), false );
2158             //            final GenomeWideCombinableDomains seven_gwcd = BasicGenomeWideCombinableDomains
2159             //                    .createInstance( spec_seven, false, new BasicSpecies( "seven" ), false
2160             //                                    );
2161             //            final List<GenomeWideCombinableDomains> gwcd_list1 = new ArrayList<GenomeWideCombinableDomains>();
2162             //            gwcd_list1.add( one_gwcd );
2163             //            gwcd_list1.add( two_gwcd );
2164             //            gwcd_list1.add( three_gwcd );
2165             //            gwcd_list1.add( four_gwcd );
2166             //            gwcd_list1.add( five_gwcd );
2167             //            gwcd_list1.add( six_gwcd );
2168             //            gwcd_list1.add( seven_gwcd );
2169             //            final PhylogenyFactory factory1 = ParserBasedPhylogenyFactory.getInstance();
2170             //            final String p1_str = "(((((one,two)12,three)123,(four,five)45)12345,six)123456,seven)root";
2171             //            final Phylogeny p1 = factory1.create( p1_str, new NHXParser() )[ 0 ];
2172             //            final DomainParsimony dp1 = DomainParsimony.createInstance( p1, gwcd_list1 );
2173             //            dp1.executeDolloParsimonyOnDomainPresence();
2174             //            final CharacterStateMatrix<GainLossStates> gl_dollo_d = dp1.getGainLossMatrix();
2175             //            final CharacterStateMatrix<BinaryStates> i_dollo_d = dp1.getInternalStatesMatrix();
2176             //            if ( dp1.getCost() != 14 ) {
2177             //                return false;
2178             //            }
2179             //            if ( dp1.getTotalGains() != 5 ) {
2180             //                return false;
2181             //            }
2182             //            if ( dp1.getTotalLosses() != 9 ) {
2183             //                return false;
2184             //            }
2185             //            if ( dp1.getTotalUnchanged() != 51 ) {
2186             //                return false;
2187             //            }
2188             //            if ( dp1.getNetGainsOnNode( "45" ) != -2 ) {
2189             //                return false;
2190             //            }
2191             //            if ( dp1.getSumOfGainsOnNode( "45" ) != 0 ) {
2192             //                return false;
2193             //            }
2194             //            if ( dp1.getSumOfLossesOnNode( "45" ) != 2 ) {
2195             //                return false;
2196             //            }
2197             //            if ( dp1.getSumOfUnchangedOnNode( "45" ) != 3 ) {
2198             //                return false;
2199             //            }
2200             //            if ( dp1.getSumOfUnchangedPresentOnNode( "45" ) != 2 ) {
2201             //                return false;
2202             //            }
2203             //            if ( dp1.getSumOfUnchangedAbsentOnNode( "45" ) != 1 ) {
2204             //                return false;
2205             //            }
2206             //            if ( dp1.getUnitsGainedOnNode( "45" ).contains( "A" ) ) {
2207             //                return false;
2208             //            }
2209             //            if ( !dp1.getUnitsLostOnNode( "45" ).contains( "A" ) ) {
2210             //                return false;
2211             //            }
2212             //            if ( !dp1.getUnitsLostOnNode( "45" ).contains( "B" ) ) {
2213             //                return false;
2214             //            }
2215             //            if ( !dp1.getUnitsGainedOnNode( "12345" ).contains( "D" ) ) {
2216             //                return false;
2217             //            }
2218             //            if ( !dp1.getUnitsOnNode( "12" ).contains( "A" ) ) {
2219             //                return false;
2220             //            }
2221             //            if ( !dp1.getUnitsOnNode( "12" ).contains( "B" ) ) {
2222             //                return false;
2223             //            }
2224             //            if ( !dp1.getUnitsOnNode( "12" ).contains( "C" ) ) {
2225             //                return false;
2226             //            }
2227             //            if ( !dp1.getUnitsOnNode( "12" ).contains( "D" ) ) {
2228             //                return false;
2229             //            }
2230             //            if ( !dp1.getUnitsOnNode( "12" ).contains( "E" ) ) {
2231             //                return false;
2232             //            }
2233             //            if ( dp1.getNetGainsOnNode( "123456" ) != 2 ) {
2234             //                return false;
2235             //            }
2236             //            if ( dp1.getSumOfGainsOnNode( "123456" ) != 2 ) {
2237             //                return false;
2238             //            }
2239             //            dp1.executeDolloParsimonyOnBinaryDomainCombintionPresence();
2240             //            final CharacterStateMatrix<GainLossStates> gl_dollo_bc = dp1.getGainLossMatrix();
2241             //            final CharacterStateMatrix<BinaryStates> i_dollo_bc = dp1.getInternalStatesMatrix();
2242             //            if ( dp1.getCost() != 8 ) {
2243             //                return false;
2244             //            }
2245             //            if ( dp1.getTotalGains() != 3 ) {
2246             //                return false;
2247             //            }
2248             //            if ( dp1.getTotalLosses() != 5 ) {
2249             //                return false;
2250             //            }
2251             //            if ( dp1.getTotalUnchanged() != 31 ) {
2252             //                return false;
2253             //            }
2254             //            if ( !dp1.getUnitsLostOnNode( "45" ).contains( "A=B" ) ) {
2255             //                return false;
2256             //            }
2257             //            if ( !dp1.getUnitsGainedOnNode( "12345" ).contains( "D=E" ) ) {
2258             //                return false;
2259             //            }
2260             //            dp1.executeFitchParsimonyOnDomainPresence();
2261             //            final CharacterStateMatrix<GainLossStates> gl_fitch_d = dp1.getGainLossMatrix();
2262             //            final CharacterStateMatrix<BinaryStates> i_fitch_d = dp1.getInternalStatesMatrix();
2263             //            if ( dp1.getCost() != 10 ) {
2264             //                return false;
2265             //            }
2266             //            if ( dp1.getTotalGains() != 7 ) {
2267             //                return false;
2268             //            }
2269             //            if ( dp1.getTotalLosses() != 3 ) {
2270             //                return false;
2271             //            }
2272             //            if ( dp1.getTotalUnchanged() != 55 ) {
2273             //                return false;
2274             //            }
2275             //            if ( !dp1.getUnitsGainedOnNode( "four" ).contains( "E" ) ) {
2276             //                return false;
2277             //            }
2278             //            dp1.executeFitchParsimonyOnBinaryDomainCombintion();
2279             //            final CharacterStateMatrix<GainLossStates> gl_fitch_bc = dp1.getGainLossMatrix();
2280             //            final CharacterStateMatrix<BinaryStates> i_fitch_bc = dp1.getInternalStatesMatrix();
2281             //            if ( dp1.getCost() != 6 ) {
2282             //                return false;
2283             //            }
2284             //            if ( dp1.getTotalGains() != 4 ) {
2285             //                return false;
2286             //            }
2287             //            if ( dp1.getTotalLosses() != 2 ) {
2288             //                return false;
2289             //            }
2290             //            if ( dp1.getTotalUnchanged() != 33 ) {
2291             //                return false;
2292             //            }
2293             //            if ( !dp1.getUnitsLostOnNode( "45" ).contains( "A=B" ) ) {
2294             //                return false;
2295             //            }
2296             //            if ( !dp1.getUnitsGainedOnNode( "four" ).contains( "D=E" ) ) {
2297             //                return false;
2298             //            }
2299             //            if ( dp1.getNetGainsOnNode( "two" ) != -1 ) {
2300             //                return false;
2301             //            }
2302             //            if ( dp1.getNetGainsOnNode( "123" ) != 0 ) {
2303             //                return false;
2304             //            }
2305             //            if ( dp1.getSumOfUnchangedPresentOnNode( "123" ) != 1 ) {
2306             //                return false;
2307             //            }
2308             //            if ( dp1.getSumOfUnchangedAbsentOnNode( "123" ) != 2 ) {
2309             //                return false;
2310             //            }
2311             //            if ( dp1.getSumOfUnchangedOnNode( "123" ) != 3 ) {
2312             //                return false;
2313             //            }
2314             //            if ( dp1.getSumOfUnchangedOnNode( "two" ) != 2 ) {
2315             //                return false;
2316             //            }
2317             //            if ( !dp1.getUnitsUnchangedAbsentOnNode( "two" ).contains( "D=E" ) ) {
2318             //                return false;
2319             //            }
2320             //            if ( !dp1.getUnitsUnchangedPresentOnNode( "two" ).contains( "A=C" ) ) {
2321             //                return false;
2322             //            }
2323             //            if ( !dp1.getUnitsUnchangedAbsentOnNode( "123" ).contains( "A=C" ) ) {
2324             //                return false;
2325             //            }
2326             //            if ( !dp1.getUnitsUnchangedPresentOnNode( "123" ).contains( "A=B" ) ) {
2327             //                return false;
2328             //            }
2329             //            if ( !dp1.getUnitsUnchangedAbsentOnNode( "123" ).contains( "D=E" ) ) {
2330             //                return false;
2331             //            }
2332             //            CharacterStateMatrix<BinaryStates> bsm = null;
2333             //            CharacterStateMatrix<GainLossStates> glm = null;
2334             //            bsm = new BasicCharacterStateMatrix<BinaryStates>( new BinaryStates[][] { { X, X, X, X, X },
2335             //                    { X, X, O, X, X }, { O, O, O, X, X }, { X, X, O, X, X }, { X, X, O, O, O }, { O, O, O, O, O } } );
2336             //            if ( !bsm.equals( i_dollo_d ) ) {
2337             //                return false;
2338             //            }
2339             //            bsm = new BasicCharacterStateMatrix<BinaryStates>( new BinaryStates[][] { { X, X, X, O, O },
2340             //                    { X, X, O, O, O }, { O, O, O, O, O }, { X, X, O, O, O }, { X, X, O, O, O }, { O, O, O, O, O } } );
2341             //            if ( !bsm.equals( i_fitch_d ) ) {
2342             //                return false;
2343             //            }
2344             //            glm = new BasicCharacterStateMatrix<GainLossStates>( new GainLossStates[][] { { P, P, P, P, P },
2345             //                    { P, L, P, L, L }, { P, P, G, P, P }, { P, P, A, L, L }, { P, P, A, P, P }, { A, A, A, P, P },
2346             //                    { A, A, A, L, L }, { L, L, A, P, P }, { P, P, A, G, G }, { P, P, A, A, A }, { G, G, A, A, A },
2347             //                    { A, A, A, A, A }, { A, A, A, A, A } } );
2348             //            if ( !glm.equals( gl_dollo_d ) ) {
2349             //                return false;
2350             //            }
2351             //            glm = new BasicCharacterStateMatrix<GainLossStates>( new GainLossStates[][] { { P, P, P, G, G },
2352             //                    { P, L, P, A, A }, { P, P, G, A, A }, { P, P, A, A, A }, { P, P, A, A, A }, { A, A, A, G, G },
2353             //                    { A, A, A, A, A }, { L, L, A, A, A }, { P, P, A, A, A }, { P, P, A, A, A }, { G, G, A, A, A },
2354             //                    { A, A, A, A, A }, { A, A, A, A, A } } );
2355             //            if ( !glm.equals( gl_fitch_d ) ) {
2356             //                return false;
2357             //            }
2358             //            bsm = new BasicCharacterStateMatrix<BinaryStates>( new BinaryStates[][] { { X, X, X }, { X, O, X },
2359             //                    { O, O, X }, { X, O, X }, { X, O, O }, { O, O, O } } );
2360             //            if ( !bsm.equals( i_dollo_bc ) ) {
2361             //                return false;
2362             //            }
2363             //            bsm = new BasicCharacterStateMatrix<BinaryStates>( new BinaryStates[][] { { X, X, O }, { X, O, O },
2364             //                    { O, O, O }, { X, O, O }, { X, O, O }, { O, O, O } } );
2365             //            if ( !bsm.equals( i_fitch_bc ) ) {
2366             //                return false;
2367             //            }
2368             //            glm = new BasicCharacterStateMatrix<GainLossStates>( new GainLossStates[][] { { P, P, P }, { L, P, L },
2369             //                    { P, G, P }, { P, A, L }, { P, A, P }, { A, A, P }, { A, A, L }, { L, A, P }, { P, A, G },
2370             //                    { P, A, A }, { G, A, A }, { A, A, A }, { A, A, A } } );
2371             //            if ( !glm.equals( gl_dollo_bc ) ) {
2372             //                return false;
2373             //            }
2374             //            glm = new BasicCharacterStateMatrix<GainLossStates>( new GainLossStates[][] { { P, P, G }, { L, P, A },
2375             //                    { P, G, A }, { P, A, A }, { P, A, A }, { A, A, G }, { A, A, A }, { L, A, A }, { P, A, A },
2376             //                    { P, A, A }, { G, A, A }, { A, A, A }, { A, A, A } } );
2377             //            if ( !glm.equals( gl_fitch_bc ) ) {
2378             //                return false;
2379             //            }
2380         }
2381         catch ( final Exception e ) {
2382             e.printStackTrace( System.out );
2383             return false;
2384         }
2385         return true;
2386     }
2387
2388     private static boolean testDirectednessAndAdjacency() {
2389         try {
2390             final Protein one_1 = new BasicProtein( "one", "1", 0 );
2391             final Protein two_1 = new BasicProtein( "two", "1", 0 );
2392             final Protein three_1 = new BasicProtein( "three", "1", 0 );
2393             final Protein four_1 = new BasicProtein( "four", "1", 0 );
2394             final Protein five_1 = new BasicProtein( "five", "1", 0 );
2395             one_1.addProteinDomain( new BasicDomain( "B", 12, 14, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2396             one_1.addProteinDomain( new BasicDomain( "C", 13, 14, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2397             one_1.addProteinDomain( new BasicDomain( "A", 11, 12, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2398             one_1.addProteinDomain( new BasicDomain( "X", 100, 110, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2399             one_1.addProteinDomain( new BasicDomain( "Y", 200, 210, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2400             two_1.addProteinDomain( new BasicDomain( "A", 10, 20, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2401             two_1.addProteinDomain( new BasicDomain( "B", 30, 40, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2402             two_1.addProteinDomain( new BasicDomain( "Y", 1, 2, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2403             two_1.addProteinDomain( new BasicDomain( "X", 10, 11, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2404             three_1.addProteinDomain( new BasicDomain( "P", 10, 11, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2405             three_1.addProteinDomain( new BasicDomain( "M", 1, 2, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2406             three_1.addProteinDomain( new BasicDomain( "M", 5, 6, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2407             three_1.addProteinDomain( new BasicDomain( "N", 7, 8, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2408             three_1.addProteinDomain( new BasicDomain( "N", 3, 4, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2409             four_1.addProteinDomain( new BasicDomain( "XX", 10, 20, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2410             five_1.addProteinDomain( new BasicDomain( "YY", 30, 40, ( short ) 1, ( short ) 4, 0.1, -12 ) );
2411             final List<Protein> list_1 = new ArrayList<Protein>();
2412             list_1.add( one_1 );
2413             list_1.add( two_1 );
2414             list_1.add( three_1 );
2415             list_1.add( four_1 );
2416             list_1.add( five_1 );
2417             final GenomeWideCombinableDomains gwcd_1 = BasicGenomeWideCombinableDomains
2418                     .createInstance( list_1, false, new BasicSpecies( "1" ), DomainCombinationType.DIRECTED_ADJACTANT );
2419             if ( !gwcd_1.toBinaryDomainCombinations()
2420                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "A", "B" ) ) ) {
2421                 return false;
2422             }
2423             if ( gwcd_1.toBinaryDomainCombinations()
2424                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "B", "A" ) ) ) {
2425                 return false;
2426             }
2427             if ( gwcd_1.toBinaryDomainCombinations()
2428                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "A", "A" ) ) ) {
2429                 return false;
2430             }
2431             if ( gwcd_1.toBinaryDomainCombinations()
2432                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "A", "C" ) ) ) {
2433                 return false;
2434             }
2435             if ( gwcd_1.toBinaryDomainCombinations()
2436                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "C", "A" ) ) ) {
2437                 return false;
2438             }
2439             if ( !gwcd_1.toBinaryDomainCombinations()
2440                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "B", "C" ) ) ) {
2441                 return false;
2442             }
2443             if ( !gwcd_1.toBinaryDomainCombinations()
2444                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "C", "X" ) ) ) {
2445                 return false;
2446             }
2447             if ( gwcd_1.toBinaryDomainCombinations()
2448                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "C", "Y" ) ) ) {
2449                 return false;
2450             }
2451             if ( !gwcd_1.toBinaryDomainCombinations()
2452                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "X", "Y" ) ) ) {
2453                 return false;
2454             }
2455             if ( gwcd_1.toBinaryDomainCombinations()
2456                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "A", "X" ) ) ) {
2457                 return false;
2458             }
2459             if ( gwcd_1.toBinaryDomainCombinations()
2460                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "A", "Y" ) ) ) {
2461                 return false;
2462             }
2463             if ( !gwcd_1.toBinaryDomainCombinations()
2464                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "Y", "A" ) ) ) {
2465                 return false;
2466             }
2467             if ( gwcd_1.toBinaryDomainCombinations()
2468                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "X", "A" ) ) ) {
2469                 return false;
2470             }
2471             if ( gwcd_1.toBinaryDomainCombinations()
2472                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "C", "B" ) ) ) {
2473                 return false;
2474             }
2475             if ( !gwcd_1.toBinaryDomainCombinations()
2476                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "X", "Y" ) ) ) {
2477                 return false;
2478             }
2479             if ( gwcd_1.toBinaryDomainCombinations()
2480                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "Y", "X" ) ) ) {
2481                 return false;
2482             }
2483             if ( gwcd_1.toBinaryDomainCombinations()
2484                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "A", "Y" ) ) ) {
2485                 return false;
2486             }
2487             if ( gwcd_1.toBinaryDomainCombinations()
2488                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "A", "X" ) ) ) {
2489                 return false;
2490             }
2491             if ( gwcd_1.toBinaryDomainCombinations()
2492                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "Y", "C" ) ) ) {
2493                 return false;
2494             }
2495             if ( !gwcd_1.toBinaryDomainCombinations()
2496                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "M", "N" ) ) ) {
2497                 return false;
2498             }
2499             if ( !gwcd_1.toBinaryDomainCombinations()
2500                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "N", "M" ) ) ) {
2501                 return false;
2502             }
2503             if ( !gwcd_1.toBinaryDomainCombinations()
2504                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "N", "P" ) ) ) {
2505                 return false;
2506             }
2507             if ( gwcd_1.toBinaryDomainCombinations()
2508                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "M", "P" ) ) ) {
2509                 return false;
2510             }
2511             if ( gwcd_1.toBinaryDomainCombinations()
2512                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "P", "N" ) ) ) {
2513                 return false;
2514             }
2515             if ( gwcd_1.toBinaryDomainCombinations()
2516                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "P", "M" ) ) ) {
2517                 return false;
2518             }
2519             if ( gwcd_1.toBinaryDomainCombinations()
2520                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "XX", "YY" ) ) ) {
2521                 return false;
2522             }
2523             if ( gwcd_1.toBinaryDomainCombinations()
2524                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "YY", "XX" ) ) ) {
2525                 return false;
2526             }
2527             if ( gwcd_1.toBinaryDomainCombinations()
2528                     .contains( AdjactantDirectedBinaryDomainCombination.obtainInstance( "B", "B" ) ) ) {
2529                 return false;
2530             }
2531         }
2532         catch ( final Exception e ) {
2533             e.printStackTrace( System.out );
2534             return false;
2535         }
2536         return true;
2537     }
2538
2539     private static boolean testDomainArchitectureBasedGenomeSimilarityCalculator() {
2540         try {
2541             final Domain a = new BasicDomain( "a", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2542             final Domain b = new BasicDomain( "b", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2543             final Domain c = new BasicDomain( "c", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2544             final Domain d = new BasicDomain( "d", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2545             final Domain e = new BasicDomain( "e", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2546             final Domain f = new BasicDomain( "f", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2547             final Domain g = new BasicDomain( "g", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2548             final Domain h = new BasicDomain( "h", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2549             final Domain i = new BasicDomain( "i", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2550             final Domain j = new BasicDomain( "j", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2551             final Domain k = new BasicDomain( "k", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2552             final Domain l = new BasicDomain( "l", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2553             final Domain m = new BasicDomain( "m", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2554             final Domain n = new BasicDomain( "n", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
2555             final Protein eel_0 = new BasicProtein( "0", "eel", 0 );
2556             final Protein eel_1 = new BasicProtein( "1", "eel", 0 );
2557             final Protein eel_2 = new BasicProtein( "2", "eel", 0 );
2558             final Protein eel_3 = new BasicProtein( "3", "eel", 0 );
2559             final Protein eel_4 = new BasicProtein( "4", "eel", 0 );
2560             final Protein eel_5 = new BasicProtein( "5", "eel", 0 );
2561             final Protein eel_6 = new BasicProtein( "6", "eel", 0 );
2562             final Protein rat_0 = new BasicProtein( "0", "rat", 0 );
2563             final Protein rat_1 = new BasicProtein( "1", "rat", 0 );
2564             final Protein rat_2 = new BasicProtein( "2", "rat", 0 );
2565             final Protein rat_3 = new BasicProtein( "3", "rat", 0 );
2566             final Protein rat_4 = new BasicProtein( "4", "rat", 0 );
2567             final Protein rat_5 = new BasicProtein( "5", "rat", 0 );
2568             final Protein rat_6 = new BasicProtein( "6", "rat", 0 );
2569             final Protein rat_7 = new BasicProtein( "7", "rat", 0 );
2570             eel_1.addProteinDomain( a );
2571             eel_2.addProteinDomain( a );
2572             eel_2.addProteinDomain( b );
2573             eel_3.addProteinDomain( a );
2574             eel_3.addProteinDomain( a );
2575             eel_3.addProteinDomain( b );
2576             eel_4.addProteinDomain( a );
2577             eel_4.addProteinDomain( b );
2578             eel_4.addProteinDomain( c );
2579             eel_4.addProteinDomain( d );
2580             eel_4.addProteinDomain( e );
2581             eel_5.addProteinDomain( e );
2582             eel_5.addProteinDomain( e );
2583             eel_5.addProteinDomain( f );
2584             eel_5.addProteinDomain( f );
2585             eel_5.addProteinDomain( f );
2586             eel_5.addProteinDomain( f );
2587             eel_6.addProteinDomain( g );
2588             eel_6.addProteinDomain( h );
2589             rat_1.addProteinDomain( a );
2590             rat_2.addProteinDomain( a );
2591             rat_2.addProteinDomain( b );
2592             rat_3.addProteinDomain( a );
2593             rat_3.addProteinDomain( a );
2594             rat_3.addProteinDomain( b );
2595             rat_4.addProteinDomain( a );
2596             rat_4.addProteinDomain( b );
2597             rat_4.addProteinDomain( c );
2598             rat_4.addProteinDomain( i );
2599             rat_4.addProteinDomain( l );
2600             rat_5.addProteinDomain( i );
2601             rat_5.addProteinDomain( f );
2602             rat_5.addProteinDomain( f );
2603             rat_6.addProteinDomain( j );
2604             rat_6.addProteinDomain( k );
2605             rat_7.addProteinDomain( m );
2606             rat_7.addProteinDomain( n );
2607             final List<Protein> protein_list_eel = new ArrayList<Protein>();
2608             protein_list_eel.add( eel_0 );
2609             protein_list_eel.add( eel_1 );
2610             protein_list_eel.add( eel_2 );
2611             protein_list_eel.add( eel_3 );
2612             protein_list_eel.add( eel_4 );
2613             protein_list_eel.add( eel_5 );
2614             protein_list_eel.add( eel_6 );
2615             final List<Protein> protein_list_rat = new ArrayList<Protein>();
2616             protein_list_rat.add( rat_0 );
2617             protein_list_rat.add( rat_1 );
2618             protein_list_rat.add( rat_2 );
2619             protein_list_rat.add( rat_3 );
2620             protein_list_rat.add( rat_4 );
2621             protein_list_rat.add( rat_5 );
2622             protein_list_rat.add( rat_6 );
2623             protein_list_rat.add( rat_7 );
2624             final GenomeWideCombinableDomains eel_not_ignore = BasicGenomeWideCombinableDomains
2625                     .createInstance( protein_list_eel, false, new BasicSpecies( "eel" ) );
2626             final GenomeWideCombinableDomains eel_ignore = BasicGenomeWideCombinableDomains
2627                     .createInstance( protein_list_eel, true, new BasicSpecies( "eel" ) );
2628             final GenomeWideCombinableDomains rat_not_ignore = BasicGenomeWideCombinableDomains
2629                     .createInstance( protein_list_rat, false, new BasicSpecies( "rat" ) );
2630             final GenomeWideCombinableDomains rat_ignore = BasicGenomeWideCombinableDomains
2631                     .createInstance( protein_list_rat, true, new BasicSpecies( "rat" ) );
2632             final DomainArchitectureBasedGenomeSimilarityCalculator calc_ni = new DomainArchitectureBasedGenomeSimilarityCalculator( eel_not_ignore,
2633                                                                                                                                      rat_not_ignore );
2634             final DomainArchitectureBasedGenomeSimilarityCalculator calc_i = new DomainArchitectureBasedGenomeSimilarityCalculator( eel_ignore,
2635                                                                                                                                     rat_ignore );
2636             if ( calc_ni.getAllDomains().size() != 14 ) {
2637                 return false;
2638             }
2639             if ( calc_i.getAllDomains().size() != 14 ) {
2640                 return false;
2641             }
2642             if ( calc_ni.getDomainsSpecificToGenome0().size() != 4 ) {
2643                 return false;
2644             }
2645             if ( calc_i.getDomainsSpecificToGenome0().size() != 4 ) {
2646                 return false;
2647             }
2648             if ( calc_ni.getDomainsSpecificToGenome1().size() != 6 ) {
2649                 return false;
2650             }
2651             if ( calc_i.getDomainsSpecificToGenome1().size() != 6 ) {
2652                 return false;
2653             }
2654             if ( calc_i.getSharedDomains().size() != 4 ) {
2655                 return false;
2656             }
2657             if ( calc_ni.getSharedDomains().size() != 4 ) {
2658                 return false;
2659             }
2660             if ( !calc_ni.getDomainsSpecificToGenome0().contains( d.getDomainId() ) ) {
2661                 return false;
2662             }
2663             if ( !calc_ni.getDomainsSpecificToGenome0().contains( e.getDomainId() ) ) {
2664                 return false;
2665             }
2666             if ( !calc_ni.getDomainsSpecificToGenome0().contains( g.getDomainId() ) ) {
2667                 return false;
2668             }
2669             if ( !calc_ni.getDomainsSpecificToGenome0().contains( h.getDomainId() ) ) {
2670                 return false;
2671             }
2672             if ( calc_ni.getDomainsSpecificToGenome0().contains( a.getDomainId() ) ) {
2673                 return false;
2674             }
2675             if ( calc_ni.getDomainsSpecificToGenome0().contains( i.getDomainId() ) ) {
2676                 return false;
2677             }
2678             if ( !calc_i.getDomainsSpecificToGenome0().contains( d.getDomainId() ) ) {
2679                 return false;
2680             }
2681             if ( !calc_i.getDomainsSpecificToGenome0().contains( e.getDomainId() ) ) {
2682                 return false;
2683             }
2684             if ( !calc_i.getDomainsSpecificToGenome0().contains( g.getDomainId() ) ) {
2685                 return false;
2686             }
2687             if ( !calc_i.getDomainsSpecificToGenome0().contains( h.getDomainId() ) ) {
2688                 return false;
2689             }
2690             if ( calc_i.getDomainsSpecificToGenome0().contains( a.getDomainId() ) ) {
2691                 return false;
2692             }
2693             if ( calc_i.getDomainsSpecificToGenome0().contains( i.getDomainId() ) ) {
2694                 return false;
2695             }
2696             if ( !calc_ni.getDomainsSpecificToGenome1().contains( i.getDomainId() ) ) {
2697                 return false;
2698             }
2699             if ( !calc_ni.getDomainsSpecificToGenome1().contains( l.getDomainId() ) ) {
2700                 return false;
2701             }
2702             if ( !calc_ni.getDomainsSpecificToGenome1().contains( j.getDomainId() ) ) {
2703                 return false;
2704             }
2705             if ( !calc_ni.getDomainsSpecificToGenome1().contains( k.getDomainId() ) ) {
2706                 return false;
2707             }
2708             if ( !calc_ni.getDomainsSpecificToGenome1().contains( m.getDomainId() ) ) {
2709                 return false;
2710             }
2711             if ( !calc_ni.getDomainsSpecificToGenome1().contains( n.getDomainId() ) ) {
2712                 return false;
2713             }
2714             if ( calc_ni.getDomainsSpecificToGenome1().contains( a.getDomainId() ) ) {
2715                 return false;
2716             }
2717             if ( calc_ni.getDomainsSpecificToGenome1().contains( b.getDomainId() ) ) {
2718                 return false;
2719             }
2720             if ( calc_ni.getDomainsSpecificToGenome1().contains( d.getDomainId() ) ) {
2721                 return false;
2722             }
2723             if ( !calc_i.getDomainsSpecificToGenome1().contains( i.getDomainId() ) ) {
2724                 return false;
2725             }
2726             if ( !calc_i.getDomainsSpecificToGenome1().contains( l.getDomainId() ) ) {
2727                 return false;
2728             }
2729             if ( !calc_i.getDomainsSpecificToGenome1().contains( j.getDomainId() ) ) {
2730                 return false;
2731             }
2732             if ( !calc_i.getDomainsSpecificToGenome1().contains( k.getDomainId() ) ) {
2733                 return false;
2734             }
2735             if ( !calc_i.getDomainsSpecificToGenome1().contains( m.getDomainId() ) ) {
2736                 return false;
2737             }
2738             if ( !calc_i.getDomainsSpecificToGenome1().contains( n.getDomainId() ) ) {
2739                 return false;
2740             }
2741             if ( calc_i.getDomainsSpecificToGenome1().contains( a.getDomainId() ) ) {
2742                 return false;
2743             }
2744             if ( calc_i.getDomainsSpecificToGenome1().contains( b.getDomainId() ) ) {
2745                 return false;
2746             }
2747             if ( calc_i.getDomainsSpecificToGenome1().contains( d.getDomainId() ) ) {
2748                 return false;
2749             }
2750             if ( !calc_i.getSharedDomains().contains( a.getDomainId() ) ) {
2751                 return false;
2752             }
2753             if ( !calc_i.getSharedDomains().contains( b.getDomainId() ) ) {
2754                 return false;
2755             }
2756             if ( !calc_i.getSharedDomains().contains( c.getDomainId() ) ) {
2757                 return false;
2758             }
2759             if ( !calc_i.getSharedDomains().contains( f.getDomainId() ) ) {
2760                 return false;
2761             }
2762             final Set<String> all = calc_ni.getAllDomains();
2763             if ( !all.contains( a.getDomainId() ) ) {
2764                 return false;
2765             }
2766             if ( !all.contains( b.getDomainId() ) ) {
2767                 return false;
2768             }
2769             if ( !all.contains( c.getDomainId() ) ) {
2770                 return false;
2771             }
2772             if ( !all.contains( d.getDomainId() ) ) {
2773                 return false;
2774             }
2775             if ( !all.contains( e.getDomainId() ) ) {
2776                 return false;
2777             }
2778             if ( !all.contains( f.getDomainId() ) ) {
2779                 return false;
2780             }
2781             if ( !all.contains( g.getDomainId() ) ) {
2782                 return false;
2783             }
2784             if ( !all.contains( h.getDomainId() ) ) {
2785                 return false;
2786             }
2787             if ( !all.contains( i.getDomainId() ) ) {
2788                 return false;
2789             }
2790             if ( !all.contains( l.getDomainId() ) ) {
2791                 return false;
2792             }
2793             if ( !all.contains( j.getDomainId() ) ) {
2794                 return false;
2795             }
2796             if ( !all.contains( k.getDomainId() ) ) {
2797                 return false;
2798             }
2799             if ( !all.contains( m.getDomainId() ) ) {
2800                 return false;
2801             }
2802             if ( !all.contains( n.getDomainId() ) ) {
2803                 return false;
2804             }
2805             final Set<BinaryDomainCombination> s_0_ni = calc_ni.getBinaryDomainCombinationsSpecificToGenome0();
2806             final Set<BinaryDomainCombination> s_0_i = calc_i.getBinaryDomainCombinationsSpecificToGenome0();
2807             final Set<BinaryDomainCombination> s_1_ni = calc_ni.getBinaryDomainCombinationsSpecificToGenome1();
2808             final Set<BinaryDomainCombination> s_1_i = calc_i.getBinaryDomainCombinationsSpecificToGenome1();
2809             final Set<BinaryDomainCombination> a_ni = calc_ni.getAllBinaryDomainCombinations();
2810             final Set<BinaryDomainCombination> a_i = calc_i.getAllBinaryDomainCombinations();
2811             final Set<BinaryDomainCombination> shared_ni = calc_ni.getSharedBinaryDomainCombinations();
2812             final Set<BinaryDomainCombination> shared_i = calc_i.getSharedBinaryDomainCombinations();
2813             if ( a_ni.size() != 25 ) {
2814                 return false;
2815             }
2816             if ( a_i.size() != 22 ) {
2817                 return false;
2818             }
2819             if ( s_0_ni.size() != 10 ) {
2820                 return false;
2821             }
2822             if ( s_0_i.size() != 9 ) {
2823                 return false;
2824             }
2825             if ( s_1_ni.size() != 10 ) {
2826                 return false;
2827             }
2828             if ( s_1_i.size() != 10 ) {
2829                 return false;
2830             }
2831             if ( shared_ni.size() != 5 ) {
2832                 return false;
2833             }
2834             if ( shared_i.size() != 3 ) {
2835                 return false;
2836             }
2837             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "a" ) ) ) {
2838                 return false;
2839             }
2840             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "a" ) ) ) {
2841                 return false;
2842             }
2843             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "c" ) ) ) {
2844                 return false;
2845             }
2846             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "d" ) ) ) {
2847                 return false;
2848             }
2849             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "e" ) ) ) {
2850                 return false;
2851             }
2852             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "c" ) ) ) {
2853                 return false;
2854             }
2855             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "d" ) ) ) {
2856                 return false;
2857             }
2858             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "e" ) ) ) {
2859                 return false;
2860             }
2861             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "d" ) ) ) {
2862                 return false;
2863             }
2864             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "e" ) ) ) {
2865                 return false;
2866             }
2867             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "d", "e" ) ) ) {
2868                 return false;
2869             }
2870             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "e", "f" ) ) ) {
2871                 return false;
2872             }
2873             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "g", "h" ) ) ) {
2874                 return false;
2875             }
2876             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "f", "f" ) ) ) {
2877                 return false;
2878             }
2879             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "e", "e" ) ) ) {
2880                 return false;
2881             }
2882             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "i" ) ) ) {
2883                 return false;
2884             }
2885             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "l" ) ) ) {
2886                 return false;
2887             }
2888             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "i" ) ) ) {
2889                 return false;
2890             }
2891             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "l" ) ) ) {
2892                 return false;
2893             }
2894             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "i" ) ) ) {
2895                 return false;
2896             }
2897             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "l" ) ) ) {
2898                 return false;
2899             }
2900             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "i", "l" ) ) ) {
2901                 return false;
2902             }
2903             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "i", "f" ) ) ) {
2904                 return false;
2905             }
2906             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "m", "n" ) ) ) {
2907                 return false;
2908             }
2909             if ( !a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "j", "k" ) ) ) {
2910                 return false;
2911             }
2912             if ( a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "g" ) ) ) {
2913                 return false;
2914             }
2915             if ( a_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "m" ) ) ) {
2916                 return false;
2917             }
2918             if ( a_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "a" ) ) ) {
2919                 return false;
2920             }
2921             if ( a_i.contains( BasicBinaryDomainCombination.obtainInstance( "f", "f" ) ) ) {
2922                 return false;
2923             }
2924             if ( a_i.contains( BasicBinaryDomainCombination.obtainInstance( "e", "e" ) ) ) {
2925                 return false;
2926             }
2927             if ( !shared_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "a" ) ) ) {
2928                 return false;
2929             }
2930             if ( !shared_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "b" ) ) ) {
2931                 return false;
2932             }
2933             if ( !shared_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "c" ) ) ) {
2934                 return false;
2935             }
2936             if ( !shared_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "c" ) ) ) {
2937                 return false;
2938             }
2939             if ( !shared_ni.contains( BasicBinaryDomainCombination.obtainInstance( "f", "f" ) ) ) {
2940                 return false;
2941             }
2942             if ( shared_ni.contains( BasicBinaryDomainCombination.obtainInstance( "m", "n" ) ) ) {
2943                 return false;
2944             }
2945             if ( shared_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "a" ) ) ) {
2946                 return false;
2947             }
2948             if ( !shared_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "b" ) ) ) {
2949                 return false;
2950             }
2951             if ( !shared_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "c" ) ) ) {
2952                 return false;
2953             }
2954             if ( !shared_i.contains( BasicBinaryDomainCombination.obtainInstance( "b", "c" ) ) ) {
2955                 return false;
2956             }
2957             if ( shared_i.contains( BasicBinaryDomainCombination.obtainInstance( "f", "f" ) ) ) {
2958                 return false;
2959             }
2960             if ( shared_i.contains( BasicBinaryDomainCombination.obtainInstance( "m", "n" ) ) ) {
2961                 return false;
2962             }
2963             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "d" ) ) ) {
2964                 return false;
2965             }
2966             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "e" ) ) ) {
2967                 return false;
2968             }
2969             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "d" ) ) ) {
2970                 return false;
2971             }
2972             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "e" ) ) ) {
2973                 return false;
2974             }
2975             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "d" ) ) ) {
2976                 return false;
2977             }
2978             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "e" ) ) ) {
2979                 return false;
2980             }
2981             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "d", "e" ) ) ) {
2982                 return false;
2983             }
2984             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "e", "f" ) ) ) {
2985                 return false;
2986             }
2987             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "g", "h" ) ) ) {
2988                 return false;
2989             }
2990             if ( !s_0_ni.contains( BasicBinaryDomainCombination.obtainInstance( "e", "e" ) ) ) {
2991                 return false;
2992             }
2993             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "d" ) ) ) {
2994                 return false;
2995             }
2996             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "e" ) ) ) {
2997                 return false;
2998             }
2999             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "b", "d" ) ) ) {
3000                 return false;
3001             }
3002             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "b", "e" ) ) ) {
3003                 return false;
3004             }
3005             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "c", "d" ) ) ) {
3006                 return false;
3007             }
3008             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "c", "e" ) ) ) {
3009                 return false;
3010             }
3011             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "d", "e" ) ) ) {
3012                 return false;
3013             }
3014             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "e", "f" ) ) ) {
3015                 return false;
3016             }
3017             if ( !s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "g", "h" ) ) ) {
3018                 return false;
3019             }
3020             if ( s_0_i.contains( BasicBinaryDomainCombination.obtainInstance( "e", "e" ) ) ) {
3021                 return false;
3022             }
3023             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "i" ) ) ) {
3024                 return false;
3025             }
3026             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "l" ) ) ) {
3027                 return false;
3028             }
3029             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "i" ) ) ) {
3030                 return false;
3031             }
3032             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "b", "l" ) ) ) {
3033                 return false;
3034             }
3035             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "i" ) ) ) {
3036                 return false;
3037             }
3038             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "c", "l" ) ) ) {
3039                 return false;
3040             }
3041             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "l", "i" ) ) ) {
3042                 return false;
3043             }
3044             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "i", "f" ) ) ) {
3045                 return false;
3046             }
3047             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "m", "n" ) ) ) {
3048                 return false;
3049             }
3050             if ( !s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "j", "k" ) ) ) {
3051                 return false;
3052             }
3053             if ( s_1_ni.contains( BasicBinaryDomainCombination.obtainInstance( "a", "b" ) ) ) {
3054                 return false;
3055             }
3056             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "i" ) ) ) {
3057                 return false;
3058             }
3059             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "l" ) ) ) {
3060                 return false;
3061             }
3062             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "b", "i" ) ) ) {
3063                 return false;
3064             }
3065             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "b", "l" ) ) ) {
3066                 return false;
3067             }
3068             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "c", "i" ) ) ) {
3069                 return false;
3070             }
3071             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "c", "l" ) ) ) {
3072                 return false;
3073             }
3074             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "l", "i" ) ) ) {
3075                 return false;
3076             }
3077             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "i", "f" ) ) ) {
3078                 return false;
3079             }
3080             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "m", "n" ) ) ) {
3081                 return false;
3082             }
3083             if ( !s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "j", "k" ) ) ) {
3084                 return false;
3085             }
3086             if ( s_1_i.contains( BasicBinaryDomainCombination.obtainInstance( "a", "b" ) ) ) {
3087                 return false;
3088             }
3089             if ( !isEqual( calc_ni.calculateSharedBinaryDomainCombinationBasedGenomeSimilarityScore(),
3090                            1.0 - ( ( 25.0 - 5.0 ) / 25.0 ) ) ) {
3091                 return false;
3092             }
3093             if ( !isEqual( calc_i.calculateSharedBinaryDomainCombinationBasedGenomeSimilarityScore(),
3094                            1.0 - ( ( 22.0 - 3.0 ) / 22.0 ) ) ) {
3095                 return false;
3096             }
3097             if ( !isEqual( calc_ni.calculateSharedDomainsBasedGenomeSimilarityScore(), 1.0 - ( ( 14.0 - 4.0 ) / 14.0 ) ) ) {
3098                 return false;
3099             }
3100             if ( !isEqual( calc_i.calculateSharedDomainsBasedGenomeSimilarityScore(), 1.0 - ( ( 14.0 - 4.0 ) / 14.0 ) ) ) {
3101                 return false;
3102             }
3103             final Domain u = new BasicDomain( "u", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
3104             final Domain v = new BasicDomain( "v", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
3105             final Domain w = new BasicDomain( "w", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
3106             final Domain x = new BasicDomain( "x", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
3107             final Domain y = new BasicDomain( "y", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
3108             final Domain z = new BasicDomain( "z", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
3109             final Protein a_0 = new BasicProtein( "0", "a", 0 );
3110             final Protein a_1 = new BasicProtein( "1", "a", 0 );
3111             final Protein a_2 = new BasicProtein( "2", "a", 0 );
3112             final Protein b_0 = new BasicProtein( "0", "b", 0 );
3113             final Protein b_1 = new BasicProtein( "1", "b", 0 );
3114             a_0.addProteinDomain( u );
3115             a_0.addProteinDomain( v );
3116             a_0.addProteinDomain( w );
3117             a_1.addProteinDomain( w );
3118             a_1.addProteinDomain( x );
3119             a_2.addProteinDomain( y );
3120             a_2.addProteinDomain( z );
3121             b_0.addProteinDomain( u );
3122             b_0.addProteinDomain( w );
3123             b_1.addProteinDomain( y );
3124             b_1.addProteinDomain( z );
3125             final List<Protein> protein_list_a = new ArrayList<Protein>();
3126             protein_list_a.add( a_0 );
3127             protein_list_a.add( a_1 );
3128             protein_list_a.add( a_2 );
3129             final List<Protein> protein_list_b = new ArrayList<Protein>();
3130             protein_list_b.add( b_0 );
3131             protein_list_b.add( b_1 );
3132             final GenomeWideCombinableDomains ca = BasicGenomeWideCombinableDomains
3133                     .createInstance( protein_list_a, false, new BasicSpecies( "a" ) );
3134             final GenomeWideCombinableDomains cb = BasicGenomeWideCombinableDomains
3135                     .createInstance( protein_list_b, true, new BasicSpecies( "b" ) );
3136             final DomainArchitectureBasedGenomeSimilarityCalculator calc_u = new DomainArchitectureBasedGenomeSimilarityCalculator( ca,
3137                                                                                                                                     cb );
3138             calc_u.setAllowDomainsToBeIgnored( true );
3139             if ( calc_u.getAllDomains().size() != 6 ) {
3140                 return false;
3141             }
3142             if ( calc_u.getDomainsSpecificToGenome0().size() != 2 ) {
3143                 return false;
3144             }
3145             if ( calc_u.getDomainsSpecificToGenome1().size() != 0 ) {
3146                 return false;
3147             }
3148             if ( !calc_u.getDomainsSpecificToGenome0().contains( v.getDomainId() ) ) {
3149                 return false;
3150             }
3151             if ( !calc_u.getDomainsSpecificToGenome0().contains( x.getDomainId() ) ) {
3152                 return false;
3153             }
3154             if ( calc_u.getSharedDomains().size() != 4 ) {
3155                 return false;
3156             }
3157             if ( !calc_u.getSharedDomains().contains( u.getDomainId() ) ) {
3158                 return false;
3159             }
3160             if ( !calc_u.getSharedDomains().contains( w.getDomainId() ) ) {
3161                 return false;
3162             }
3163             if ( !calc_u.getSharedDomains().contains( y.getDomainId() ) ) {
3164                 return false;
3165             }
3166             if ( !calc_u.getSharedDomains().contains( z.getDomainId() ) ) {
3167                 return false;
3168             }
3169             if ( calc_u.getAllDomains().size() != 6 ) {
3170                 return false;
3171             }
3172             if ( !calc_u.getAllDomains().contains( u.getDomainId() ) ) {
3173                 return false;
3174             }
3175             if ( !calc_u.getAllDomains().contains( w.getDomainId() ) ) {
3176                 return false;
3177             }
3178             if ( !calc_u.getAllDomains().contains( y.getDomainId() ) ) {
3179                 return false;
3180             }
3181             if ( !calc_u.getAllDomains().contains( z.getDomainId() ) ) {
3182                 return false;
3183             }
3184             if ( !calc_u.getAllDomains().contains( v.getDomainId() ) ) {
3185                 return false;
3186             }
3187             if ( !calc_u.getAllDomains().contains( x.getDomainId() ) ) {
3188                 return false;
3189             }
3190             if ( calc_u.getBinaryDomainCombinationsSpecificToGenome0().size() != 3 ) {
3191                 return false;
3192             }
3193             if ( calc_u.getBinaryDomainCombinationsSpecificToGenome1().size() != 0 ) {
3194                 return false;
3195             }
3196             if ( calc_u.getSharedBinaryDomainCombinations().size() != 2 ) {
3197                 return false;
3198             }
3199             if ( calc_u.getAllBinaryDomainCombinations().size() != 5 ) {
3200                 return false;
3201             }
3202             if ( !calc_u.getBinaryDomainCombinationsSpecificToGenome0()
3203                     .contains( BasicBinaryDomainCombination.obtainInstance( "v", "u" ) ) ) {
3204                 return false;
3205             }
3206             if ( !calc_u.getBinaryDomainCombinationsSpecificToGenome0()
3207                     .contains( BasicBinaryDomainCombination.obtainInstance( "w", "v" ) ) ) {
3208                 return false;
3209             }
3210             if ( !calc_u.getBinaryDomainCombinationsSpecificToGenome0()
3211                     .contains( BasicBinaryDomainCombination.obtainInstance( "w", "x" ) ) ) {
3212                 return false;
3213             }
3214             if ( !calc_u.getSharedBinaryDomainCombinations()
3215                     .contains( BasicBinaryDomainCombination.obtainInstance( "w", "u" ) ) ) {
3216                 return false;
3217             }
3218             if ( !calc_u.getSharedBinaryDomainCombinations()
3219                     .contains( BasicBinaryDomainCombination.obtainInstance( "z", "y" ) ) ) {
3220                 return false;
3221             }
3222             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "v",
3223                     "u" ) ) ) {
3224                 return false;
3225             }
3226             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "w",
3227                     "v" ) ) ) {
3228                 return false;
3229             }
3230             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "w",
3231                     "x" ) ) ) {
3232                 return false;
3233             }
3234             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "w",
3235                     "u" ) ) ) {
3236                 return false;
3237             }
3238             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "z",
3239                     "y" ) ) ) {
3240                 return false;
3241             }
3242             calc_u.setAllowDomainsToBeIgnored( true );
3243             calc_u.addDomainIdToIgnore( u.getDomainId() );
3244             calc_u.addDomainIdToIgnore( "other" );
3245             calc_u.addDomainIdToIgnore( "other_too" );
3246             if ( calc_u.getAllDomains().size() != 5 ) {
3247                 return false;
3248             }
3249             if ( calc_u.getDomainsSpecificToGenome0().size() != 2 ) {
3250                 return false;
3251             }
3252             if ( calc_u.getDomainsSpecificToGenome1().size() != 0 ) {
3253                 return false;
3254             }
3255             if ( !calc_u.getDomainsSpecificToGenome0().contains( v.getDomainId() ) ) {
3256                 return false;
3257             }
3258             if ( !calc_u.getDomainsSpecificToGenome0().contains( x.getDomainId() ) ) {
3259                 return false;
3260             }
3261             if ( calc_u.getSharedDomains().size() != 3 ) {
3262                 return false;
3263             }
3264             if ( calc_u.getSharedDomains().contains( u.getDomainId() ) ) {
3265                 return false;
3266             }
3267             if ( !calc_u.getSharedDomains().contains( w.getDomainId() ) ) {
3268                 return false;
3269             }
3270             if ( !calc_u.getSharedDomains().contains( y.getDomainId() ) ) {
3271                 return false;
3272             }
3273             if ( !calc_u.getSharedDomains().contains( z.getDomainId() ) ) {
3274                 return false;
3275             }
3276             if ( calc_u.getAllDomains().size() != 5 ) {
3277                 return false;
3278             }
3279             if ( calc_u.getAllDomains().contains( u.getDomainId() ) ) {
3280                 return false;
3281             }
3282             if ( !calc_u.getAllDomains().contains( w.getDomainId() ) ) {
3283                 return false;
3284             }
3285             if ( !calc_u.getAllDomains().contains( y.getDomainId() ) ) {
3286                 return false;
3287             }
3288             if ( !calc_u.getAllDomains().contains( z.getDomainId() ) ) {
3289                 return false;
3290             }
3291             if ( !calc_u.getAllDomains().contains( v.getDomainId() ) ) {
3292                 return false;
3293             }
3294             if ( !calc_u.getAllDomains().contains( x.getDomainId() ) ) {
3295                 return false;
3296             }
3297             if ( calc_u.getBinaryDomainCombinationsSpecificToGenome0().size() != 2 ) {
3298                 return false;
3299             }
3300             if ( calc_u.getBinaryDomainCombinationsSpecificToGenome1().size() != 0 ) {
3301                 return false;
3302             }
3303             if ( calc_u.getSharedBinaryDomainCombinations().size() != 1 ) {
3304                 return false;
3305             }
3306             if ( calc_u.getAllBinaryDomainCombinations().size() != 3 ) {
3307                 return false;
3308             }
3309             if ( calc_u.getBinaryDomainCombinationsSpecificToGenome0()
3310                     .contains( BasicBinaryDomainCombination.obtainInstance( "v", "u" ) ) ) {
3311                 return false;
3312             }
3313             if ( !calc_u.getBinaryDomainCombinationsSpecificToGenome0()
3314                     .contains( BasicBinaryDomainCombination.obtainInstance( "w", "v" ) ) ) {
3315                 return false;
3316             }
3317             if ( !calc_u.getBinaryDomainCombinationsSpecificToGenome0()
3318                     .contains( BasicBinaryDomainCombination.obtainInstance( "w", "x" ) ) ) {
3319                 return false;
3320             }
3321             if ( calc_u.getSharedBinaryDomainCombinations()
3322                     .contains( BasicBinaryDomainCombination.obtainInstance( "w", "u" ) ) ) {
3323                 return false;
3324             }
3325             if ( !calc_u.getSharedBinaryDomainCombinations()
3326                     .contains( BasicBinaryDomainCombination.obtainInstance( "z", "y" ) ) ) {
3327                 return false;
3328             }
3329             if ( calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "v",
3330                     "u" ) ) ) {
3331                 return false;
3332             }
3333             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "w",
3334                     "v" ) ) ) {
3335                 return false;
3336             }
3337             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "w",
3338                     "x" ) ) ) {
3339                 return false;
3340             }
3341             if ( calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "w",
3342                     "u" ) ) ) {
3343                 return false;
3344             }
3345             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "z",
3346                     "y" ) ) ) {
3347                 return false;
3348             }
3349             calc_u.setAllowDomainsToBeIgnored( false );
3350             if ( calc_u.getAllDomains().size() != 6 ) {
3351                 return false;
3352             }
3353             //------------
3354             calc_u.setAllowDomainsToBeIgnored( true );
3355             calc_u.deleteAllDomainIdsToIgnore();
3356             calc_u.addDomainIdToIgnore( "v" );
3357             calc_u.addDomainIdToIgnore( "w" );
3358             calc_u.addDomainIdToIgnore( "other" );
3359             calc_u.addDomainIdToIgnore( "other_too" );
3360             if ( calc_u.getAllDomains().size() != 4 ) {
3361                 return false;
3362             }
3363             if ( calc_u.getDomainsSpecificToGenome0().size() != 1 ) {
3364                 return false;
3365             }
3366             if ( calc_u.getDomainsSpecificToGenome1().size() != 0 ) {
3367                 return false;
3368             }
3369             if ( calc_u.getDomainsSpecificToGenome0().contains( v.getDomainId() ) ) {
3370                 return false;
3371             }
3372             if ( !calc_u.getDomainsSpecificToGenome0().contains( x.getDomainId() ) ) {
3373                 return false;
3374             }
3375             if ( calc_u.getSharedDomains().size() != 3 ) {
3376                 return false;
3377             }
3378             if ( !calc_u.getSharedDomains().contains( u.getDomainId() ) ) {
3379                 return false;
3380             }
3381             if ( calc_u.getSharedDomains().contains( w.getDomainId() ) ) {
3382                 return false;
3383             }
3384             if ( !calc_u.getSharedDomains().contains( y.getDomainId() ) ) {
3385                 return false;
3386             }
3387             if ( !calc_u.getSharedDomains().contains( z.getDomainId() ) ) {
3388                 return false;
3389             }
3390             if ( calc_u.getAllDomains().size() != 4 ) {
3391                 return false;
3392             }
3393             if ( !calc_u.getAllDomains().contains( u.getDomainId() ) ) {
3394                 return false;
3395             }
3396             if ( calc_u.getAllDomains().contains( w.getDomainId() ) ) {
3397                 return false;
3398             }
3399             if ( !calc_u.getAllDomains().contains( y.getDomainId() ) ) {
3400                 return false;
3401             }
3402             if ( !calc_u.getAllDomains().contains( z.getDomainId() ) ) {
3403                 return false;
3404             }
3405             if ( calc_u.getAllDomains().contains( v.getDomainId() ) ) {
3406                 return false;
3407             }
3408             if ( !calc_u.getAllDomains().contains( x.getDomainId() ) ) {
3409                 return false;
3410             }
3411             if ( calc_u.getBinaryDomainCombinationsSpecificToGenome0().size() != 0 ) {
3412                 return false;
3413             }
3414             if ( calc_u.getBinaryDomainCombinationsSpecificToGenome1().size() != 0 ) {
3415                 return false;
3416             }
3417             if ( calc_u.getSharedBinaryDomainCombinations().size() != 1 ) {
3418                 return false;
3419             }
3420             if ( calc_u.getAllBinaryDomainCombinations().size() != 1 ) {
3421                 return false;
3422             }
3423             if ( !calc_u.getSharedBinaryDomainCombinations()
3424                     .contains( BasicBinaryDomainCombination.obtainInstance( "y", "z" ) ) ) {
3425                 return false;
3426             }
3427             if ( !calc_u.getAllBinaryDomainCombinations().contains( BasicBinaryDomainCombination.obtainInstance( "z",
3428                     "y" ) ) ) {
3429                 return false;
3430             }
3431             if ( !isEqual( calc_u.calculateSharedBinaryDomainCombinationBasedGenomeSimilarityScore(),
3432                            1.0 - ( ( 1.0 - 1.0 ) / 1.0 ) ) ) {
3433                 return false;
3434             }
3435             if ( !isEqual( calc_u.calculateSharedDomainsBasedGenomeSimilarityScore(), 1.0 - ( ( 4.0 - 3.0 ) / 4.0 ) ) ) {
3436                 return false;
3437             }
3438             calc_u.setAllowDomainsToBeIgnored( false );
3439             if ( !isEqual( calc_u.calculateSharedBinaryDomainCombinationBasedGenomeSimilarityScore(),
3440                            1.0 - ( ( 5.0 - 2.0 ) / 5.0 ) ) ) {
3441                 return false;
3442             }
3443             if ( !isEqual( calc_u.calculateSharedDomainsBasedGenomeSimilarityScore(), 1.0 - ( ( 6.0 - 4.0 ) / 6.0 ) ) ) {
3444                 return false;
3445             }
3446             calc_u.setAllowDomainsToBeIgnored( true );
3447             if ( !isEqual( calc_u.calculateSharedBinaryDomainCombinationBasedGenomeSimilarityScore(),
3448                            1.0 - ( ( 1.0 - 1.0 ) / 1.0 ) ) ) {
3449                 return false;
3450             }
3451             if ( !isEqual( calc_u.calculateSharedDomainsBasedGenomeSimilarityScore(), 1.0 - ( ( 4.0 - 3.0 ) / 4.0 ) ) ) {
3452                 return false;
3453             }
3454             calc_u.deleteAllDomainIdsToIgnore();
3455             if ( !isEqual( calc_u.calculateSharedBinaryDomainCombinationBasedGenomeSimilarityScore(),
3456                            1.0 - ( ( 5.0 - 2.0 ) / 5.0 ) ) ) {
3457                 return false;
3458             }
3459             if ( !isEqual( calc_u.calculateSharedDomainsBasedGenomeSimilarityScore(), 1.0 - ( ( 6.0 - 4.0 ) / 6.0 ) ) ) {
3460                 return false;
3461             }
3462         }
3463         catch ( final Exception e ) {
3464             e.printStackTrace( System.out );
3465             return false;
3466         }
3467         return true;
3468     }
3469
3470     private static boolean testDomainCombinationCounting( final File test_dir ) {
3471         try {
3472             final HmmPfamOutputParser parser = new HmmPfamOutputParser( new File( test_dir
3473                                                                                   + ForesterUtil.getFileSeparator() + "hmmpfam_output2" ), "human", "ls" );
3474             parser.setEValueMaximum( 0.2 );
3475             parser.setIgnoreDufs( true );
3476             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
3477             final List<Protein> domain_collections = parser.parse();
3478             final BasicGenomeWideCombinableDomains cdcc = BasicGenomeWideCombinableDomains
3479                     .createInstance( domain_collections, false, new BasicSpecies( "human" ) );
3480             CombinableDomains cd = cdcc.get( "A" );
3481             if ( cd.getKeyDomainCount() != 9 ) {
3482                 return false;
3483             }
3484             if ( cd.getKeyDomainProteinsCount() != 7 ) {
3485                 return false;
3486             }
3487             if ( cd.getNumberOfCombinableDomains() != 11 ) {
3488                 return false;
3489             }
3490             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "A" ).getDomainId() ) != 2 ) {
3491                 return false;
3492             }
3493             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "B" ).getDomainId() ) != 6 ) {
3494                 return false;
3495             }
3496             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "C" ).getDomainId() ) != 4 ) {
3497                 return false;
3498             }
3499             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "D" ).getDomainId() ) != 3 ) {
3500                 return false;
3501             }
3502             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "E" ).getDomainId() ) != 1 ) {
3503                 return false;
3504             }
3505             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "U" ).getDomainId() ) != 1 ) {
3506                 return false;
3507             }
3508             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "V" ).getDomainId() ) != 1 ) {
3509                 return false;
3510             }
3511             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "W" ).getDomainId() ) != 1 ) {
3512                 return false;
3513             }
3514             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "X" ).getDomainId() ) != 1 ) {
3515                 return false;
3516             }
3517             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "Y" ).getDomainId() ) != 1 ) {
3518                 return false;
3519             }
3520             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "Z" ).getDomainId() ) != 1 ) {
3521                 return false;
3522             }
3523             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "NN" ).getDomainId() ) != 0 ) {
3524                 return false;
3525             }
3526             if ( cd.getKeyDomainCount() != 9 ) {
3527                 return false;
3528             }
3529             cd = cdcc.get( "B" );
3530             if ( cd.getKeyDomainCount() != 12 ) {
3531                 return false;
3532             }
3533             if ( cd.getKeyDomainProteinsCount() != 7 ) {
3534                 return false;
3535             }
3536             if ( cd.getNumberOfCombinableDomains() != 11 ) {
3537                 return false;
3538             }
3539             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "A" ).getDomainId() ) != 6 ) {
3540                 return false;
3541             }
3542             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "B" ).getDomainId() ) != 4 ) {
3543                 return false;
3544             }
3545             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "C" ).getDomainId() ) != 4 ) {
3546                 return false;
3547             }
3548             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "D" ).getDomainId() ) != 3 ) {
3549                 return false;
3550             }
3551             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "E" ).getDomainId() ) != 1 ) {
3552                 return false;
3553             }
3554             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "U" ).getDomainId() ) != 1 ) {
3555                 return false;
3556             }
3557             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "V" ).getDomainId() ) != 1 ) {
3558                 return false;
3559             }
3560             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "W" ).getDomainId() ) != 1 ) {
3561                 return false;
3562             }
3563             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "X" ).getDomainId() ) != 1 ) {
3564                 return false;
3565             }
3566             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "Y" ).getDomainId() ) != 1 ) {
3567                 return false;
3568             }
3569             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "Z" ).getDomainId() ) != 1 ) {
3570                 return false;
3571             }
3572             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "NN" ).getDomainId() ) != 0 ) {
3573                 return false;
3574             }
3575             if ( cd.getKeyDomainCount() != 12 ) {
3576                 return false;
3577             }
3578             cd = cdcc.get( "C" );
3579             if ( cd.getKeyDomainCount() != 10 ) {
3580                 return false;
3581             }
3582             if ( cd.getKeyDomainProteinsCount() != 7 ) {
3583                 return false;
3584             }
3585             if ( cd.getNumberOfCombinableDomains() != 11 ) {
3586                 return false;
3587             }
3588             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "A" ).getDomainId() ) != 4 ) {
3589                 return false;
3590             }
3591             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "B" ).getDomainId() ) != 4 ) {
3592                 return false;
3593             }
3594             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "C" ).getDomainId() ) != 2 ) {
3595                 return false;
3596             }
3597             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "D" ).getDomainId() ) != 3 ) {
3598                 return false;
3599             }
3600             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "E" ).getDomainId() ) != 1 ) {
3601                 return false;
3602             }
3603             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "U" ).getDomainId() ) != 1 ) {
3604                 return false;
3605             }
3606             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "V" ).getDomainId() ) != 1 ) {
3607                 return false;
3608             }
3609             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "W" ).getDomainId() ) != 1 ) {
3610                 return false;
3611             }
3612             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "X" ).getDomainId() ) != 2 ) {
3613                 return false;
3614             }
3615             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "Y" ).getDomainId() ) != 2 ) {
3616                 return false;
3617             }
3618             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "Z" ).getDomainId() ) != 2 ) {
3619                 return false;
3620             }
3621             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "NN" ).getDomainId() ) != 0 ) {
3622                 return false;
3623             }
3624             cd = cdcc.get( "D" );
3625             if ( cd.getKeyDomainCount() != 15 ) {
3626                 return false;
3627             }
3628             if ( cd.getKeyDomainProteinsCount() != 6 ) {
3629                 return false;
3630             }
3631             if ( cd.getNumberOfCombinableDomains() != 11 ) {
3632                 return false;
3633             }
3634             cd = cdcc.get( "E" );
3635             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3636                 return false;
3637             }
3638             if ( cd.getKeyDomainCount() != 1 ) {
3639                 return false;
3640             }
3641             if ( cd.getKeyDomainProteinsCount() != 1 ) {
3642                 return false;
3643             }
3644             cd = cdcc.get( "U" );
3645             if ( cd.getNumberOfCombinableDomains() != 11 ) {
3646                 return false;
3647             }
3648             if ( cd.getKeyDomainCount() != 6 ) {
3649                 return false;
3650             }
3651             if ( cd.getKeyDomainProteinsCount() != 3 ) {
3652                 return false;
3653             }
3654             cd = cdcc.get( "V" );
3655             if ( cd.getNumberOfCombinableDomains() != 11 ) {
3656                 return false;
3657             }
3658             if ( cd.getKeyDomainCount() != 3 ) {
3659                 return false;
3660             }
3661             if ( cd.getKeyDomainProteinsCount() != 2 ) {
3662                 return false;
3663             }
3664             cd = cdcc.get( "W" );
3665             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3666                 return false;
3667             }
3668             if ( cd.getKeyDomainCount() != 2 ) {
3669                 return false;
3670             }
3671             if ( cd.getKeyDomainProteinsCount() != 2 ) {
3672                 return false;
3673             }
3674             cd = cdcc.get( "X" );
3675             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3676                 return false;
3677             }
3678             if ( cd.getKeyDomainCount() != 2 ) {
3679                 return false;
3680             }
3681             cd = cdcc.get( "Y" );
3682             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3683                 return false;
3684             }
3685             cd = cdcc.get( "Z" );
3686             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3687                 return false;
3688             }
3689             cd = cdcc.get( "NN" );
3690             if ( cd.getKeyDomainCount() != 1 ) {
3691                 return false;
3692             }
3693             if ( cd.getKeyDomainProteinsCount() != 1 ) {
3694                 return false;
3695             }
3696             if ( cd.getNumberOfCombinableDomains() != 0 ) {
3697                 return false;
3698             }
3699             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "NN" ).getDomainId() ) != 0 ) {
3700                 return false;
3701             }
3702             cd = cdcc.get( "MM" );
3703             if ( cd.getNumberOfCombinableDomains() != 1 ) {
3704                 return false;
3705             }
3706             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "MM" ).getDomainId() ) != 0 ) {
3707                 return false;
3708             }
3709             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "OO" ).getDomainId() ) != 1 ) {
3710                 return false;
3711             }
3712             cd = cdcc.get( "OO" );
3713             if ( cd.getNumberOfCombinableDomains() != 2 ) {
3714                 return false;
3715             }
3716             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "OO" ).getDomainId() ) != 1 ) {
3717                 return false;
3718             }
3719             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "MM" ).getDomainId() ) != 1 ) {
3720                 return false;
3721             }
3722             cd = cdcc.get( "QQ" );
3723             if ( cd.getNumberOfCombinableDomains() != 1 ) {
3724                 return false;
3725             }
3726             if ( cd.getKeyDomainCount() != 17 ) {
3727                 return false;
3728             }
3729             if ( cd.getKeyDomainProteinsCount() != 4 ) {
3730                 return false;
3731             }
3732             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "QQ" ).getDomainId() ) != 3 ) {
3733                 return false;
3734             }
3735             cd = cdcc.get( "PP" );
3736             if ( cd.getNumberOfCombinableDomains() != 0 ) {
3737                 return false;
3738             }
3739             if ( cd.getKeyDomainCount() != 2 ) {
3740                 return false;
3741             }
3742             if ( cd.getKeyDomainProteinsCount() != 2 ) {
3743                 return false;
3744             }
3745             cd = cdcc.get( "singlet" );
3746             if ( cd.getKeyDomainCount() != 1 ) {
3747                 return false;
3748             }
3749             if ( cd.getKeyDomainProteinsCount() != 1 ) {
3750                 return false;
3751             }
3752             if ( cd.getNumberOfCombinableDomains() != 0 ) {
3753                 return false;
3754             }
3755             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "singlet" ).getDomainId() ) != 0 ) {
3756                 return false;
3757             }
3758             cd = cdcc.get( "three" );
3759             if ( cd.getKeyDomainCount() != 3 ) {
3760                 return false;
3761             }
3762             if ( cd.getKeyDomainProteinsCount() != 1 ) {
3763                 return false;
3764             }
3765             if ( cd.getNumberOfCombinableDomains() != 1 ) {
3766                 return false;
3767             }
3768             if ( cd.getNumberOfProteinsExhibitingCombination( "three" ) != 1 ) {
3769                 return false;
3770             }
3771             if ( cd.getNumberOfProteinsExhibitingCombination( "so_far_so_bad" ) != 0 ) {
3772                 return false;
3773             }
3774             // Ignore combinations with same:
3775             final BasicGenomeWideCombinableDomains cdcc2 = BasicGenomeWideCombinableDomains
3776                     .createInstance( domain_collections,
3777                                      true,
3778                                      new BasicSpecies( "human" ),
3779                                      null,
3780                                      DomainCombinationType.BASIC,
3781                                      null,
3782                                      null );
3783             cd = cdcc2.get( "A" );
3784             if ( cd.getKeyDomainCount() != 9 ) {
3785                 return false;
3786             }
3787             if ( cd.getKeyDomainProteinsCount() != 7 ) {
3788                 return false;
3789             }
3790             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3791                 return false;
3792             }
3793             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "A" ).getDomainId() ) != 0 ) {
3794                 return false;
3795             }
3796             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "B" ).getDomainId() ) != 6 ) {
3797                 return false;
3798             }
3799             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "C" ).getDomainId() ) != 4 ) {
3800                 return false;
3801             }
3802             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "D" ).getDomainId() ) != 3 ) {
3803                 return false;
3804             }
3805             if ( cd.getNumberOfProteinsExhibitingCombination( new SimpleDomain( "E" ).getDomainId() ) != 1 ) {
3806                 return false;
3807             }
3808             if ( cd.getNumberOfProteinsExhibitingCombination( "U" ) != 1 ) {
3809                 return false;
3810             }
3811             if ( cd.getNumberOfProteinsExhibitingCombination( "V" ) != 1 ) {
3812                 return false;
3813             }
3814             if ( cd.getNumberOfProteinsExhibitingCombination( "W" ) != 1 ) {
3815                 return false;
3816             }
3817             if ( cd.getNumberOfProteinsExhibitingCombination( "X" ) != 1 ) {
3818                 return false;
3819             }
3820             if ( cd.getNumberOfProteinsExhibitingCombination( "Y" ) != 1 ) {
3821                 return false;
3822             }
3823             if ( cd.getNumberOfProteinsExhibitingCombination( "Z" ) != 1 ) {
3824                 return false;
3825             }
3826             if ( cd.getNumberOfProteinsExhibitingCombination( "NN" ) != 0 ) {
3827                 return false;
3828             }
3829             cd = cdcc2.get( "B" );
3830             if ( cd.getKeyDomainCount() != 12 ) {
3831                 return false;
3832             }
3833             if ( cd.getKeyDomainProteinsCount() != 7 ) {
3834                 return false;
3835             }
3836             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3837                 return false;
3838             }
3839             if ( cd.getNumberOfProteinsExhibitingCombination( "A" ) != 6 ) {
3840                 return false;
3841             }
3842             if ( cd.getNumberOfProteinsExhibitingCombination( "B" ) != 0 ) {
3843                 return false;
3844             }
3845             if ( cd.getNumberOfProteinsExhibitingCombination( "C" ) != 4 ) {
3846                 return false;
3847             }
3848             if ( cd.getNumberOfProteinsExhibitingCombination( "D" ) != 3 ) {
3849                 return false;
3850             }
3851             if ( cd.getNumberOfProteinsExhibitingCombination( "E" ) != 1 ) {
3852                 return false;
3853             }
3854             if ( cd.getNumberOfProteinsExhibitingCombination( "U" ) != 1 ) {
3855                 return false;
3856             }
3857             if ( cd.getNumberOfProteinsExhibitingCombination( "V" ) != 1 ) {
3858                 return false;
3859             }
3860             if ( cd.getNumberOfProteinsExhibitingCombination( "W" ) != 1 ) {
3861                 return false;
3862             }
3863             if ( cd.getNumberOfProteinsExhibitingCombination( "X" ) != 1 ) {
3864                 return false;
3865             }
3866             if ( cd.getNumberOfProteinsExhibitingCombination( "Y" ) != 1 ) {
3867                 return false;
3868             }
3869             if ( cd.getNumberOfProteinsExhibitingCombination( "Z" ) != 1 ) {
3870                 return false;
3871             }
3872             if ( cd.getNumberOfProteinsExhibitingCombination( "NN" ) != 0 ) {
3873                 return false;
3874             }
3875             cd = cdcc2.get( "C" );
3876             if ( cd.getKeyDomainCount() != 10 ) {
3877                 return false;
3878             }
3879             if ( cd.getKeyDomainProteinsCount() != 7 ) {
3880                 return false;
3881             }
3882             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3883                 return false;
3884             }
3885             if ( cd.getNumberOfProteinsExhibitingCombination( "A" ) != 4 ) {
3886                 return false;
3887             }
3888             if ( cd.getNumberOfProteinsExhibitingCombination( "B" ) != 4 ) {
3889                 return false;
3890             }
3891             if ( cd.getNumberOfProteinsExhibitingCombination( "C" ) != 0 ) {
3892                 return false;
3893             }
3894             if ( cd.getNumberOfProteinsExhibitingCombination( "D" ) != 3 ) {
3895                 return false;
3896             }
3897             if ( cd.getNumberOfProteinsExhibitingCombination( "E" ) != 1 ) {
3898                 return false;
3899             }
3900             if ( cd.getNumberOfProteinsExhibitingCombination( "U" ) != 1 ) {
3901                 return false;
3902             }
3903             if ( cd.getNumberOfProteinsExhibitingCombination( "V" ) != 1 ) {
3904                 return false;
3905             }
3906             if ( cd.getNumberOfProteinsExhibitingCombination( "W" ) != 1 ) {
3907                 return false;
3908             }
3909             if ( cd.getNumberOfProteinsExhibitingCombination( "X" ) != 2 ) {
3910                 return false;
3911             }
3912             if ( cd.getNumberOfProteinsExhibitingCombination( "Y" ) != 2 ) {
3913                 return false;
3914             }
3915             if ( cd.getNumberOfProteinsExhibitingCombination( "Z" ) != 2 ) {
3916                 return false;
3917             }
3918             if ( cd.getNumberOfProteinsExhibitingCombination( "NN" ) != 0 ) {
3919                 return false;
3920             }
3921             cd = cdcc2.get( "D" );
3922             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3923                 return false;
3924             }
3925             cd = cdcc2.get( "E" );
3926             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3927                 return false;
3928             }
3929             if ( cd.getKeyDomainCount() != 1 ) {
3930                 return false;
3931             }
3932             cd = cdcc2.get( "U" );
3933             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3934                 return false;
3935             }
3936             cd = cdcc2.get( "V" );
3937             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3938                 return false;
3939             }
3940             cd = cdcc2.get( "W" );
3941             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3942                 return false;
3943             }
3944             cd = cdcc2.get( "X" );
3945             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3946                 return false;
3947             }
3948             cd = cdcc2.get( "Y" );
3949             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3950                 return false;
3951             }
3952             cd = cdcc2.get( "Z" );
3953             if ( cd.getNumberOfCombinableDomains() != 10 ) {
3954                 return false;
3955             }
3956             cd = cdcc2.get( "NN" );
3957             if ( cd.getNumberOfCombinableDomains() != 0 ) {
3958                 return false;
3959             }
3960             if ( cd.getNumberOfProteinsExhibitingCombination( "NN" ) != 0 ) {
3961                 return false;
3962             }
3963             cd = cdcc2.get( "MM" );
3964             if ( cd.getNumberOfCombinableDomains() != 1 ) {
3965                 return false;
3966             }
3967             if ( cd.getNumberOfProteinsExhibitingCombination( "MM" ) != 0 ) {
3968                 return false;
3969             }
3970             if ( cd.getNumberOfProteinsExhibitingCombination( "OO" ) != 1 ) {
3971                 return false;
3972             }
3973             cd = cdcc2.get( "OO" );
3974             if ( cd.getNumberOfCombinableDomains() != 1 ) {
3975                 return false;
3976             }
3977             if ( cd.getNumberOfProteinsExhibitingCombination( "OO" ) != 0 ) {
3978                 return false;
3979             }
3980             if ( cd.getNumberOfProteinsExhibitingCombination( "MM" ) != 1 ) {
3981                 return false;
3982             }
3983             cd = cdcc2.get( "QQ" );
3984             if ( cd.getNumberOfCombinableDomains() != 0 ) {
3985                 return false;
3986             }
3987             if ( cd.getNumberOfProteinsExhibitingCombination( "QQ" ) != 0 ) {
3988                 return false;
3989             }
3990             cd = cdcc2.get( "singlet" );
3991             if ( cd.getKeyDomainCount() != 1 ) {
3992                 return false;
3993             }
3994             if ( cd.getKeyDomainProteinsCount() != 1 ) {
3995                 return false;
3996             }
3997             if ( cd.getNumberOfCombinableDomains() != 0 ) {
3998                 return false;
3999             }
4000             if ( cd.getNumberOfProteinsExhibitingCombination( "singlet" ) != 0 ) {
4001                 return false;
4002             }
4003             cd = cdcc2.get( "three" );
4004             if ( cd.getKeyDomainCount() != 3 ) {
4005                 return false;
4006             }
4007             if ( cd.getKeyDomainProteinsCount() != 1 ) {
4008                 return false;
4009             }
4010             if ( cd.getNumberOfCombinableDomains() != 0 ) {
4011                 return false;
4012             }
4013             if ( cd.getNumberOfProteinsExhibitingCombination( "three" ) != 0 ) {
4014                 return false;
4015             }
4016             if ( cd.getNumberOfProteinsExhibitingCombination( "so_far_so_bad" ) != 0 ) {
4017                 return false;
4018             }
4019         }
4020         catch ( final Exception e ) {
4021             e.printStackTrace( System.out );
4022             return false;
4023         }
4024         return true;
4025     }
4026
4027     private static boolean testDomainSorting() {
4028         try {
4029             final Domain A = new BasicDomain( "A", ( short ) 1, ( short ) 2, ( short ) 1, ( short ) 1, 0.1, -12 );
4030             final Domain B = new BasicDomain( "B", ( short ) 1, ( short ) 2, ( short ) 1, ( short ) 1, 0.1, -12 );
4031             final Domain C = new BasicDomain( "C", ( short ) 1, ( short ) 2, ( short ) 1, ( short ) 1, 0.2, -12 );
4032             final Domain D = new BasicDomain( "D", ( short ) 1, ( short ) 2, ( short ) 1, ( short ) 1, 0.3, -12 );
4033             final Domain E = new BasicDomain( "E", ( short ) 1, ( short ) 2, ( short ) 1, ( short ) 1, 0.4, -12 );
4034             final Domain F = new BasicDomain( "F", ( short ) 1, ( short ) 2, ( short ) 1, ( short ) 1, 0.5, -12 );
4035             final Domain G = new BasicDomain( "G", ( short ) 1, ( short ) 2, ( short ) 1, ( short ) 1, 0.6, -12 );
4036             final Domain H1 = new BasicDomain( "H", ( short ) 100, ( short ) 200, ( short ) 1, ( short ) 5, 0.7, -12 );
4037             final Domain H2 = new BasicDomain( "H", ( short ) 300, ( short ) 400, ( short ) 2, ( short ) 5, 0.7, -12 );
4038             final Domain H3 = new BasicDomain( "H", ( short ) 500, ( short ) 600, ( short ) 3, ( short ) 5, 0.7, -12 );
4039             final Domain H4 = new BasicDomain( "H", ( short ) 700, ( short ) 800, ( short ) 4, ( short ) 5, 0.7, -12 );
4040             final Domain H5 = new BasicDomain( "H", ( short ) 700, ( short ) 800, ( short ) 5, ( short ) 5, 0.7, -12 );
4041             final Domain H6 = new BasicDomain( "H",
4042                                                ( short ) 1199,
4043                                                ( short ) 1299,
4044                                                ( short ) 6,
4045                                                ( short ) 6,
4046                                                0.7,
4047                                                -0.111 );
4048             final Domain H7 = new BasicDomain( "H7", ( short ) 700, ( short ) 800, ( short ) 5, ( short ) 5, 0.7, -12 );
4049             final Domain H8 = new BasicDomain( "H7", ( short ) 700, ( short ) 800, ( short ) 5, ( short ) 200, 0.7, -12 );
4050             final Protein protein = new BasicProtein( "00", "bat", 0 );
4051             protein.addProteinDomain( H5 );
4052             protein.addProteinDomain( H2 );
4053             protein.addProteinDomain( H7 );
4054             protein.addProteinDomain( H6 );
4055             protein.addProteinDomain( A );
4056             protein.addProteinDomain( G );
4057             protein.addProteinDomain( H4 );
4058             protein.addProteinDomain( D );
4059             protein.addProteinDomain( H1 );
4060             protein.addProteinDomain( C );
4061             protein.addProteinDomain( E );
4062             protein.addProteinDomain( F );
4063             protein.addProteinDomain( B );
4064             protein.addProteinDomain( H3 );
4065             protein.addProteinDomain( H7 );
4066             protein.addProteinDomain( H7 );
4067             protein.addProteinDomain( H8 );
4068             final List<Domain> sorted = SurfacingUtil.sortDomainsWithAscendingConfidenceValues( protein );
4069             if ( sorted.size() != 17 ) {
4070                 return false;
4071             }
4072             if ( !sorted.get( 0 ).getDomainId().equals( "A" ) ) {
4073                 return false;
4074             }
4075             if ( sorted.get( 0 ).getNumber() != 1 ) {
4076                 return false;
4077             }
4078             if ( !sorted.get( 1 ).getDomainId().equals( "B" ) ) {
4079                 return false;
4080             }
4081             if ( sorted.get( 1 ).getNumber() != 1 ) {
4082                 return false;
4083             }
4084             if ( !sorted.get( 2 ).getDomainId().equals( "C" ) ) {
4085                 return false;
4086             }
4087             if ( sorted.get( 2 ).getNumber() != 1 ) {
4088                 return false;
4089             }
4090             if ( !sorted.get( 3 ).getDomainId().equals( "D" ) ) {
4091                 return false;
4092             }
4093             if ( sorted.get( 3 ).getNumber() != 1 ) {
4094                 return false;
4095             }
4096             if ( !sorted.get( 4 ).getDomainId().equals( "E" ) ) {
4097                 return false;
4098             }
4099             if ( sorted.get( 4 ).getNumber() != 1 ) {
4100                 return false;
4101             }
4102             if ( !sorted.get( 5 ).getDomainId().equals( "F" ) ) {
4103                 return false;
4104             }
4105             if ( sorted.get( 5 ).getNumber() != 1 ) {
4106                 return false;
4107             }
4108             if ( !sorted.get( 6 ).getDomainId().equals( "G" ) ) {
4109                 return false;
4110             }
4111             if ( sorted.get( 6 ).getNumber() != 1 ) {
4112                 return false;
4113             }
4114             if ( !sorted.get( 7 ).getDomainId().equals( "H" ) ) {
4115                 return false;
4116             }
4117             if ( sorted.get( 7 ).getNumber() != 5 ) {
4118                 return false;
4119             }
4120             if ( !sorted.get( 8 ).getDomainId().equals( "H" ) ) {
4121                 return false;
4122             }
4123             if ( sorted.get( 8 ).getNumber() != 2 ) {
4124                 return false;
4125             }
4126             if ( !sorted.get( 9 ).getDomainId().equals( "H" ) ) {
4127                 return false;
4128             }
4129             if ( sorted.get( 9 ).getNumber() != 6 ) {
4130                 return false;
4131             }
4132             if ( !sorted.get( 10 ).getDomainId().equals( "H" ) ) {
4133                 return false;
4134             }
4135             if ( sorted.get( 10 ).getNumber() != 4 ) {
4136                 return false;
4137             }
4138             if ( !sorted.get( 11 ).getDomainId().equals( "H" ) ) {
4139                 return false;
4140             }
4141             if ( sorted.get( 11 ).getNumber() != 1 ) {
4142                 return false;
4143             }
4144             if ( sorted.get( 11 ).getTotalCount() != 5 ) {
4145                 return false;
4146             }
4147             if ( !sorted.get( 12 ).getDomainId().equals( "H" ) ) {
4148                 return false;
4149             }
4150             if ( sorted.get( 12 ).getNumber() != 3 ) {
4151                 return false;
4152             }
4153             if ( !sorted.get( 13 ).getDomainId().equals( "H7" ) ) {
4154                 return false;
4155             }
4156             if ( sorted.get( 13 ).getNumber() != 5 ) {
4157                 return false;
4158             }
4159             if ( !sorted.get( 14 ).getDomainId().equals( "H7" ) ) {
4160                 return false;
4161             }
4162             if ( sorted.get( 14 ).getNumber() != 5 ) {
4163                 return false;
4164             }
4165             if ( !sorted.get( 15 ).getDomainId().equals( "H7" ) ) {
4166                 return false;
4167             }
4168             if ( sorted.get( 15 ).getNumber() != 5 ) {
4169                 return false;
4170             }
4171             // To check if sorting is stable [as claimed by Sun for
4172             // Collections.sort( List )]
4173             if ( !sorted.get( 16 ).getDomainId().equals( "H7" ) ) {
4174                 return false;
4175             }
4176             if ( sorted.get( 16 ).getNumber() != 5 ) {
4177                 return false;
4178             }
4179             if ( sorted.get( 16 ).getTotalCount() != 200 ) {
4180                 return false;
4181             }
4182         }
4183         catch ( final Exception e ) {
4184             e.printStackTrace( System.out );
4185             return false;
4186         }
4187         return true;
4188     }
4189
4190     private static boolean testGenomeWideCombinableDomains() {
4191         try {
4192             final Domain a = new BasicDomain( "a", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4193             final Domain b = new BasicDomain( "b", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4194             final Domain c = new BasicDomain( "c", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4195             final Domain d = new BasicDomain( "d", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4196             final Domain e = new BasicDomain( "e", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4197             final Domain f = new BasicDomain( "f", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4198             final Domain g = new BasicDomain( "g", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4199             final Domain h = new BasicDomain( "h", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4200             final Domain x = new BasicDomain( "x", 23, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4201             final Protein eel_0 = new BasicProtein( "0", "eel", 0 );
4202             final Protein eel_1 = new BasicProtein( "1", "eel", 0 );
4203             final Protein eel_2 = new BasicProtein( "2", "eel", 0 );
4204             final Protein eel_3 = new BasicProtein( "3", "eel", 0 );
4205             final Protein eel_4 = new BasicProtein( "4", "eel", 0 );
4206             final Protein eel_5 = new BasicProtein( "5", "eel", 0 );
4207             final Protein eel_6 = new BasicProtein( "6", "eel", 0 );
4208             eel_1.addProteinDomain( a );
4209             eel_2.addProteinDomain( a );
4210             eel_2.addProteinDomain( b );
4211             eel_3.addProteinDomain( a );
4212             eel_3.addProteinDomain( a );
4213             eel_3.addProteinDomain( b );
4214             eel_4.addProteinDomain( a );
4215             eel_4.addProteinDomain( b );
4216             eel_4.addProteinDomain( c );
4217             eel_4.addProteinDomain( d );
4218             eel_4.addProteinDomain( e );
4219             eel_5.addProteinDomain( e );
4220             eel_5.addProteinDomain( e );
4221             eel_5.addProteinDomain( f );
4222             eel_5.addProteinDomain( f );
4223             eel_5.addProteinDomain( f );
4224             eel_5.addProteinDomain( f );
4225             eel_6.addProteinDomain( g );
4226             eel_6.addProteinDomain( h );
4227             final List<Protein> protein_list_eel = new ArrayList<Protein>();
4228             protein_list_eel.add( eel_0 );
4229             protein_list_eel.add( eel_1 );
4230             protein_list_eel.add( eel_2 );
4231             protein_list_eel.add( eel_3 );
4232             protein_list_eel.add( eel_4 );
4233             protein_list_eel.add( eel_5 );
4234             protein_list_eel.add( eel_6 );
4235             final BasicGenomeWideCombinableDomains eel_not_ignore = BasicGenomeWideCombinableDomains
4236                     .createInstance( protein_list_eel, false, new BasicSpecies( "eel" ) );
4237             final BasicGenomeWideCombinableDomains eel_ignore = BasicGenomeWideCombinableDomains
4238                     .createInstance( protein_list_eel, true, new BasicSpecies( "eel" ) );
4239             if ( !eel_not_ignore.contains( "a" ) ) {
4240                 return false;
4241             }
4242             if ( !eel_not_ignore.contains( "b" ) ) {
4243                 return false;
4244             }
4245             if ( !eel_not_ignore.contains( "c" ) ) {
4246                 return false;
4247             }
4248             if ( !eel_not_ignore.contains( "d" ) ) {
4249                 return false;
4250             }
4251             if ( !eel_not_ignore.contains( "e" ) ) {
4252                 return false;
4253             }
4254             if ( !eel_not_ignore.contains( "f" ) ) {
4255                 return false;
4256             }
4257             if ( !eel_not_ignore.contains( "g" ) ) {
4258                 return false;
4259             }
4260             if ( !eel_not_ignore.contains( "h" ) ) {
4261                 return false;
4262             }
4263             if ( eel_not_ignore.contains( "x" ) ) {
4264                 return false;
4265             }
4266             if ( !eel_ignore.contains( "a" ) ) {
4267                 return false;
4268             }
4269             if ( !eel_ignore.contains( "b" ) ) {
4270                 return false;
4271             }
4272             if ( !eel_ignore.contains( "c" ) ) {
4273                 return false;
4274             }
4275             if ( !eel_ignore.contains( "d" ) ) {
4276                 return false;
4277             }
4278             if ( !eel_ignore.contains( "e" ) ) {
4279                 return false;
4280             }
4281             if ( !eel_ignore.contains( "f" ) ) {
4282                 return false;
4283             }
4284             if ( !eel_ignore.contains( "g" ) ) {
4285                 return false;
4286             }
4287             if ( !eel_ignore.contains( "h" ) ) {
4288                 return false;
4289             }
4290             if ( eel_ignore.contains( "x" ) ) {
4291                 return false;
4292             }
4293             if ( eel_not_ignore.getSize() != 8 ) {
4294                 return false;
4295             }
4296             if ( eel_ignore.getSize() != 8 ) {
4297                 return false;
4298             }
4299             if ( eel_not_ignore.get( "a" ).getCombinableDomainsIds().size() != 5 ) {
4300                 return false;
4301             }
4302             if ( eel_not_ignore.get( "b" ).getCombinableDomainsIds().size() != 4 ) {
4303                 return false;
4304             }
4305             if ( eel_not_ignore.get( "c" ).getCombinableDomainsIds().size() != 4 ) {
4306                 return false;
4307             }
4308             if ( eel_not_ignore.get( "d" ).getCombinableDomainsIds().size() != 4 ) {
4309                 return false;
4310             }
4311             if ( eel_not_ignore.get( "e" ).getCombinableDomainsIds().size() != 6 ) {
4312                 return false;
4313             }
4314             if ( eel_not_ignore.get( "f" ).getCombinableDomainsIds().size() != 2 ) {
4315                 return false;
4316             }
4317             if ( eel_not_ignore.get( "g" ).getCombinableDomainsIds().size() != 1 ) {
4318                 return false;
4319             }
4320             if ( eel_not_ignore.get( "h" ).getCombinableDomainsIds().size() != 1 ) {
4321                 return false;
4322             }
4323             if ( eel_ignore.get( "a" ).getCombinableDomainsIds().size() != 4 ) {
4324                 return false;
4325             }
4326             if ( eel_ignore.get( "b" ).getCombinableDomainsIds().size() != 4 ) {
4327                 return false;
4328             }
4329             if ( eel_ignore.get( "c" ).getCombinableDomainsIds().size() != 4 ) {
4330                 return false;
4331             }
4332             if ( eel_ignore.get( "d" ).getCombinableDomainsIds().size() != 4 ) {
4333                 return false;
4334             }
4335             if ( eel_ignore.get( "e" ).getCombinableDomainsIds().size() != 5 ) {
4336                 return false;
4337             }
4338             if ( eel_ignore.get( "f" ).getCombinableDomainsIds().size() != 1 ) {
4339                 return false;
4340             }
4341             if ( eel_ignore.get( "g" ).getCombinableDomainsIds().size() != 1 ) {
4342                 return false;
4343             }
4344             if ( eel_ignore.get( "h" ).getCombinableDomainsIds().size() != 1 ) {
4345                 return false;
4346             }
4347             if ( eel_not_ignore.getAllDomainIds().size() != 8 ) {
4348                 return false;
4349             }
4350             if ( !eel_not_ignore.getAllDomainIds().contains( a.getDomainId() ) ) {
4351                 return false;
4352             }
4353             if ( !eel_not_ignore.getAllDomainIds().contains( b.getDomainId() ) ) {
4354                 return false;
4355             }
4356             if ( !eel_not_ignore.getAllDomainIds().contains( c.getDomainId() ) ) {
4357                 return false;
4358             }
4359             if ( !eel_not_ignore.getAllDomainIds().contains( d.getDomainId() ) ) {
4360                 return false;
4361             }
4362             if ( !eel_not_ignore.getAllDomainIds().contains( e.getDomainId() ) ) {
4363                 return false;
4364             }
4365             if ( !eel_not_ignore.getAllDomainIds().contains( f.getDomainId() ) ) {
4366                 return false;
4367             }
4368             if ( !eel_not_ignore.getAllDomainIds().contains( g.getDomainId() ) ) {
4369                 return false;
4370             }
4371             if ( !eel_not_ignore.getAllDomainIds().contains( h.getDomainId() ) ) {
4372                 return false;
4373             }
4374             if ( eel_not_ignore.getAllDomainIds().contains( x.getDomainId() ) ) {
4375                 return false;
4376             }
4377             if ( eel_ignore.getAllDomainIds().size() != 8 ) {
4378                 return false;
4379             }
4380             if ( !eel_ignore.getAllDomainIds().contains( a.getDomainId() ) ) {
4381                 return false;
4382             }
4383             if ( !eel_ignore.getAllDomainIds().contains( b.getDomainId() ) ) {
4384                 return false;
4385             }
4386             if ( !eel_ignore.getAllDomainIds().contains( c.getDomainId() ) ) {
4387                 return false;
4388             }
4389             if ( !eel_ignore.getAllDomainIds().contains( d.getDomainId() ) ) {
4390                 return false;
4391             }
4392             if ( !eel_ignore.getAllDomainIds().contains( e.getDomainId() ) ) {
4393                 return false;
4394             }
4395             if ( !eel_ignore.getAllDomainIds().contains( f.getDomainId() ) ) {
4396                 return false;
4397             }
4398             if ( !eel_ignore.getAllDomainIds().contains( g.getDomainId() ) ) {
4399                 return false;
4400             }
4401             if ( !eel_ignore.getAllDomainIds().contains( h.getDomainId() ) ) {
4402                 return false;
4403             }
4404             if ( eel_ignore.getAllDomainIds().contains( x.getDomainId() ) ) {
4405                 return false;
4406             }
4407             final SortedSet<BinaryDomainCombination> bc0 = eel_not_ignore.toBinaryDomainCombinations();
4408             if ( bc0.size() != 15 ) {
4409                 return false;
4410             }
4411             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "a", "a" ) ) ) {
4412                 return false;
4413             }
4414             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "a", "b" ) ) ) {
4415                 return false;
4416             }
4417             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "b", "a" ) ) ) {
4418                 return false;
4419             }
4420             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "a", "c" ) ) ) {
4421                 return false;
4422             }
4423             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "a", "d" ) ) ) {
4424                 return false;
4425             }
4426             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "a", "e" ) ) ) {
4427                 return false;
4428             }
4429             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "b", "c" ) ) ) {
4430                 return false;
4431             }
4432             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "b", "d" ) ) ) {
4433                 return false;
4434             }
4435             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "b", "e" ) ) ) {
4436                 return false;
4437             }
4438             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "c", "d" ) ) ) {
4439                 return false;
4440             }
4441             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "c", "e" ) ) ) {
4442                 return false;
4443             }
4444             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "d", "e" ) ) ) {
4445                 return false;
4446             }
4447             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "e", "f" ) ) ) {
4448                 return false;
4449             }
4450             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "e", "e" ) ) ) {
4451                 return false;
4452             }
4453             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "f", "f" ) ) ) {
4454                 return false;
4455             }
4456             if ( !bc0.contains( BasicBinaryDomainCombination.obtainInstance( "g", "h" ) ) ) {
4457                 return false;
4458             }
4459             if ( bc0.contains( BasicBinaryDomainCombination.obtainInstance( "f", "a" ) ) ) {
4460                 return false;
4461             }
4462             if ( bc0.contains( BasicBinaryDomainCombination.obtainInstance( "f", "b" ) ) ) {
4463                 return false;
4464             }
4465             if ( bc0.contains( BasicBinaryDomainCombination.obtainInstance( "a", "h" ) ) ) {
4466                 return false;
4467             }
4468             if ( bc0.contains( BasicBinaryDomainCombination.obtainInstance( "a", "g" ) ) ) {
4469                 return false;
4470             }
4471             final SortedSet<BinaryDomainCombination> bc1 = eel_ignore.toBinaryDomainCombinations();
4472             if ( bc1.size() != 12 ) {
4473                 return false;
4474             }
4475             if ( bc1.contains( BasicBinaryDomainCombination.obtainInstance( "a", "a" ) ) ) {
4476                 return false;
4477             }
4478             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "a", "b" ) ) ) {
4479                 return false;
4480             }
4481             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "b", "a" ) ) ) {
4482                 return false;
4483             }
4484             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "a", "c" ) ) ) {
4485                 return false;
4486             }
4487             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "a", "d" ) ) ) {
4488                 return false;
4489             }
4490             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "a", "e" ) ) ) {
4491                 return false;
4492             }
4493             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "b", "c" ) ) ) {
4494                 return false;
4495             }
4496             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "b", "d" ) ) ) {
4497                 return false;
4498             }
4499             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "b", "e" ) ) ) {
4500                 return false;
4501             }
4502             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "c", "d" ) ) ) {
4503                 return false;
4504             }
4505             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "c", "e" ) ) ) {
4506                 return false;
4507             }
4508             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "d", "e" ) ) ) {
4509                 return false;
4510             }
4511             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "e", "f" ) ) ) {
4512                 return false;
4513             }
4514             if ( !bc1.contains( BasicBinaryDomainCombination.obtainInstance( "g", "h" ) ) ) {
4515                 return false;
4516             }
4517             if ( bc1.contains( BasicBinaryDomainCombination.obtainInstance( "e", "e" ) ) ) {
4518                 return false;
4519             }
4520             if ( bc1.contains( BasicBinaryDomainCombination.obtainInstance( "f", "f" ) ) ) {
4521                 return false;
4522             }
4523             if ( bc1.contains( BasicBinaryDomainCombination.obtainInstance( "f", "a" ) ) ) {
4524                 return false;
4525             }
4526             if ( bc1.contains( BasicBinaryDomainCombination.obtainInstance( "f", "b" ) ) ) {
4527                 return false;
4528             }
4529             if ( bc1.contains( BasicBinaryDomainCombination.obtainInstance( "a", "g" ) ) ) {
4530                 return false;
4531             }
4532             if ( bc1.contains( BasicBinaryDomainCombination.obtainInstance( "b", "g" ) ) ) {
4533                 return false;
4534             }
4535         }
4536         catch ( final Exception e ) {
4537             e.printStackTrace( System.out );
4538             return false;
4539         }
4540         return true;
4541     }
4542
4543     private static boolean testHmmPfamOutputParser( final File test_dir ) {
4544         try {
4545             final HmmPfamOutputParser parser = new HmmPfamOutputParser( new File( test_dir
4546                                                                                   + ForesterUtil.getFileSeparator() + "hmmpfam_output" ), "human", "ls" );
4547             parser.setEValueMaximum( 0.2 );
4548             parser.setIgnoreDufs( true );
4549             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4550             List<?> domain_collections = null;
4551             domain_collections = parser.parse();
4552             if ( parser.getDomainsEncountered() != 4 ) {
4553                 return false;
4554             }
4555             if ( parser.getDomainsIgnoredDueToDuf() != 0 ) {
4556                 return false;
4557             }
4558             if ( parser.getDomainsIgnoredDueToEval() != 1 ) {
4559                 return false;
4560             }
4561             if ( parser.getDomainsIgnoredDueToOverlap() != 0 ) {
4562                 return false;
4563             }
4564             if ( parser.getDomainsStored() != 3 ) {
4565                 return false;
4566             }
4567             if ( domain_collections.size() != 1 ) {
4568                 return false;
4569             }
4570             final Protein pdc = ( Protein ) domain_collections.get( 0 );
4571             if ( !pdc.getProteinId().equals( new ProteinId( "ENSP00000285681" ) ) ) {
4572                 return false;
4573             }
4574             if ( !pdc.getSpecies().getSpeciesId().equals( "human" ) ) {
4575                 return false;
4576             }
4577             if ( pdc.getNumberOfProteinDomains() != 3 ) {
4578                 return false;
4579             }
4580             if ( !pdc.getAccession().equals( "acc_ENSP00000285681" ) ) {
4581                 return false;
4582             }
4583             if ( !pdc
4584                     .getDescription()
4585                     .equals( "pep:known chromosome:NCBI36:21:16024215:16174248:1 gene:ENSG00000155313 transcript:ENST00000285681" ) ) {
4586                 return false;
4587             }
4588             final List<Domain> uba = pdc.getProteinDomains( "UBA" );
4589             final List<Domain> uim = pdc.getProteinDomains( "UIM" );
4590             final List<Domain> uch = pdc.getProteinDomains( "UCH" );
4591             if ( uba.size() != 1 ) {
4592                 return false;
4593             }
4594             if ( uim.size() != 2 ) {
4595                 return false;
4596             }
4597             if ( uch.size() != 0 ) {
4598                 return false;
4599             }
4600             final BasicDomain uim_domain = ( BasicDomain ) uim.get( 1 );
4601             if ( !uim_domain.getDomainId().equals( "UIM" ) ) {
4602                 return false;
4603             }
4604             if ( uim_domain.getTotalCount() != 2 ) {
4605                 return false;
4606             }
4607             final BasicDomain uba_domain = ( BasicDomain ) uba.get( 0 );
4608             if ( !uba_domain.getDomainId().equals( "UBA" ) ) {
4609                 return false;
4610             }
4611             if ( uba_domain.getNumber() != 1 ) {
4612                 return false;
4613             }
4614             if ( uba_domain.getTotalCount() != 1 ) {
4615                 return false;
4616             }
4617             if ( uba_domain.getFrom() != 16 ) {
4618                 return false;
4619             }
4620             if ( uba_domain.getTo() != 57 ) {
4621                 return false;
4622             }
4623             final HmmPfamOutputParser parser2 = new HmmPfamOutputParser( new File( test_dir
4624                                                                                    + ForesterUtil.getFileSeparator() + "hmmpfam_output_short" ), "human", "ls" );
4625             parser2.setEValueMaximum( 0.2 );
4626             parser2.setIgnoreDufs( true );
4627             parser2.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4628             List<Protein> domain_collections2 = null;
4629             domain_collections2 = parser2.parse();
4630             if ( parser2.getDomainsEncountered() != 4 ) {
4631                 return false;
4632             }
4633             if ( parser.getDomainsIgnoredDueToDuf() != 0 ) {
4634                 return false;
4635             }
4636             if ( parser.getDomainsIgnoredDueToEval() != 1 ) {
4637                 return false;
4638             }
4639             if ( parser.getDomainsIgnoredDueToOverlap() != 0 ) {
4640                 return false;
4641             }
4642             if ( parser2.getDomainsStored() != 3 ) {
4643                 return false;
4644             }
4645             if ( domain_collections2.size() != 1 ) {
4646                 return false;
4647             }
4648             final Protein pdc2 = domain_collections2.get( 0 );
4649             if ( !pdc2.getProteinId().getId().equals( "ENSP00000285681" ) ) {
4650                 return false;
4651             }
4652             if ( !pdc2.getSpecies().getSpeciesId().equals( "human" ) ) {
4653                 return false;
4654             }
4655             if ( !pdc2.getName().equals( "" ) ) {
4656                 return false;
4657             }
4658             if ( !pdc2.getAccession().equals( "223" ) ) {
4659                 return false;
4660             }
4661             if ( !pdc2
4662                     .getDescription()
4663                     .equals( "pep:known chromosome:NCBI36:21:16024215:16174248:1 gene:ENSG00000155313 transcript:ENST00000285681" ) ) {
4664                 return false;
4665             }
4666             if ( pdc2.getNumberOfProteinDomains() != 3 ) {
4667                 return false;
4668             }
4669             final List<Domain> uba2 = pdc2.getProteinDomains( "UBA" );
4670             final List<Domain> uim2 = pdc2.getProteinDomains( "UIM" );
4671             final List<Domain> uch2 = pdc2.getProteinDomains( "UCH" );
4672             if ( uba2.size() != 1 ) {
4673                 return false;
4674             }
4675             if ( uim2.size() != 2 ) {
4676                 return false;
4677             }
4678             if ( uch2.size() != 0 ) {
4679                 return false;
4680             }
4681             final BasicDomain uim_domain2 = ( BasicDomain ) uim2.get( 1 );
4682             if ( !uim_domain2.getDomainId().equals( "UIM" ) ) {
4683                 return false;
4684             }
4685             if ( uim_domain2.getTotalCount() != 2 ) {
4686                 return false;
4687             }
4688             final BasicDomain uba_domain2 = ( BasicDomain ) uba2.get( 0 );
4689             if ( !uba_domain2.getDomainId().equals( "UBA" ) ) {
4690                 return false;
4691             }
4692             if ( uba_domain2.getNumber() != 1 ) {
4693                 return false;
4694             }
4695             if ( uba_domain2.getTotalCount() != 1 ) {
4696                 return false;
4697             }
4698             if ( uba_domain2.getFrom() != 16 ) {
4699                 return false;
4700             }
4701             if ( uba_domain2.getTo() != 57 ) {
4702                 return false;
4703             }
4704         }
4705         catch ( final Exception e ) {
4706             e.printStackTrace( System.out );
4707             return false;
4708         }
4709         return true;
4710     }
4711
4712     private static boolean testHmmPfamOutputParserWithFilter( final File test_dir ) {
4713         try {
4714             HmmPfamOutputParser parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator()
4715                                                                             + "hmmpfam_output3" ), "human", "ls" );
4716             parser.setEValueMaximum( 0.2 );
4717             parser.setIgnoreDufs( true );
4718             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4719             List<Protein> proteins = null;
4720             proteins = parser.parse();
4721             if ( parser.getProteinsIgnoredDueToFilter() != 0 ) {
4722                 return false;
4723             }
4724             if ( proteins.size() != 4 ) {
4725                 return false;
4726             }
4727             //
4728             Set<String> filter = new TreeSet<String>();
4729             filter.add( "beauty" );
4730             filter.add( "strange" );
4731             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4732                                               "human",
4733                                               filter,
4734                                               HmmPfamOutputParser.FilterType.NEGATIVE_PROTEIN );
4735             parser.setEValueMaximum( 0.2 );
4736             parser.setIgnoreDufs( true );
4737             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4738             proteins = null;
4739             proteins = parser.parse();
4740             if ( parser.getProteinsIgnoredDueToFilter() != 0 ) {
4741                 return false;
4742             }
4743             if ( proteins.size() != 4 ) {
4744                 return false;
4745             }
4746             //
4747             filter = new TreeSet<String>();
4748             filter.add( "beauty" );
4749             filter.add( "strange" );
4750             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4751                                               "human",
4752                                               filter,
4753                                               HmmPfamOutputParser.FilterType.POSITIVE_PROTEIN );
4754             parser.setEValueMaximum( 0.2 );
4755             parser.setIgnoreDufs( true );
4756             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4757             proteins = null;
4758             proteins = parser.parse();
4759             if ( parser.getProteinsIgnoredDueToFilter() != 4 ) {
4760                 return false;
4761             }
4762             if ( proteins.size() != 0 ) {
4763                 return false;
4764             }
4765             //
4766             filter = new TreeSet<String>();
4767             filter.add( "UIM" );
4768             filter.add( "A" );
4769             filter.add( "C" );
4770             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4771                                               "human",
4772                                               filter,
4773                                               HmmPfamOutputParser.FilterType.POSITIVE_PROTEIN );
4774             parser.setEValueMaximum( 0.2 );
4775             parser.setIgnoreDufs( true );
4776             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4777             proteins = null;
4778             proteins = parser.parse();
4779             if ( parser.getProteinsIgnoredDueToFilter() != 0 ) {
4780                 return false;
4781             }
4782             if ( proteins.size() != 4 ) {
4783                 return false;
4784             }
4785             //
4786             filter = new TreeSet<String>();
4787             filter.add( "UIM" );
4788             filter.add( "A" );
4789             filter.add( "C" );
4790             filter.add( "X" );
4791             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4792                                               "human",
4793                                               filter,
4794                                               HmmPfamOutputParser.FilterType.NEGATIVE_DOMAIN );
4795             parser.setEValueMaximum( 0.2 );
4796             parser.setIgnoreDufs( true );
4797             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4798             proteins = null;
4799             proteins = parser.parse();
4800             if ( parser.getDomainsIgnoredDueToNegativeDomainFilter() != 7 ) {
4801                 return false;
4802             }
4803             if ( proteins.size() != 3 ) {
4804                 return false;
4805             }
4806             //
4807             filter = new TreeSet<String>();
4808             filter.add( "UIM" );
4809             filter.add( "A" );
4810             filter.add( "C" );
4811             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4812                                               "human",
4813                                               filter,
4814                                               HmmPfamOutputParser.FilterType.NEGATIVE_PROTEIN );
4815             parser.setEValueMaximum( 0.2 );
4816             parser.setIgnoreDufs( true );
4817             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4818             proteins = null;
4819             proteins = parser.parse();
4820             if ( parser.getProteinsIgnoredDueToFilter() != 4 ) {
4821                 return false;
4822             }
4823             if ( proteins.size() != 0 ) {
4824                 return false;
4825             }
4826             //
4827             filter = new TreeSet<String>();
4828             filter.add( "UIM" );
4829             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4830                                               "human",
4831                                               filter,
4832                                               HmmPfamOutputParser.FilterType.NEGATIVE_PROTEIN );
4833             parser.setEValueMaximum( 0.2 );
4834             parser.setIgnoreDufs( true );
4835             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4836             proteins = null;
4837             proteins = parser.parse();
4838             if ( parser.getProteinsIgnoredDueToFilter() != 1 ) {
4839                 return false;
4840             }
4841             if ( parser.getProteinsStored() != 3 ) {
4842                 return false;
4843             }
4844             if ( proteins.size() != 3 ) {
4845                 return false;
4846             }
4847             //
4848             filter = new TreeSet<String>();
4849             filter.add( "UIM" );
4850             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4851                                               "human",
4852                                               filter,
4853                                               HmmPfamOutputParser.FilterType.POSITIVE_PROTEIN );
4854             parser.setEValueMaximum( 0.2 );
4855             parser.setIgnoreDufs( true );
4856             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4857             proteins = null;
4858             proteins = parser.parse();
4859             if ( parser.getProteinsIgnoredDueToFilter() != 3 ) {
4860                 return false;
4861             }
4862             if ( parser.getProteinsStored() != 1 ) {
4863                 return false;
4864             }
4865             if ( proteins.size() != 1 ) {
4866                 return false;
4867             }
4868             //
4869             filter = new TreeSet<String>();
4870             filter.add( "A" );
4871             filter.add( "C" );
4872             parser = new HmmPfamOutputParser( new File( test_dir + ForesterUtil.getFileSeparator() + "hmmpfam_output3" ),
4873                                               "human",
4874                                               filter,
4875                                               HmmPfamOutputParser.FilterType.POSITIVE_PROTEIN );
4876             parser.setEValueMaximum( 0.2 );
4877             parser.setIgnoreDufs( true );
4878             parser.setReturnType( HmmPfamOutputParser.ReturnType.UNORDERED_PROTEIN_DOMAIN_COLLECTION_PER_PROTEIN );
4879             proteins = null;
4880             proteins = parser.parse();
4881             if ( parser.getDomainsEncountered() != 11 ) {
4882                 return false;
4883             }
4884             if ( parser.getProteinsEncountered() != 4 ) {
4885                 return false;
4886             }
4887             if ( parser.getProteinsIgnoredDueToFilter() != 1 ) {
4888                 return false;
4889             }
4890             if ( parser.getProteinsStored() != 3 ) {
4891                 return false;
4892             }
4893             if ( proteins.size() != 3 ) {
4894                 return false;
4895             }
4896         }
4897         catch ( final Exception e ) {
4898             e.printStackTrace( System.out );
4899             return false;
4900         }
4901         return true;
4902     }
4903
4904     private static boolean testParsimony() {
4905         try {
4906             final BinaryStates X = BinaryStates.PRESENT;
4907             final BinaryStates O = BinaryStates.ABSENT;
4908             final GainLossStates G = GainLossStates.GAIN;
4909             final GainLossStates L = GainLossStates.LOSS;
4910             final GainLossStates A = GainLossStates.UNCHANGED_ABSENT;
4911             final GainLossStates P = GainLossStates.UNCHANGED_PRESENT;
4912             final Domain a = new BasicDomain( "A", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4913             final Domain b = new BasicDomain( "B", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4914             final Domain c = new BasicDomain( "C", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4915             final Domain d = new BasicDomain( "D", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4916             final Domain e = new BasicDomain( "E", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4917             final Domain f = new BasicDomain( "F", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4918             final Domain g = new BasicDomain( "G", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4919             final Domain h = new BasicDomain( "H", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4920             final Domain i = new BasicDomain( "I", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4921             final Domain j = new BasicDomain( "J", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4922             final Domain l = new BasicDomain( "L", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4923             final Domain m = new BasicDomain( "M", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4924             final Domain n = new BasicDomain( "N", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4925             final Domain o = new BasicDomain( "O", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4926             final Domain p = new BasicDomain( "P", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4927             final Domain q = new BasicDomain( "Q", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4928             final Domain r = new BasicDomain( "R", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
4929             // 1 a-a a-b a-c e-f-g-h l-m
4930             // 2 a-b a-c e-f-g-i n-o
4931             // 3 a-b a-d e-f-g-j p-q
4932             // 4 a-b a-d p-r
4933             // 1 a-a a-b a-c e-f e-g e-h f-g f-h g-h l-m
4934             // 2 a-b a-c e-f e-g e-i f-g f-i g-i n-o
4935             // 3 a-b a-d e-f e-g e-j f-g f-j g-j p-q
4936             // 4 a-b a-d p-r
4937             // 1 a b c e f g h l m
4938             // 2 a b c e f g i n o
4939             // 3 a b d e f g j p q
4940             // 4 a b d p r
4941             final Protein aa1 = new BasicProtein( "aa1", "one", 0 );
4942             aa1.addProteinDomain( a );
4943             aa1.addProteinDomain( a );
4944             final Protein ab1 = new BasicProtein( "ab1", "one", 0 );
4945             ab1.addProteinDomain( a );
4946             ab1.addProteinDomain( b );
4947             final Protein ac1 = new BasicProtein( "ac1", "one", 0 );
4948             ac1.addProteinDomain( a );
4949             ac1.addProteinDomain( c );
4950             final Protein efgh1 = new BasicProtein( "efgh1", "one", 0 );
4951             efgh1.addProteinDomain( e );
4952             efgh1.addProteinDomain( f );
4953             efgh1.addProteinDomain( g );
4954             efgh1.addProteinDomain( h );
4955             final Protein lm1 = new BasicProtein( "lm1", "one", 0 );
4956             lm1.addProteinDomain( l );
4957             lm1.addProteinDomain( m );
4958             final Protein ab2 = new BasicProtein( "ab2", "two", 0 );
4959             ab2.addProteinDomain( a );
4960             ab2.addProteinDomain( b );
4961             final Protein ac2 = new BasicProtein( "ac2", "two", 0 );
4962             ac2.addProteinDomain( a );
4963             ac2.addProteinDomain( c );
4964             final Protein efgi2 = new BasicProtein( "efgi2", "two", 0 );
4965             efgi2.addProteinDomain( e );
4966             efgi2.addProteinDomain( f );
4967             efgi2.addProteinDomain( g );
4968             efgi2.addProteinDomain( i );
4969             final Protein no2 = new BasicProtein( "no2", "two", 0 );
4970             no2.addProteinDomain( n );
4971             no2.addProteinDomain( o );
4972             final Protein ab3 = new BasicProtein( "ab3", "three", 0 );
4973             ab3.addProteinDomain( a );
4974             ab3.addProteinDomain( b );
4975             final Protein ad3 = new BasicProtein( "ad3", "three", 0 );
4976             ad3.addProteinDomain( a );
4977             ad3.addProteinDomain( d );
4978             final Protein efgj3 = new BasicProtein( "efgj3", "three", 0 );
4979             efgj3.addProteinDomain( e );
4980             efgj3.addProteinDomain( f );
4981             efgj3.addProteinDomain( g );
4982             efgj3.addProteinDomain( j );
4983             final Protein pq3 = new BasicProtein( "pq3", "three", 0 );
4984             pq3.addProteinDomain( p );
4985             pq3.addProteinDomain( q );
4986             final Protein ab4 = new BasicProtein( "ab4", "four", 0 );
4987             ab4.addProteinDomain( a );
4988             ab4.addProteinDomain( b );
4989             final Protein ad4 = new BasicProtein( "ad4", "four", 0 );
4990             ad4.addProteinDomain( a );
4991             ad4.addProteinDomain( d );
4992             final Protein pr4 = new BasicProtein( "pr4", "four", 0 );
4993             pr4.addProteinDomain( p );
4994             pr4.addProteinDomain( r );
4995             final List<Protein> one_list = new ArrayList<Protein>();
4996             one_list.add( aa1 );
4997             one_list.add( ab1 );
4998             one_list.add( ac1 );
4999             one_list.add( efgh1 );
5000             one_list.add( lm1 );
5001             final List<Protein> two_list = new ArrayList<Protein>();
5002             two_list.add( ab2 );
5003             two_list.add( ac2 );
5004             two_list.add( efgi2 );
5005             two_list.add( no2 );
5006             final List<Protein> three_list = new ArrayList<Protein>();
5007             three_list.add( ab3 );
5008             three_list.add( ad3 );
5009             three_list.add( efgj3 );
5010             three_list.add( pq3 );
5011             final List<Protein> four_list = new ArrayList<Protein>();
5012             four_list.add( ab4 );
5013             four_list.add( ad4 );
5014             four_list.add( pr4 );
5015             final GenomeWideCombinableDomains one = BasicGenomeWideCombinableDomains
5016                     .createInstance( one_list, false, new BasicSpecies( "one" ) );
5017             final GenomeWideCombinableDomains two = BasicGenomeWideCombinableDomains
5018                     .createInstance( two_list, false, new BasicSpecies( "two" ) );
5019             final GenomeWideCombinableDomains three = BasicGenomeWideCombinableDomains
5020                     .createInstance( three_list, false, new BasicSpecies( "three" ) );
5021             final GenomeWideCombinableDomains four = BasicGenomeWideCombinableDomains
5022                     .createInstance( four_list, false, new BasicSpecies( "four" ) );
5023             final List<GenomeWideCombinableDomains> gwcd_list = new ArrayList<GenomeWideCombinableDomains>();
5024             gwcd_list.add( one );
5025             gwcd_list.add( two );
5026             gwcd_list.add( three );
5027             gwcd_list.add( four );
5028             final CharacterStateMatrix<BinaryStates> matrix_d = DomainParsimonyCalculator
5029                     .createMatrixOfDomainPresenceOrAbsence( gwcd_list );
5030             final CharacterStateMatrix<BinaryStates> matrix_bc = DomainParsimonyCalculator
5031                     .createMatrixOfBinaryDomainCombinationPresenceOrAbsence( gwcd_list );
5032             // 1 a b c e f g h l m
5033             // 2 a b c e f g i n o
5034             // 3 a b d e f g j p q
5035             // 4 a b d p r
5036             if ( matrix_d.getState( 0, 0 ) != X ) {
5037                 return false;
5038             }
5039             if ( matrix_d.getState( 0, 1 ) != X ) {
5040                 return false;
5041             }
5042             if ( matrix_d.getState( 0, 2 ) != X ) {
5043                 return false;
5044             }
5045             if ( matrix_d.getState( 0, 3 ) != O ) {
5046                 return false;
5047             }
5048             if ( matrix_d.getState( 0, 4 ) != X ) {
5049                 return false;
5050             }
5051             if ( matrix_d.getState( 0, 5 ) != X ) {
5052                 return false;
5053             }
5054             if ( matrix_d.getState( 0, 6 ) != X ) {
5055                 return false;
5056             }
5057             if ( matrix_d.getState( 0, 7 ) != X ) {
5058                 return false;
5059             }
5060             if ( matrix_d.getState( 0, 8 ) != O ) {
5061                 return false;
5062             }
5063             // 1 a-a a-b a-c e-f e-g e-h f-g f-h g-h l-m
5064             // 2 a-b a-c e-f e-g e-i f-g f-i g-i n-o
5065             // 3 a-b a-d e-f e-g e-j f-g f-j g-j p-q
5066             // 4 a-b a-d p-r
5067             if ( matrix_bc.getState( 0, 0 ) != X ) {
5068                 return false;
5069             }
5070             if ( matrix_bc.getState( 0, 1 ) != X ) {
5071                 return false;
5072             }
5073             if ( matrix_bc.getState( 0, 2 ) != X ) {
5074                 return false;
5075             }
5076             if ( matrix_bc.getState( 0, 3 ) != O ) {
5077                 return false;
5078             }
5079             if ( matrix_bc.getState( 0, 4 ) != X ) {
5080                 return false;
5081             }
5082             if ( matrix_bc.getState( 1, 0 ) != O ) {
5083                 return false;
5084             }
5085             if ( matrix_bc.getState( 1, 1 ) != X ) {
5086                 return false;
5087             }
5088             if ( matrix_bc.getState( 1, 2 ) != X ) {
5089                 return false;
5090             }
5091             if ( matrix_bc.getState( 1, 3 ) != O ) {
5092                 return false;
5093             }
5094             if ( matrix_bc.getState( 1, 4 ) != X ) {
5095                 return false;
5096             }
5097             if ( matrix_bc.getState( 2, 0 ) != O ) {
5098                 return false;
5099             }
5100             if ( matrix_bc.getState( 2, 1 ) != X ) {
5101                 return false;
5102             }
5103             if ( matrix_bc.getState( 2, 2 ) != O ) {
5104                 return false;
5105             }
5106             if ( matrix_bc.getState( 2, 3 ) != X ) {
5107                 return false;
5108             }
5109             if ( matrix_bc.getState( 2, 4 ) != X ) {
5110                 return false;
5111             }
5112             final PhylogenyFactory factory0 = ParserBasedPhylogenyFactory.getInstance();
5113             final String p0_str = "((one,two)1-2,(three,four)3-4)root";
5114             final Phylogeny p0 = factory0.create( p0_str, new NHXParser() )[ 0 ];
5115             final DomainParsimonyCalculator dp0 = DomainParsimonyCalculator.createInstance( p0, gwcd_list );
5116             dp0.executeDolloParsimonyOnDomainPresence();
5117             final CharacterStateMatrix<GainLossStates> gl_matrix_d = dp0.getGainLossMatrix();
5118             final CharacterStateMatrix<BinaryStates> is_matrix_d = dp0.getInternalStatesMatrix();
5119             dp0.executeDolloParsimonyOnBinaryDomainCombintionPresence();
5120             final CharacterStateMatrix<GainLossStates> gl_matrix_bc = dp0.getGainLossMatrix();
5121             final CharacterStateMatrix<BinaryStates> is_matrix_bc = dp0.getInternalStatesMatrix();
5122             if ( is_matrix_d.getState( "root", "A" ) != X ) {
5123                 return false;
5124             }
5125             if ( is_matrix_d.getState( "root", "B" ) != X ) {
5126                 return false;
5127             }
5128             if ( is_matrix_d.getState( "root", "C" ) != O ) {
5129                 return false;
5130             }
5131             if ( is_matrix_d.getState( "root", "D" ) != O ) {
5132                 return false;
5133             }
5134             if ( is_matrix_d.getState( "root", "E" ) != X ) {
5135                 return false;
5136             }
5137             if ( is_matrix_bc.getState( "root", "A=A" ) != O ) {
5138                 return false;
5139             }
5140             if ( is_matrix_bc.getState( "root", "A=B" ) != X ) {
5141                 return false;
5142             }
5143             if ( is_matrix_bc.getState( "root", "A=C" ) != O ) {
5144                 return false;
5145             }
5146             if ( is_matrix_bc.getState( "root", "A=D" ) != O ) {
5147                 return false;
5148             }
5149             if ( is_matrix_bc.getState( "root", "G=H" ) != O ) {
5150                 return false;
5151             }
5152             if ( is_matrix_bc.getState( "1-2", "G=H" ) != O ) {
5153                 return false;
5154             }
5155             if ( is_matrix_bc.getState( "root", "E=F" ) != X ) {
5156                 return false;
5157             }
5158             if ( gl_matrix_bc.getState( "root", "E=F" ) != P ) {
5159                 return false;
5160             }
5161             if ( gl_matrix_bc.getState( "root", "A=A" ) != A ) {
5162                 return false;
5163             }
5164             if ( gl_matrix_bc.getState( "one", "A=A" ) != G ) {
5165                 return false;
5166             }
5167             if ( gl_matrix_bc.getState( "root", "A=B" ) != P ) {
5168                 return false;
5169             }
5170             if ( gl_matrix_bc.getState( "3-4", "A=D" ) != G ) {
5171                 return false;
5172             }
5173             if ( gl_matrix_bc.getState( "four", "E=F" ) != L ) {
5174                 return false;
5175             }
5176             if ( gl_matrix_d.getState( "3-4", "P" ) != G ) {
5177                 return false;
5178             }
5179         }
5180         catch ( final Exception e ) {
5181             e.printStackTrace( System.out );
5182             return false;
5183         }
5184         return true;
5185     }
5186
5187     private static boolean testParsimonyOnSecondaryFeatures() {
5188         try {
5189             final BinaryStates X = BinaryStates.PRESENT;
5190             final BinaryStates O = BinaryStates.ABSENT;
5191             final GainLossStates G = GainLossStates.GAIN;
5192             final GainLossStates L = GainLossStates.LOSS;
5193             final GainLossStates A = GainLossStates.UNCHANGED_ABSENT;
5194             final GainLossStates P = GainLossStates.UNCHANGED_PRESENT;
5195             final Domain a = new BasicDomain( "A", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5196             final Domain b = new BasicDomain( "B", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5197             final Domain c = new BasicDomain( "C", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5198             final Domain d = new BasicDomain( "D", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5199             final Domain e = new BasicDomain( "E", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5200             final Domain f = new BasicDomain( "F", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5201             final Domain g = new BasicDomain( "G", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5202             final Domain h = new BasicDomain( "H", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5203             final Domain i = new BasicDomain( "I", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5204             final Domain j = new BasicDomain( "J", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5205             final Domain l = new BasicDomain( "L", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5206             final Domain m = new BasicDomain( "M", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5207             final Domain n = new BasicDomain( "N", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5208             final Domain o = new BasicDomain( "O", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5209             final Domain p = new BasicDomain( "P", 1, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5210             final Domain q = new BasicDomain( "Q", 2, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5211             final Domain r = new BasicDomain( "R", 3, 25, ( short ) 1, ( short ) 4, 0.1, -12 );
5212             // 1 a-a a-b a-c e-f-g-h l-m
5213             // 2 a-b a-c e-f-g-i n-o
5214             // 3 a-b a-d e-f-g-j p-q
5215             // 4 a-b a-d p-r
5216             // 1 a-a a-b a-c e-f e-g e-h f-g f-h g-h l-m
5217             // 2 a-b a-c e-f e-g e-i f-g f-i g-i n-o
5218             // 3 a-b a-d e-f e-g e-j f-g f-j g-j p-q
5219             // 4 a-b a-d p-r
5220             // 1 a b c e f g h l m
5221             // 2 a b c e f g i n o
5222             // 3 a b d e f g j p q
5223             // 4 a b d p r
5224             final Protein aa1 = new BasicProtein( "aa1", "one", 0 );
5225             aa1.addProteinDomain( a );
5226             aa1.addProteinDomain( a );
5227             final Protein ab1 = new BasicProtein( "ab1", "one", 0 );
5228             ab1.addProteinDomain( a );
5229             ab1.addProteinDomain( b );
5230             final Protein ac1 = new BasicProtein( "ac1", "one", 0 );
5231             ac1.addProteinDomain( a );
5232             ac1.addProteinDomain( c );
5233             final Protein efgh1 = new BasicProtein( "efgh1", "one", 0 );
5234             efgh1.addProteinDomain( e );
5235             efgh1.addProteinDomain( f );
5236             efgh1.addProteinDomain( g );
5237             efgh1.addProteinDomain( h );
5238             final Protein lm1 = new BasicProtein( "lm1", "one", 0 );
5239             lm1.addProteinDomain( l );
5240             lm1.addProteinDomain( m );
5241             final Protein ab2 = new BasicProtein( "ab2", "two", 0 );
5242             ab2.addProteinDomain( a );
5243             ab2.addProteinDomain( b );
5244             final Protein ac2 = new BasicProtein( "ac2", "two", 0 );
5245             ac2.addProteinDomain( a );
5246             ac2.addProteinDomain( c );
5247             final Protein efgi2 = new BasicProtein( "efgi2", "two", 0 );
5248             efgi2.addProteinDomain( e );
5249             efgi2.addProteinDomain( f );
5250             efgi2.addProteinDomain( g );
5251             efgi2.addProteinDomain( i );
5252             final Protein no2 = new BasicProtein( "no2", "two", 0 );
5253             no2.addProteinDomain( n );
5254             no2.addProteinDomain( o );
5255             final Protein ab3 = new BasicProtein( "ab3", "three", 0 );
5256             ab3.addProteinDomain( a );
5257             ab3.addProteinDomain( b );
5258             final Protein ad3 = new BasicProtein( "ad3", "three", 0 );
5259             ad3.addProteinDomain( a );
5260             ad3.addProteinDomain( d );
5261             final Protein efgj3 = new BasicProtein( "efgj3", "three", 0 );
5262             efgj3.addProteinDomain( e );
5263             efgj3.addProteinDomain( f );
5264             efgj3.addProteinDomain( g );
5265             efgj3.addProteinDomain( j );
5266             final Protein pq3 = new BasicProtein( "pq3", "three", 0 );
5267             pq3.addProteinDomain( p );
5268             pq3.addProteinDomain( q );
5269             final Protein ab4 = new BasicProtein( "ab4", "four", 0 );
5270             ab4.addProteinDomain( a );
5271             ab4.addProteinDomain( b );
5272             final Protein ad4 = new BasicProtein( "ad4", "four", 0 );
5273             ad4.addProteinDomain( a );
5274             ad4.addProteinDomain( d );
5275             final Protein pr4 = new BasicProtein( "pr4", "four", 0 );
5276             pr4.addProteinDomain( p );
5277             pr4.addProteinDomain( r );
5278             final List<Protein> one_list = new ArrayList<Protein>();
5279             one_list.add( aa1 );
5280             one_list.add( ab1 );
5281             one_list.add( ac1 );
5282             one_list.add( efgh1 );
5283             one_list.add( lm1 );
5284             final List<Protein> two_list = new ArrayList<Protein>();
5285             two_list.add( ab2 );
5286             two_list.add( ac2 );
5287             two_list.add( efgi2 );
5288             two_list.add( no2 );
5289             final List<Protein> three_list = new ArrayList<Protein>();
5290             three_list.add( ab3 );
5291             three_list.add( ad3 );
5292             three_list.add( efgj3 );
5293             three_list.add( pq3 );
5294             final List<Protein> four_list = new ArrayList<Protein>();
5295             four_list.add( ab4 );
5296             four_list.add( ad4 );
5297             four_list.add( pr4 );
5298             final GenomeWideCombinableDomains one = BasicGenomeWideCombinableDomains
5299                     .createInstance( one_list, false, new BasicSpecies( "one" ) );
5300             final GenomeWideCombinableDomains two = BasicGenomeWideCombinableDomains
5301                     .createInstance( two_list, false, new BasicSpecies( "two" ) );
5302             final GenomeWideCombinableDomains three = BasicGenomeWideCombinableDomains
5303                     .createInstance( three_list, false, new BasicSpecies( "three" ) );
5304             final GenomeWideCombinableDomains four = BasicGenomeWideCombinableDomains
5305                     .createInstance( four_list, false, new BasicSpecies( "four" ) );
5306             final List<GenomeWideCombinableDomains> gwcd_list = new ArrayList<GenomeWideCombinableDomains>();
5307             gwcd_list.add( one );
5308             gwcd_list.add( two );
5309             gwcd_list.add( three );
5310             gwcd_list.add( four );
5311             final Map<String, Set<String>> map_same = new HashMap<String, Set<String>>();
5312             final HashSet<String> a_s = new HashSet<String>();
5313             a_s.add( "AAA" );
5314             final HashSet<String> b_s = new HashSet<String>();
5315             b_s.add( "BBB" );
5316             final HashSet<String> c_s = new HashSet<String>();
5317             c_s.add( "CCC" );
5318             final HashSet<String> d_s = new HashSet<String>();
5319             d_s.add( "DDD" );
5320             final HashSet<String> e_s = new HashSet<String>();
5321             e_s.add( "EEE" );
5322             final HashSet<String> f_s = new HashSet<String>();
5323             f_s.add( "FFF" );
5324             final HashSet<String> g_s = new HashSet<String>();
5325             g_s.add( "GGG" );
5326             final HashSet<String> h_s = new HashSet<String>();
5327             h_s.add( "HHH" );
5328             final HashSet<String> i_s = new HashSet<String>();
5329             i_s.add( "III" );
5330             final HashSet<String> j_s = new HashSet<String>();
5331             j_s.add( "JJJ" );
5332             final HashSet<String> l_s = new HashSet<String>();
5333             l_s.add( "LLL" );
5334             final HashSet<String> m_s = new HashSet<String>();
5335             m_s.add( "MMM" );
5336             final HashSet<String> n_s = new HashSet<String>();
5337             n_s.add( "NNN" );
5338             final HashSet<String> o_s = new HashSet<String>();
5339             o_s.add( "OOO" );
5340             final HashSet<String> p_s = new HashSet<String>();
5341             p_s.add( "PPP" );
5342             final HashSet<String> q_s = new HashSet<String>();
5343             q_s.add( "QQQ" );
5344             final HashSet<String> r_s = new HashSet<String>();
5345             r_s.add( "RRR" );
5346             map_same.put( a.getDomainId(), a_s );
5347             map_same.put( b.getDomainId(), b_s );
5348             map_same.put( c.getDomainId(), c_s );
5349             map_same.put( d.getDomainId(), d_s );
5350             map_same.put( e.getDomainId(), e_s );
5351             map_same.put( f.getDomainId(), f_s );
5352             map_same.put( g.getDomainId(), g_s );
5353             map_same.put( h.getDomainId(), h_s );
5354             map_same.put( i.getDomainId(), i_s );
5355             map_same.put( j.getDomainId(), j_s );
5356             map_same.put( l.getDomainId(), l_s );
5357             map_same.put( m.getDomainId(), m_s );
5358             map_same.put( n.getDomainId(), n_s );
5359             map_same.put( o.getDomainId(), o_s );
5360             map_same.put( p.getDomainId(), p_s );
5361             map_same.put( q.getDomainId(), q_s );
5362             map_same.put( r.getDomainId(), r_s );
5363             final CharacterStateMatrix<BinaryStates> matrix_s = DomainParsimonyCalculator
5364                     .createMatrixOfSecondaryFeaturePresenceOrAbsence( gwcd_list, map_same, null );
5365             // 1 a b c e f g h l m
5366             // 2 a b c e f g i n o
5367             // 3 a b d e f g j p q
5368             // 4 a b d p r
5369             if ( matrix_s.getState( 0, 0 ) != X ) {
5370                 return false;
5371             }
5372             if ( matrix_s.getState( 0, 1 ) != X ) {
5373                 return false;
5374             }
5375             if ( matrix_s.getState( 0, 2 ) != X ) {
5376                 return false;
5377             }
5378             if ( matrix_s.getState( 0, 3 ) != O ) {
5379                 return false;
5380             }
5381             if ( matrix_s.getState( 0, 4 ) != X ) {
5382                 return false;
5383             }
5384             if ( matrix_s.getState( 0, 5 ) != X ) {
5385                 return false;
5386             }
5387             if ( matrix_s.getState( 0, 6 ) != X ) {
5388                 return false;
5389             }
5390             if ( matrix_s.getState( 0, 7 ) != X ) {
5391                 return false;
5392             }
5393             if ( matrix_s.getState( 0, 8 ) != O ) {
5394                 return false;
5395             }
5396             final PhylogenyFactory factory0 = ParserBasedPhylogenyFactory.getInstance();
5397             final String p0_str = "((one,two)1-2,(three,four)3-4)root";
5398             final Phylogeny p0 = factory0.create( p0_str, new NHXParser() )[ 0 ];
5399             final DomainParsimonyCalculator dp0 = DomainParsimonyCalculator.createInstance( p0, gwcd_list, map_same );
5400             dp0.executeDolloParsimonyOnSecondaryFeatures( null );
5401             final CharacterStateMatrix<GainLossStates> gl_matrix_d = dp0.getGainLossMatrix();
5402             final CharacterStateMatrix<BinaryStates> is_matrix_d = dp0.getInternalStatesMatrix();
5403             if ( is_matrix_d.getState( "root", "AAA" ) != X ) {
5404                 return false;
5405             }
5406             if ( is_matrix_d.getState( "root", "BBB" ) != X ) {
5407                 return false;
5408             }
5409             if ( is_matrix_d.getState( "root", "CCC" ) != O ) {
5410                 return false;
5411             }
5412             if ( is_matrix_d.getState( "root", "DDD" ) != O ) {
5413                 return false;
5414             }
5415             if ( is_matrix_d.getState( "root", "EEE" ) != X ) {
5416                 return false;
5417             }
5418             if ( gl_matrix_d.getState( "3-4", "PPP" ) != G ) {
5419                 return false;
5420             }
5421         }
5422         catch ( final Exception e ) {
5423             e.printStackTrace( System.out );
5424             return false;
5425         }
5426         return true;
5427     }
5428
5429    
5430 }