package aliview.gui.pane;
import org.apache.log4j.Logger;
import aliview.NucleotideUtilities;
import aliview.alignment.Alignment;
import aliview.alignment.NucleotideHistogram;
import aliview.sequences.Sequence;
public class SequencePainterNucleotide extends SequencePainter {
private static final Logger logger = Logger.getLogger(SequencePainterNucleotide.class);
public SequencePainterNucleotide(Sequence seq, int seqYPos, int clipPosY,
int xMinSeqPos, int xMaxSeqPos, double step, double charWidth,
double charHeight, double highDPIScaleFactor, RGBArray clipRGB,
AlignmentPane aliPane, Alignment alignment) {
super(seq, seqYPos, clipPosY, xMinSeqPos, xMaxSeqPos, step, charWidth,
charHeight, highDPIScaleFactor, clipRGB, aliPane, alignment);
// TODO Auto-generated constructor stub
}
@Override
protected void copyPixels(Sequence seq, RGBArray clipArray, int seqXPos, int seqYPos, int pixelPosX, int pixelPosY, AlignmentPane aliPane, Alignment alignment){
byte residue = seq.getBaseAtPos(seqXPos);
// A small hack
if(residue == 0){
residue = ' ';
}
// set defaults
CharPixelsContainer pixContainerToUse = aliPane.charPixDefaultNuc;
byte byteToDraw = residue;
int baseVal = NucleotideUtilities.baseValFromBase(residue);
// adjustment if only diff to be shown
if(aliPane.isHighlightDiffTrace()){ // TODO CHANGE THIS SO IT IS WORKING EVEN IF TRACING SEQUENCE IS SHORTER THAN OTHER
if(seqYPos != aliPane.differenceTraceSequencePosition){
if(baseVal == NucleotideUtilities.baseValFromBase(alignment.getBaseAt(seqXPos,aliPane.getDifferenceTraceSequencePosition()))){
byteToDraw = '.';
pixContainerToUse = aliPane.charPixDefaultNuc;
}
}
}
// adjustment if non-cons to be highlighted
if(aliPane.isHighlightNonCons()){
NucleotideHistogram nucHistogram = (NucleotideHistogram) alignment.getHistogram();
if(baseVal == NucleotideUtilities.GAP){
// no color on gap even if they are in maj.cons
}
else if(nucHistogram.isMajorityRuleConsensus(seqXPos,baseVal)){
pixContainerToUse = aliPane.charPixConsensusNuc;
}
}
if(aliPane.highlightCons){
NucleotideHistogram nucHistogram = (NucleotideHistogram) alignment.getHistogram();
if(baseVal == NucleotideUtilities.GAP){
// no color on gap even if they are in maj.cons
}
else if(! nucHistogram.isMajorityRuleConsensus(seqXPos,baseVal)){
pixContainerToUse = aliPane.charPixConsensusNuc;
}
}
// adjust colors if selected and temp selection
// We have to calculate within this way - because rect.contains(Point) is always returning false on a 0-width or 0 height Rectangle
boolean isPointWithinSelectionRect = false;
if(alignment.getTempSelection() != null){
if(seqXPos <= alignment.getTempSelection().getMaxX() && seqXPos >= alignment.getTempSelection().getMinX() && seqYPos <= alignment.getTempSelection().getMaxY() && seqYPos >= alignment.getTempSelection().getMinY()){
isPointWithinSelectionRect = true;
}
}
if(seq.isBaseSelected(seqXPos) || (alignment.getTempSelection() != null && isPointWithinSelectionRect)){
pixContainerToUse = aliPane.charPixSelectedNuc;
}
RGBArray newPiece = pixContainerToUse.getRGBArray(byteToDraw);
try {
ImageUtils.insertRGBArrayAt(pixelPosX, pixelPosY, newPiece, clipArray);
} catch (Exception e) {
logger.info("x" + seqXPos);
logger.info("y" + seqYPos);
logger.info("clipX" + pixelPosX);
logger.info("clipY" + pixelPosY);
//break;
}
}
}