/*******************************************************************************
* Copyright (c)                                                                *
*           2005   Tristan Allwood,                                            *
*           2005   Daniel Burke,                                               *
*           2005   Marc Hull,                                                  *
*           2005   Ekaterina Itskova,                                          *
*           2005   Steve Zymler                                                *
*                                                                              *
* Permission is hereby granted, free of charge, to any person obtaining a      *
* copy of this software and associated documentation files (the                *
* "Software"), to deal in the Software without restriction, including          *
* without limitation the rights to use, copy, modify, merge, publish,          *
* distribute, sublicense, and/or sell copies of the Software, and to           *
* permit persons to whom the Software is furnished to do so, subject to        *
* the following conditions:                                                    *
*                                                                              *
* The above copyright notice and this permission notice shall be included      *
* in all copies or substantial portions of the Software.                       *
*                                                                              *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS      *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF                   *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.       *
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY         *
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,         *
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE            *
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                       *
*******************************************************************************/
/*
 * Created on 17-Nov-2004
 *
 */
package uk.ac.ic.doc.kevlar.publicUtil.strings;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Daniel Burke
 *
 */
public class NeedlemanScoringScheme {

    // Matrix for finding the alignment score of one character with another
    private Map<Character, Map<Character, Integer>> scores;
    private int defaultEqualScore;
    private int defaultNotEqualScore;
    private int gapOpenScore;
    private int gapExtendScore;
    
    /**
     * @param scores
     * @param defaultEqualScore
     * @param defaultNotEqualScore
     * @param gapOpenScore
     * @param gapExtendScore
     */
    public NeedlemanScoringScheme(
            Map<Character, Map<Character, Integer>> scores,
            int defaultEqualScore,
            int defaultNotEqualScore,
            int gapOpenScore, 
            int gapExtendScore) {
        super();
        
        if(scores == null)
        {
            this.scores = new HashMap<Character, Map<Character, Integer>>();
        }
        else
        {
            this.scores = 
                new HashMap<Character, Map<Character, Integer>>(defaultEqualScore);
        }
        
        this.defaultEqualScore = defaultEqualScore;          
        this.defaultNotEqualScore = defaultNotEqualScore;
        this.gapOpenScore = gapOpenScore;
        this.gapExtendScore = gapExtendScore;
    }
    
    int getScore(char a, char b)
    {
        Character valueOfA = Character.valueOf(a);
        Character valueOfB = Character.valueOf(b);
        
        boolean scoresHasA = false;
        if(scores.containsKey(valueOfA))
        {
            scoresHasA = true;
        }
        else if(scores.containsKey(valueOfB))
        {
            char temp = b;
            b = a;
            a = temp;
            
            scoresHasA = true;
        }
        
        if(!scoresHasA)
        {
            return a == b ? defaultEqualScore : defaultNotEqualScore;
        }
        
        Integer score = scores.get(valueOfA).get(valueOfB);
        if(score == null)
        {
            return a == b ? defaultEqualScore : defaultNotEqualScore;   
        }
        
        return score.intValue();
    }
    
    int getGapExtendScore() {
        return gapExtendScore;
    }
    
    int getGapOpenScore() {
        return gapOpenScore;
    }
}

