/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.schemes;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.AnnotatedCollectionI;
import jalview.datamodel.Annotation;
import jalview.datamodel.SequenceCollectionI;
import jalview.datamodel.SequenceI;
import jalview.io.TCoffeeScoreFile;
import java.awt.Color;
import java.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
/**
* Defines the color score for T-Coffee MSA
*
* See http://tcoffee.org
*
*
* @author Paolo Di Tommaso
*
*/
public class TCoffeeColourScheme extends ResidueColourScheme
{
IdentityHashMap seqMap;
/**
* Default constructor (required for Class.newInstance())
*/
public TCoffeeColourScheme()
{
}
/**
* the color scheme needs to look at the alignment to get and cache T-COFFEE
* scores
*
* @param alignment
* - annotated sequences to be searched
*/
public TCoffeeColourScheme(AnnotatedCollectionI alignment)
{
alignmentChanged(alignment, null);
}
/**
* Finds the TCoffeeScore annotation (if any) for each sequence and notes the
* annotation colour for each column position. The colours are fixed for
* scores 0-9 and are set when annotation is parsed.
*
* @see TCoffeeScoreFile#annotateAlignment(AlignmentI, boolean)
*/
@Override
public void alignmentChanged(AnnotatedCollectionI alignment,
Map hiddenReps)
{
// TODO: if sequences have been represented and they have scores, could
// compute an average sequence score for the representative
// assume only one set of TCOFFEE scores - but could have more than one
// potentially.
List annots = new ArrayList();
// Search alignment to get all tcoffee annotation and pick one set of
// annotation to use to colour seqs.
seqMap = new IdentityHashMap();
AnnotatedCollectionI alcontext = alignment instanceof AlignmentI
? alignment
: alignment.getContext();
if (alcontext == null)
{
return;
}
int w = 0;
for (AlignmentAnnotation al : alcontext
.findAnnotation(TCoffeeScoreFile.TCOFFEE_SCORE))
{
if (al.sequenceRef != null && !al.belowAlignment)
{
annots.add(al);
if (w < al.annotations.length)
{
w = al.annotations.length;
}
Color[] scores = new Color[al.annotations.length];
int i = 0;
for (Annotation an : al.annotations)
{
scores[i++] = (an != null) ? an.colour : Color.white;
}
seqMap.put(al.sequenceRef, scores);
}
}
// TODO: compute average colour for each symbol type in each column - gives
// a second order colourscheme for colouring a sequence logo derived from
// the alignment (colour reflects quality of alignment for each residue
// class)
}
@Override
public Color findColour(char c, int j, SequenceI seq)
{
if (seqMap == null)
{
return Color.WHITE;
}
Color[] cols = seqMap.get(seq);
if (cols == null)
{
// see above TODO about computing a colour for each residue in each
// column: cc = _rcols[i][indexFor[c]];
return Color.white;
}
if (j < 0 || j >= cols.length)
{
return Color.white;
}
return cols[j];
}
@Override
public ColourSchemeI getInstance(AnnotatedCollectionI sg,
Map hiddenRepSequences)
{
return new TCoffeeColourScheme(sg);
}
/**
* Answers true if the data has TCoffee score annotation
*/
@Override
public boolean isApplicableTo(AnnotatedCollectionI ac)
{
AnnotatedCollectionI alcontext = ac instanceof AlignmentI ? ac
: ac.getContext();
if (alcontext == null)
{
return false;
}
Iterable anns = alcontext
.findAnnotation(TCoffeeScoreFile.TCOFFEE_SCORE);
return anns.iterator().hasNext();
}
@Override
public String getSchemeName()
{
return JalviewColourScheme.TCoffee.toString();
}
@Override
public boolean isSimple()
{
return false;
}
}