JAL-3210 Improvements to eclipse detection. New src tree and SwingJS updated from...
[jalview.git] / src / jalview / analysis / scoremodels / SimilarityParams.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.analysis.scoremodels;
22
23 import jalview.api.analysis.SimilarityParamsI;
24
25 /**
26  * A class to hold parameters that configure the pairwise similarity
27  * calculation. Based on the paper
28  * 
29  * <pre>
30  * Quantification of the variation in percentage identity for protein sequence alignments
31  * Raghava, GP and Barton, GJ
32  * BMC Bioinformatics. 2006 Sep 19;7:415
33  * </pre>
34  * 
35  * @see https://www.ncbi.nlm.nih.gov/pubmed/16984632
36  */
37 public class SimilarityParams implements SimilarityParamsI
38 {
39   /**
40    * Based on Jalview's Comparison.PID method, which includes gaps and counts
41    * them as matching; it counts over the length of the shorter sequence
42    */
43   public static final SimilarityParamsI Jalview = new SimilarityParams(true,
44           true, true, true);
45
46   /**
47    * 'SeqSpace' mode PCA calculation includes gaps but does not count them as
48    * matching; it uses the longest sequence length
49    */
50   public static final SimilarityParamsI SeqSpace = new SimilarityParams(
51           true, false, true, true);
52
53   /**
54    * as described in the Raghava-Barton paper
55    * <ul>
56    * <li>ignores gap-gap</li>
57    * <li>does not score gap-residue</li>
58    * <li>includes gap-residue in lengths</li>
59    * <li>matches on longer of two sequences</li>
60    * </ul>
61    */
62   public static final SimilarityParamsI PID1 = new SimilarityParams(false,
63           false, true, false);
64
65   /**
66    * as described in the Raghava-Barton paper
67    * <ul>
68    * <li>ignores gap-gap</li>
69    * <li>ignores gap-residue</li>
70    * <li>matches on longer of two sequences</li>
71    * </ul>
72    */
73   public static final SimilarityParamsI PID2 = new SimilarityParams(false,
74           false, false, false);
75
76   /**
77    * as described in the Raghava-Barton paper
78    * <ul>
79    * <li>ignores gap-gap</li>
80    * <li>ignores gap-residue</li>
81    * <li>matches on shorter of sequences only</li>
82    * </ul>
83    */
84   public static final SimilarityParamsI PID3 = new SimilarityParams(false,
85           false, false, true);
86
87   /**
88    * as described in the Raghava-Barton paper
89    * <ul>
90    * <li>ignores gap-gap</li>
91    * <li>does not score gap-residue</li>
92    * <li>includes gap-residue in lengths</li>
93    * <li>matches on shorter of sequences only</li>
94    * </ul>
95    */
96   public static final SimilarityParamsI PID4 = new SimilarityParams(false,
97           false, true, true);
98
99   private boolean includeGappedColumns;
100
101   private boolean matchGaps;
102
103   private boolean includeGaps;
104
105   private boolean denominateByShortestLength;
106
107
108   /**
109    * Constructor
110    * 
111    * @param includeGapGap
112    * @param matchGapResidue
113    * @param includeGapResidue
114    *          if true, gapped positions are counted for normalisation by length
115    * @param shortestLength
116    *          if true, the denominator is the shorter sequence length (possibly
117    *          including gaps)
118    */
119   public SimilarityParams(boolean includeGapGap, boolean matchGapResidue,
120           boolean includeGapResidue, boolean shortestLength)
121   {
122     includeGappedColumns = includeGapGap;
123     matchGaps = matchGapResidue;
124     includeGaps = includeGapResidue;
125     denominateByShortestLength = shortestLength;
126   }
127
128   /**
129    * BH added a non-Groovy "standard" set for JalviewJS
130    * 
131    * @param isPCA
132    */
133   public SimilarityParams(boolean isPCA)
134   {
135     includeGappedColumns = true;
136     matchGaps = !isPCA;
137     includeGaps = true;
138     denominateByShortestLength = false;
139   }
140
141   @Override
142   public boolean includeGaps()
143   {
144     return includeGaps;
145   }
146
147   @Override
148   public boolean denominateByShortestLength()
149   {
150     return denominateByShortestLength;
151   }
152
153   @Override
154   public boolean includeGappedColumns()
155   {
156     return includeGappedColumns;
157   }
158
159   @Override
160   public boolean matchGaps()
161   {
162     return matchGaps;
163   }
164
165   /**
166    * IDE-generated hashCode method
167    */
168   @Override
169   public int hashCode()
170   {
171     final int prime = 31;
172     int result = 1;
173     result = prime * result + (denominateByShortestLength ? 1231 : 1237);
174     result = prime * result + (includeGappedColumns ? 1231 : 1237);
175     result = prime * result + (includeGaps ? 1231 : 1237);
176     result = prime * result + (matchGaps ? 1231 : 1237);
177     return result;
178   }
179
180   /**
181    * IDE-generated equals method
182    */
183   @Override
184   public boolean equals(Object obj)
185   {
186     if (this == obj)
187     {
188       return true;
189     }
190     if (obj == null)
191     {
192       return false;
193     }
194     if (getClass() != obj.getClass())
195     {
196       return false;
197     }
198     SimilarityParams other = (SimilarityParams) obj;
199     if (denominateByShortestLength != other.denominateByShortestLength)
200     {
201       return false;
202     }
203     if (includeGappedColumns != other.includeGappedColumns)
204     {
205       return false;
206     }
207     if (includeGaps != other.includeGaps)
208     {
209       return false;
210     }
211     if (matchGaps != other.matchGaps)
212     {
213       return false;
214     }
215     return true;
216   }
217 }