package edu.mayo.bior.pipeline.SNPEff; import java.util.List; /** * SNPEffHelper helper class computes the "most-significant-effect" from all the Effects * reported by SNPEff for a single variant. * * */ public class SNPEffHelper { public enum InfoFieldKey { EFFECT_KEY ("SNPEFF_EFFECT"), IMPACT_KEY ("SNPEFF_IMPACT"), FUNCTIONAL_CLASS_KEY ("SNPEFF_FUNCTIONAL_CLASS"), CODON_CHANGE_KEY ("SNPEFF_CODON_CHANGE"), AMINO_ACID_CHANGE_KEY ("SNPEFF_AMINO_ACID_CHANGE"), GENE_NAME_KEY ("SNPEFF_GENE_NAME"), GENE_BIOTYPE_KEY ("SNPEFF_GENE_BIOTYPE"), CODING ("SNPEFF_CODING"), TRANSCRIPT_ID_KEY ("SNPEFF_TRANSCRIPT_ID"), EXON_ID_KEY ("SNPEFF_EXON_ID"); // Actual text of the key private final String keyName; InfoFieldKey ( String keyName) { this.keyName = keyName; } public String getKeyName() { return keyName; } } // SnpEff labels each effect as either LOW, MODERATE, or HIGH impact, or as a MODIFIER. public enum EffectImpact { MODIFIER (0), LOW (1), MODERATE (2), HIGH (3); private final int severityRating; EffectImpact ( int severityRating ) { this.severityRating = severityRating; } public boolean isHigherImpactThan ( EffectImpact other ) { return this.severityRating > other.severityRating; } public boolean isSameImpactAs ( EffectImpact other ) { return this.severityRating == other.severityRating; } } // SnpEff assigns a functional class to each effect. public enum EffectFunctionalClass { NONE (0), SILENT (1), MISSENSE (2), NONSENSE (3); private final int priority; EffectFunctionalClass ( int priority ) { this.priority = priority; } public boolean isHigherPriorityThan ( EffectFunctionalClass other ) { return this.priority > other.priority; } } /** * * @param all effects returned by SNPEff * @return the most-significant-helper fromt he above effects * Refer to * https://github.com/broadgsa/gatk/blob/master/public/java/src/org/broadinstitute/sting/gatk/walkers/annotator/SnpEff.java * for the business-logic to get the most-significant-effect. Implemented the same here. * */ public static SNPEffectHolder getMostSignificantEffect ( List<SNPEffectHolder> effects ) { SNPEffectHolder mostSignificantEffect = null; for ( SNPEffectHolder effect : effects ) { if ( mostSignificantEffect == null || effect.isHigherImpactThan(mostSignificantEffect) ) { mostSignificantEffect = effect; } } return mostSignificantEffect; } }