/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* 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.
*/
package org.broad.igv.sam;
import org.broad.igv.feature.LocusScore;
import org.broad.igv.feature.Strand;
import org.broad.igv.track.WindowFunction;
import java.awt.*;
import java.util.List;
/**
* @author jrobinso
* @date Jan 26, 2011
*/
public class PairedAlignment implements Alignment {
String readName;
String chr;
int start;
int end;
Alignment firstAlignment;
Alignment secondAlignment;
public PairedAlignment(Alignment firstAlignment) {
this.firstAlignment = firstAlignment;
this.start = firstAlignment.getStart();
this.end = firstAlignment.getEnd();
this.chr = firstAlignment.getChr();
}
public void setSecondAlignment(Alignment alignment) {
secondAlignment = alignment;
end = secondAlignment.getEnd();
// TODO -- check the chrs are equal, error otherwise
}
public String getReadName() {
return readName;
}
public String getChromosome() {
return chr; //To change body of implemented methods use File | Settings | File Templates.
}
public String getChr() {
return chr; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public String getContig() {
return chr;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
public int getAlignmentStart() {
return start;
}
public boolean isMapped() {
return true;
}
public AlignmentBlock[] getAlignmentBlocks() {
return new AlignmentBlockImpl[0]; //To change body of implemented methods use File | Settings | File Templates.
}
AlignmentBlock[] insertions;
public AlignmentBlock[] getInsertions() {
if (insertions == null) {
AlignmentBlock[] block1 = firstAlignment.getInsertions();
if (secondAlignment == null) {
insertions = block1;
} else {
AlignmentBlock[] block2 = secondAlignment.getInsertions();
insertions = new AlignmentBlockImpl[block1.length + block2.length];
System.arraycopy(block1, 0, insertions, 0, block1.length);
System.arraycopy(block2, 0, insertions, block1.length, block2.length);
}
}
return insertions;
}
@Override
public List<Gap> getGaps() {
return null;
}
public int getInferredInsertSize() {
return Math.abs(firstAlignment.getInferredInsertSize());
}
public int getMappingQuality() {
if (secondAlignment == null) {
return firstAlignment.getMappingQuality();
} else {
return Math.max(firstAlignment.getMappingQuality(), secondAlignment.getMappingQuality());
}
}
public boolean isDuplicate() {
return firstAlignment.isDuplicate() &&
(secondAlignment == null || secondAlignment.isDuplicate());
}
public boolean isProperPair() {
return true; //
}
public int getAlignmentEnd() {
return end; //To change body of implemented methods use File | Settings | File Templates.
}
public byte getBase(double position) {
if (firstAlignment.contains(position)) {
return firstAlignment.getBase(position);
} else if (secondAlignment != null && secondAlignment.contains(position)) {
return secondAlignment.getBase(position);
}
return 0;
}
public byte getPhred(double position) {
if (firstAlignment.contains(position)) {
return firstAlignment.getPhred(position);
} else if (secondAlignment != null && secondAlignment.contains(position)) {
return secondAlignment.getPhred(position);
}
return 0;
}
/**
* Return a string to be used for popup text. The WindowFunction is passed
* in so it can be used t annotate the value. The LocusScore object itself
* does not "know" from what window function it was derived
*
* @param mouseX
* @param windowFunction
* @return
*/
public String getValueString(double position, int mouseX, WindowFunction windowFunction) {
StringBuffer buf = new StringBuffer();
if (secondAlignment != null) {
buf.append("<table><tr><td valign=\"top\">");
}
buf.append("<b>Left alignment</b><br/>");
buf.append(firstAlignment.getValueString(position, mouseX, windowFunction));
if (secondAlignment != null) {
buf.append("</td><td valign=\"top\">");
buf.append("<b>Right alignment</b><br/>");
buf.append(secondAlignment.getValueString(position, mouseX, windowFunction));
buf.append("</td></tr></table>");
}
return buf.toString();
}
public String getClipboardString(double position, int mouseX) {
StringBuffer buf = new StringBuffer();
buf.append("<b>Left alignment</b><br/>");
buf.append(firstAlignment.getClipboardString(position, mouseX));
if (secondAlignment != null) {
buf.append("<br/><b>Right alignment</b><br/>");
buf.append(secondAlignment.getClipboardString(position, mouseX));
}
return buf.toString();
}
////////////////////////////////////////////////////////////
public boolean contains(double location) {
return location >= start && location <= end;
}
public String getReadSequence() {
return null;
}
public String getCigarString() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public ReadMate getMate() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public boolean isPaired() {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
public boolean isNegativeStrand() {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
public String getSample() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public String getReadGroup() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public Object getAttribute(String key) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public void setMateSequence(String sequence) {
//To change body of implemented methods use File | Settings | File Templates.
}
public String getPairOrientation() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public boolean isSmallInsert() {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
public boolean isVendorFailedRead() {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
public Color getColor() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public String getLibrary() {
return firstAlignment.getLibrary();
}
public void setStart(int start) {
//To change body of implemented methods use File | Settings | File Templates.
}
public void setEnd(int end) {
//To change body of implemented methods use File | Settings | File Templates.
}
public float getScore() {
return 0; //To change body of implemented methods use File | Settings | File Templates.
}
public LocusScore copy() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public Alignment getFirstAlignment() {
return firstAlignment;
}
public Alignment getSecondAlignment() {
return secondAlignment;
}
public boolean isFirstOfPair() {
return false;
}
public boolean isSecondOfPair() {
return false;
}
public Strand getFirstOfPairStrand() {
return firstAlignment.getFirstOfPairStrand();
}
public Strand getSecondOfPairStrand() {
return firstAlignment.getSecondOfPairStrand();
}
public Strand getReadStrand() {
return isNegativeStrand() ? Strand.NEGATIVE : Strand.POSITIVE;
}
@Override
public void finish() {
firstAlignment.finish();
if(secondAlignment != null) {
secondAlignment.finish();
}
}
@Override
public boolean isPrimary() {
return firstAlignment.isPrimary() && (secondAlignment == null || secondAlignment.isPrimary());
}
@Override
public boolean isSupplementary() {
return firstAlignment.isSupplementary() && (secondAlignment == null || secondAlignment.isSupplementary());
}
}