001 /*
002 * ScoringScheme.java
003 *
004 * Copyright 2003 Sergio Anibal de Carvalho Junior
005 *
006 * This file is part of NeoBio.
007 *
008 * NeoBio is free software; you can redistribute it and/or modify it under the terms of
009 * the GNU General Public License as published by the Free Software Foundation; either
010 * version 2 of the License, or (at your option) any later version.
011 *
012 * NeoBio is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
013 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
014 * PURPOSE. See the GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License along with NeoBio;
017 * if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
018 * Boston, MA 02111-1307, USA.
019 *
020 * Proper attribution of the author as the source of the software would be appreciated.
021 *
022 * Sergio Anibal de Carvalho Junior mailto:sergioanibaljr@users.sourceforge.net
023 * Department of Computer Science http://www.dcs.kcl.ac.uk
024 * King's College London, UK http://www.kcl.ac.uk
025 *
026 * Please visit http://neobio.sourceforge.net
027 *
028 * This project was supervised by Professor Maxime Crochemore.
029 *
030 */
031
032 package neobio.alignment;
033
034 /**
035 * This abstract class is the superclass of all scoring schemes. It defines basic
036 * operations that must be provided by all subclasses. Scoring schemes are used by
037 * sequence alignment algorithms to compute the score of an alignment.
038 *
039 * @author Sergio A. de Carvalho Jr.
040 * @see PairwiseAlignmentAlgorithm
041 */
042 public abstract class ScoringScheme
043 {
044 /**
045 * Determines whether this scoring scheme ignores the case of characters when
046 * computing their score. It is set by the constructor and cannot be changed
047 * afterwards.
048 */
049 protected boolean case_sensitive;
050
051 /**
052 * Creates a new instance of an scoring scheme. The case of characters is significant
053 * when subsequently computing their score.
054 */
055 public ScoringScheme ()
056 {
057 this (true);
058 }
059
060 /**
061 * Creates a new instance of an scoring scheme. If <CODE>case_sensitive</CODE> is
062 * <CODE>true</CODE>, the case of characters is significant when subsequently
063 * computing their score; otherwise the case is ignored.
064 *
065 * @param case_sensitive <CODE>true</CODE> if the case of characters must be
066 * significant, <CODE>false</CODE> otherwise
067 */
068 public ScoringScheme (boolean case_sensitive)
069 {
070 this.case_sensitive = case_sensitive;
071 }
072
073 /**
074 * Tells whether this scoring scheme ignores the case of characters when computing
075 * their score.
076 *
077 * @return <CODE>true</CODE> if the case of characters is significant,
078 * <CODE>false</CODE> otherwise
079 */
080 public boolean isCaseSensitive ()
081 {
082 return this.case_sensitive;
083 }
084
085 /**
086 * Returns the score of a substitution of character <CODE>a</CODE> for character
087 * <CODE>b</CODE> according to this scoring scheme. If this substitution is not
088 * defined, an exception is raised.
089 *
090 * @param a first character
091 * @param b second character
092 * @return score of substitution of <CODE>a</CODE> for <CODE>b</CODE>
093 * @throws IncompatibleScoringSchemeException if this substitution is not defined
094 */
095 public abstract int scoreSubstitution (char a, char b)
096 throws IncompatibleScoringSchemeException;
097
098 /**
099 * Returns the score of an insertion of character <CODE>a</CODE> according to this
100 * scoring scheme. If this character is not recognised, an exception is raised.
101 *
102 * @param a the character to be inserted
103 * @return score of insertion of <CODE>a</CODE>
104 * @throws IncompatibleScoringSchemeException if character is not recognised by this
105 * scoring scheme
106 */
107 public abstract int scoreInsertion (char a)
108 throws IncompatibleScoringSchemeException;
109
110 /**
111 * Returns the score of a deletion of character <CODE>a</CODE> according to this
112 * scoring scheme. If this character is not recognised, an exception is raised.
113 *
114 * @param a the character to be deleted
115 * @return score of insertion of <CODE>a</CODE>
116 * @throws IncompatibleScoringSchemeException if character is not recognised by this
117 * scoring scheme
118 */
119 public abstract int scoreDeletion (char a)
120 throws IncompatibleScoringSchemeException;
121
122 /**
123 * Returns the maximum absolute score that this scoring scheme can return for any
124 * substitution, deletion or insertion.
125 *
126 * @return maximum absolute score that can be returned
127 */
128 public abstract int maxAbsoluteScore ();
129
130 /**
131 * Returns <CODE>true</CODE> if this scoring scheme supports partial matches,
132 * <CODE>false</CODE> otherwise. A partial match is a situation when two characters
133 * are not equal but, for any reason, are regarded as similar by this scoring scheme,
134 * which then returns a positive score. This is common when for scoring schemes
135 * that implement amino acid scoring matrices.
136 *
137 * @return <CODE>true</CODE> if this scoring scheme supports partial matches,
138 * <CODE>false</CODE> otherwise
139 */
140 public abstract boolean isPartialMatchSupported ();
141 }