Skip to content

Commit

Permalink
Add options to group and shade by mapping quality (#1165)
Browse files Browse the repository at this point in the history
* Add options to group and shade by mapping quality

* add a new grouping option to group by mapping quality

* added a new "shading" submenu to allow shading alignments by mapping quality.
  Shading can highlight either high or low mapping qualities.
  New configuration options allow setting the high/low map quality categories, they default to 60/0

* closes #1110 and #1112

Co-authored-by: jrobinso <933148+jrobinso@users.noreply.github.com>
  • Loading branch information
lbergelson and jrobinso committed Jul 11, 2022
1 parent 1dbcb47 commit 38f2724
Show file tree
Hide file tree
Showing 9 changed files with 188 additions and 41 deletions.
8 changes: 7 additions & 1 deletion src/main/java/org/broad/igv/prefs/Constants.java
Expand Up @@ -104,6 +104,9 @@ private Constants() {
public static final String SAM_ALLELE_THRESHOLD = "SAM.ALLELE_THRESHOLD";
public static final String SAM_ALLELE_USE_QUALITY = "SAM.ALLELE_USE_QUALITY";
public static final String SAM_QUALITY_THRESHOLD = "SAM.QUALITY_THRESHOLD";
public static final String SAM_SHADE_QUALITY_LOW = "SAM.SHADE_QUALITY_LOW";
public static final String SAM_SHADE_QUALITY_HIGH = "SAM.SHADE_QUALITY_HIGH";
public static final String SAM_SHADE_ALIGNMENT_BY = "SAM.SHADE_ALIGNMENT_BY";
public static final String SAM_ALIGNMENT_SCORE_THRESHOLD = "SAM.ALIGNMENT_SCORE_THRESHOLD";
public static final String SAM_BASEMOD_THRESHOLD = "SAM.BASEMOD_THRESHOLD";
public static final String SAM_COMPUTE_ISIZES = "SAM.COMPUTE_ISIZES";
Expand Down Expand Up @@ -311,7 +314,10 @@ private Constants() {
SAM_LARGE_INDELS_THRESHOLD,
SAM_SHOW_INSERTION_MARKERS,
SAM_GROUP_OPTION,
SAM_GROUP_BY_TAG
SAM_GROUP_BY_TAG,
SAM_SHADE_QUALITY_LOW,
SAM_SHADE_QUALITY_HIGH,
SAM_SHADE_ALIGNMENT_BY
);

/**
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/org/broad/igv/sam/AlignmentPacker.java
Expand Up @@ -428,7 +428,7 @@ private Object getGroupValue(Alignment al, AlignmentTrack.RenderOptions renderOp
if (mate == null) {
return null;
}
if (mate.isMapped() == false) {
if (!mate.isMapped()) {
return "UNMAPPED";
} else {
return mate.getChr();
Expand Down Expand Up @@ -475,6 +475,8 @@ private Object getGroupValue(Alignment al, AlignmentTrack.RenderOptions renderOp
movieName = readNameParts[0];
zmw = readNameParts[1];
return movieName + "/" + zmw;
case MAPPING_QUALITY:
return al.getMappingQuality();
}
return null;
}
Expand Down
41 changes: 34 additions & 7 deletions src/main/java/org/broad/igv/sam/AlignmentRenderer.java
Expand Up @@ -25,6 +25,7 @@

package org.broad.igv.sam;

import com.google.common.primitives.Ints;
import org.broad.igv.Globals;
import org.broad.igv.feature.Strand;
import org.broad.igv.feature.genome.Genome;
Expand Down Expand Up @@ -1426,17 +1427,43 @@ private Color getAlignmentColor(Alignment alignment, AlignmentTrack track) {
}
if (c == null) c = defaultColor;

if (alignment.getMappingQuality() == 0 && renderOptions.isFlagZeroQualityAlignments()) {
// Maping Q = 0
float alpha = 0.15f;
// Assuming white background TODO -- this should probably be passed in
return ColorUtilities.getCompositeColor(Color.white, c, alpha);
}

c = shadeByMappingQuality(c, renderOptions, alignment.getMappingQuality());
return c;

}

private Color shadeByMappingQuality(final Color initialColor, final AlignmentTrack.RenderOptions renderOptions, final int mappingQuality) {
final float minAlpha = 0.15f;
final float maxAlpha = 1;
int maxMapQCutoff = renderOptions.getMappingQualityHigh();
int minMapQCutoff = renderOptions.getMappingQualityLow();
maxMapQCutoff = Ints.constrainToRange(maxMapQCutoff, 1, 255);
minMapQCutoff = Ints.constrainToRange(minMapQCutoff, 0, maxMapQCutoff - 1);

int clippedMQ = Ints.constrainToRange(mappingQuality, minMapQCutoff, maxMapQCutoff);
float alphaRange = maxAlpha - minAlpha;
float normalizedMQ = (float) (clippedMQ - minMapQCutoff) / (float) (maxMapQCutoff - minMapQCutoff);
// Assuming white background TODO -- this should probably be passed in
final Color backgroundColor = Color.white;

// MQ of zero has special meaning, and pre-empts shading by mapping quality if "flag zero quality" is set
if (mappingQuality == 0 && renderOptions.isFlagZeroQualityAlignments()) {
return ColorUtilities.getCompositeColor(backgroundColor, initialColor, minAlpha);
} else {
switch (renderOptions.getShadeAlignmentsOption()) {
case NONE:
return initialColor;
case MAPPING_QUALITY_LOW:
normalizedMQ = 1 - normalizedMQ; //invert this and fall through.
case MAPPING_QUALITY_HIGH:
float actualAlpha = minAlpha + alphaRange * normalizedMQ;
return ColorUtilities.getCompositeColor(backgroundColor, initialColor, actualAlpha);
default:
return initialColor;
}
}
}

private ColorTable getTenXColorTable(String group) {
ColorTable ctable;
if (group.equals("1")) {
Expand Down
89 changes: 85 additions & 4 deletions src/main/java/org/broad/igv/sam/AlignmentTrack.java
Expand Up @@ -119,6 +119,17 @@ public enum SortOption {
SUPPLEMENTARY, NONE, HAPLOTYPE, READ_ORDER, READ_NAME, ALIGNED_READ_LENGTH
}

public enum ShadeAlignmentsOption {
NONE("none"),
MAPPING_QUALITY_HIGH("mapping quality high"),
MAPPING_QUALITY_LOW("mapping quality low");

public final String label;
ShadeAlignmentsOption(String label) {
this.label = label;
}
}

public enum GroupOption {
STRAND("read strand"),
SAMPLE("sample"),
Expand All @@ -137,9 +148,10 @@ public enum GroupOption {
READ_ORDER("read order"),
LINKED("linked"),
PHASE("phase"),
REFERENCE_CONCORDANCE("reference concordance");
REFERENCE_CONCORDANCE("reference concordance"),
MAPPING_QUALITY("mapping quality");

public String label;
public final String label;

GroupOption(String label) {
this.label = label;
Expand Down Expand Up @@ -769,6 +781,7 @@ public void groupAlignments(GroupOption option, String tag, Range pos) {
}
renderOptions.setGroupByOption(option);
dataManager.packAlignments(renderOptions);
repaint();
}

public void setBisulfiteContext(BisulfiteContext option) {
Expand All @@ -785,6 +798,10 @@ public void setColorByTag(String tag) {
getPreferences(experimentType).put(SAM_COLOR_BY_TAG, tag);
}

public void setShadeAlignmentsOptions(ShadeAlignmentsOption option) {
renderOptions.setShadeAlignmentsOption(option);
}

public void packAlignments() {
dataManager.packAlignments(renderOptions);
}
Expand Down Expand Up @@ -1420,11 +1437,12 @@ class PopupMenu extends IGVPopupMenu {
// Linked read items
addLinkedReadItems();

// Group, sort, color, and pack
// Group, sort, color, shade, and pack
addSeparator();
addGroupMenuItem(e);
addSortMenuItem();
addColorByMenuItem();
addShadeAlignmentsMenuItem();
//addFilterMenuItem();
addPackMenuItem();

Expand Down Expand Up @@ -1675,7 +1693,8 @@ void addGroupMenuItem(final TrackClickEvent te) {//ReferenceFrame frame) {
GroupOption.NONE, GroupOption.STRAND, GroupOption.FIRST_OF_PAIR_STRAND, GroupOption.SAMPLE,
GroupOption.LIBRARY, GroupOption.READ_GROUP, GroupOption.MATE_CHROMOSOME,
GroupOption.PAIR_ORIENTATION, GroupOption.SUPPLEMENTARY, GroupOption.REFERENCE_CONCORDANCE,
GroupOption.MOVIE, GroupOption.ZMW, GroupOption.READ_ORDER, GroupOption.LINKED, GroupOption.PHASE
GroupOption.MOVIE, GroupOption.ZMW, GroupOption.READ_ORDER, GroupOption.LINKED, GroupOption.PHASE,
GroupOption.MAPPING_QUALITY
};

for (final GroupOption option : groupOptions) {
Expand Down Expand Up @@ -1862,6 +1881,22 @@ void addColorByMenuItem() {

}

void addShadeAlignmentsMenuItem(){
JMenu shadeMenu = new JMenu("Shade alignments by");

for( ShadeAlignmentsOption option: ShadeAlignmentsOption.values()) {
JRadioButtonMenuItem mi = new JRadioButtonMenuItem(option.label);
mi.setSelected(renderOptions.getShadeAlignmentsOption() == option);
mi.addActionListener(aEvt -> {
setShadeAlignmentsOptions(option);
AlignmentTrack.this.repaint();
});

shadeMenu.add(mi);
}
add(shadeMenu);
}

void addPackMenuItem() {
// Change track height by attribute
JMenuItem item = new JMenuItem("Re-pack alignments");
Expand Down Expand Up @@ -2456,6 +2491,9 @@ public static class RenderOptions implements Cloneable, Persistable {
private Integer maxInsertSize;
private ColorOption colorOption;
private GroupOption groupByOption;
private ShadeAlignmentsOption shadeAlignmentsOption;
private Integer mappingQualityLow;
private Integer mappingQualityHigh;
private boolean viewPairs = false;
private String colorByTag;
private String groupByTag;
Expand Down Expand Up @@ -2556,6 +2594,10 @@ public void setGroupByOption(GroupOption groupByOption) {
this.groupByOption = (groupByOption == null) ? GroupOption.NONE : groupByOption;
}

void setShadeAlignmentsOption(ShadeAlignmentsOption shadeAlignmentsOption){
this.shadeAlignmentsOption = shadeAlignmentsOption;
}

void setShadeBasesOption(boolean shadeBasesOption) {
this.shadeBasesOption = shadeBasesOption;
}
Expand Down Expand Up @@ -2639,6 +2681,27 @@ public String getColorByTag() {
return colorByTag == null ? getPreferences().get(SAM_COLOR_BY_TAG) : colorByTag;
}

public ShadeAlignmentsOption getShadeAlignmentsOption() {
if (shadeAlignmentsOption != null) {
return shadeAlignmentsOption;
} else {
try {
return ShadeAlignmentsOption.valueOf(getPreferences().get(SAM_SHADE_ALIGNMENT_BY));
} catch (IllegalArgumentException e) {
log.error("Error parsing alignment shade option: " + ShadeAlignmentsOption.valueOf(getPreferences().get(SAM_SHADE_ALIGNMENT_BY)));
return ShadeAlignmentsOption.NONE;
}
}
}

public int getMappingQualityLow() {
return mappingQualityLow == null ? getPreferences().getAsInt(SAM_SHADE_QUALITY_LOW) : mappingQualityLow;
}

public int getMappingQualityHigh() {
return mappingQualityHigh == null ? getPreferences().getAsInt(SAM_SHADE_QUALITY_HIGH) : mappingQualityHigh;
}

String getSortByTag() {
return sortByTag == null ? getPreferences().get(SAM_SORT_BY_TAG) : sortByTag;
}
Expand Down Expand Up @@ -2723,6 +2786,15 @@ public void marshalXML(Document document, Element element) {
if (groupByOption != null) {
element.setAttribute("groupByOption", groupByOption.toString());
}
if (shadeAlignmentsOption != null){
element.setAttribute("shadeAlignmentsByOption", shadeAlignmentsOption.toString());
}
if (mappingQualityLow != null) {
element.setAttribute("mappingQualityLow", mappingQualityLow.toString());
}
if (mappingQualityHigh != null) {
element.setAttribute("mappingQualityHigh", mappingQualityHigh.toString());
}
if (viewPairs != false) {
element.setAttribute("viewPairs", Boolean.toString(viewPairs));
}
Expand Down Expand Up @@ -2807,6 +2879,15 @@ public void unmarshalXML(Element element, Integer version) {
if (element.hasAttribute("groupByOption")) {
groupByOption = GroupOption.valueOf(element.getAttribute("groupByOption"));
}
if (element.hasAttribute("shadeAlignmentsByOption")){
shadeAlignmentsOption = ShadeAlignmentsOption.valueOf(element.getAttribute("shadeAlignmentsByOption"));
}
if (element.hasAttribute("mappingQualityLow")){
mappingQualityLow = Integer.parseInt(element.getAttribute("mappingQualityLow"));
}
if (element.hasAttribute("mappingQualityHigh")) {
mappingQualityHigh = Integer.parseInt(element.getAttribute("mappingQualityHigh"));
}
if (element.hasAttribute("viewPairs")) {
viewPairs = Boolean.parseBoolean(element.getAttribute("viewPairs"));
}
Expand Down
25 changes: 1 addition & 24 deletions src/main/java/org/broad/igv/sam/CoverageTrack.java
Expand Up @@ -749,30 +749,7 @@ void drawStrandBar(RenderContext context,
pY = isPositive ? baseY : baseY + height;
}
}


static float[] colorComps = new float[3];

private Color getShadedColor(int qual, Color backgroundColor, Color color) {
float alpha = 0;
int minQ = prefs.getAsInt(SAM_BASE_QUALITY_MIN);
ColorUtilities.getRGBColorComponents(color);
if (qual < minQ) {
alpha = 0.1f;
} else {
int maxQ = prefs.getAsInt(SAM_BASE_QUALITY_MAX);
alpha = Math.max(0.1f, Math.min(1.0f, 0.1f + 0.9f * (qual - minQ) / (maxQ - minQ)));
}
// Round alpha to nearest 0.1, for effeciency;
alpha = ((int) (alpha * 10 + 0.5f)) / 10.0f;

if (alpha >= 1) {
return color;
} else {
return ColorUtilities.getCompositeColor(backgroundColor, color, alpha);
}
}


/**
* Override to return a specialized popup menu
*
Expand Down
12 changes: 8 additions & 4 deletions src/main/resources/org/broad/igv/prefs/preferences.tab
Expand Up @@ -84,14 +84,19 @@ SAM.MAX_LEVELS Number of reads per window integer 100

SAM.COLOR_BY Color alignments by select NONE|READ_STRAND|FIRST_OF_PAIR_STRAND|PAIR_ORIENTATION|UNEXPECTED_PAIR|INSERT_SIZE|SAMPLE|READ_GROUP|LIBRARY|MOVIE|ZMW|BISULFITE|NOMESEQ|TAG|MAPPED_SIZE|LINK_STRAND|YC_TAG UNEXPECTED_PAIR
SAM.COLOR_BY_TAG Color by TAG string
SAM.GROUP_OPTION Group alignments by select NONE|STRAND|SAMPLE|READ_GROUP|LIBRARY|FIRST_OF_PAIR_STRAND|TAG|PAIR_ORIENTATION|MATE_CHROMOSOME|SV_ALIGNMENT|SUPPLEMENTARY|BASE_AT_POS|MOVIE|ZMW|HAPLOTYPE|READ_ORDER|LINKED|PHASE
SAM.GROUP_OPTION Group alignments by select NONE|STRAND|SAMPLE|READ_GROUP|LIBRARY|FIRST_OF_PAIR_STRAND|TAG|PAIR_ORIENTATION|MATE_CHROMOSOME|SV_ALIGNMENT|SUPPLEMENTARY|BASE_AT_POS|MOVIE|ZMW|HAPLOTYPE|READ_ORDER|LINKED|PHASE|MAPPING_QUALITY
SAM.GROUP_BY_TAG Group by TAG string
SAM.MAX_VISIBLE_RANGE Visibility range threshold (kb) float 30 Range at which alignments become visibile
SAM.QUALITY_THRESHOLD Mapping quality threshold int 0
SAM.QUALITY_THRESHOLD Mapping quality threshold int 0 Hide alignments with MQ lower than this value
SAM.ALIGNMENT_SCORE_THRESHOLD Alignment score threshold int 0
SAM.DISPLAY_MODE Alignment display mode string EXPANDED
SAM.DISPLAY_PAIRED Display reads as paired by default boolean FALSE
---
SAM.FLAG_ZERO_QUALITY Flag alignments with mapping quality = 0 with transparency and solid outline boolean TRUE
SAM.SHADE_ALIGNMENT_BY Shade alignments by select NONE|MAPPING_QUALITY_HIGH|MAPPING_QUALITY_LOW NONE
SAM.SHADE_QUALITY_LOW Mapping quality low shading threshold int 0 Alignments with MQ <= this value will be considered treated as low for shading purposes
SAM.SHADE_QUALITY_HIGH Mapping quality high shading threshold int 60 Alignments with MQ >= this value will be considered treated as high for shading purposes
---
SAM.SHOW_MISMATCHES Show mismatched bases boolean TRUE
SAM.SHOW_ALL_BASES Show all bases boolean FALSE
SAM.FILTER_DUPLICATES Filter duplicate reads boolean TRUE
Expand All @@ -102,7 +107,7 @@ SAM.FLAG_UNMAPPED_PAIR Flag unmapped pairs boolean FALSE
SAM.SHOW_CENTER_LINE Show center line boolean FALSE
SAM.SHOW_SOFT_CLIPPED Show soft-clipped bases boolean FALSE
---
SAM.SHADE_BASE_QUALITY Shade mismatched bases by quality. boolean TRUE
SAM.SHADE_BASE_QUALITY Shade mismatched bases by quality. boolean FALSE
SAM.BASE_QUALITY_MIN Maximum transparency at base quality: integer 5
SAM.BASE_QUALITY_MAX No transparency above base quality: integer 20
---
Expand Down Expand Up @@ -239,7 +244,6 @@ SAM.SHADE_CENTER TRUE
SAM.SHOW_REF_SEQ FALSE

SAM.BISULFITE_CONTEXT CG
SAM.FLAG_ZERO_QUALITY TRUE
SAM.NOMESEQ_ENABLED FALSE
SAM.COUNT_DELETED_BASES_COVERED FALSE
SAM.SORT_OPTION NUCLEOTIDE
Expand Down
25 changes: 25 additions & 0 deletions test/data/sam/mapq_gradient.sam
@@ -0,0 +1,25 @@
@HD VN:1.5 SO:coordinate
@SQ SN:chr1 LN:101
@SQ SN:chr2 LN:101
@SQ SN:chr3 LN:101
@SQ SN:chr4 LN:101
@SQ SN:chr5 LN:101
@SQ SN:chr6 LN:101
@SQ SN:chr7 LN:404
@SQ SN:chr8 LN:202
@RG ID:0 SM:Hi,Mom! PL:ILLUMINA
@PG ID:1 PN:Hey! VN:2.0
a 83 chr7 3 0 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
b 83 chr7 3 5 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
c 83 chr7 3 10 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
d 83 chr7 3 15 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
e 83 chr7 3 20 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
f 83 chr7 3 25 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
g 83 chr7 3 30 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
h 83 chr7 3 35 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
i 83 chr7 3 40 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
j 83 chr7 3 45 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
k 83 chr7 3 50 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
l 83 chr7 3 55 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
m 83 chr7 3 60 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
n 83 chr7 3 65 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
Binary file added test/data/sam/mapq_gradient.sam.sai
Binary file not shown.

0 comments on commit 38f2724

Please sign in to comment.