package htsjdk.samtools.cram; import htsjdk.samtools.cram.lossy.PreservationPolicy; import htsjdk.samtools.cram.lossy.QualityScorePreservation; import htsjdk.samtools.cram.lossy.QualityScoreTreatment; import java.util.Collections; import java.util.Set; import java.util.TreeSet; /** * An object describing lossy nature of CRAM conversion. This is: * * <pre> * 1. quality score preservation (model) * 2. read names * 3. capture all tags * 4. capture only some tags * 5. ignore some tags * </pre> * * @author vadim * */ public class CramLossyOptions { private QualityScorePreservation preservation = null; private boolean preserveReadNames = true; private boolean captureAllTags = true; private Set<String> captureTags = Collections.emptySet(); private Set<String> ignoreTags = Collections.emptySet(); public static final CramLossyOptions lossless() { return new CramLossyOptions(); } public boolean isLosslessQualityScore() { if (preservation == null || preservation.isLossless()) return true; if (preservation.getPreservationPolicies().isEmpty()) return false; for (PreservationPolicy policy : preservation.getPreservationPolicies()) { if (policy.treatment != QualityScoreTreatment.preserve()) return false; } return true; } public boolean areReferenceTracksRequired() { return !isLosslessQualityScore() && preservation.areReferenceTracksRequired(); } public CramLossyOptions setPreservation(QualityScorePreservation preservation) { this.preservation = preservation; return this; } public CramLossyOptions setPreserveReadNames(boolean preserveReadNames) { this.preserveReadNames = preserveReadNames; return this; } public CramLossyOptions setCaptureAllTags(boolean captureAllTags) { this.captureAllTags = captureAllTags; return this; } public CramLossyOptions setCaptureTags(Set<String> captureTags) { this.captureTags = captureTags; return this; } public CramLossyOptions setCaptureTags(String captureTags) { this.captureTags = tagsNamesToSet(captureTags); return this; } public CramLossyOptions setIgnoreTags(Set<String> ignoreTags) { this.ignoreTags = ignoreTags; return this; } public CramLossyOptions setIgnoreTags(String ignoreTags) { this.ignoreTags = tagsNamesToSet(ignoreTags); return this; } public QualityScorePreservation getPreservation() { return preservation; } public boolean isPreserveReadNames() { return preserveReadNames; } public boolean isCaptureAllTags() { return captureAllTags; } public Set<String> getCaptureTags() { return captureTags; } public Set<String> getIgnoreTags() { return ignoreTags; } public static Set<String> tagsNamesToSet(String tags) { Set<String> set = new TreeSet<String>(); if (tags == null || tags.length() == 0) return set; String[] chunks = tags.split(":"); for (String s : chunks) { if (s.length() != 2) throw new RuntimeException("Expecting column delimited tags names but got: '" + tags + "'"); set.add(s); } return set; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append("score:").append(preservation.toString()); sb.append(", ").append("names:").append(preserveReadNames ? "preserve" : "lossy"); if (captureAllTags) { if (ignoreTags == null || ignoreTags.isEmpty()) { sb.append(", ").append("tags:all"); } else { sb.append(", tags all but "); for (String tag : ignoreTags) { sb.append(":").append(tag); } } } else { if (captureTags == null || captureTags.isEmpty()) { sb.append(", no tags"); } else { sb.append(", capture tags["); for (String tag : captureTags) { sb.append(":").append(tag); } sb.append("]"); } } return sb.toString(); } }