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