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