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