package org.nextprot.api.core.utils.exon; import com.google.common.base.Preconditions; import org.nextprot.api.core.domain.Exon; /** * Categorise exons according to gene coordinate of a protein isoform * * Created by fnikitin on 21/07/15. */ public class ExonCategorizer { private final int startPositionIsoform; private final int endPositionIsoform; public ExonCategorizer(int startPositionIsoform, int endPositionIsoform) { Preconditions.checkArgument(startPositionIsoform>0); Preconditions.checkArgument(endPositionIsoform>=startPositionIsoform); this.startPositionIsoform = startPositionIsoform; this.endPositionIsoform = endPositionIsoform; } public ExonCategory categorize(Exon exon) { int startPositionExon = exon.getFirstPositionOnGene(); int endPositionExon = exon.getLastPositionOnGene(); Preconditions.checkArgument(startPositionIsoform <= endPositionIsoform, "The start position of the isoform on the gene " + startPositionIsoform + " can not be bigger than the end " + endPositionIsoform); Preconditions.checkArgument(startPositionExon <= endPositionExon, "The start position of the exon on the gene " + startPositionIsoform + " can not be bigger than the end " + endPositionIsoform); ExonCategory codingStatus; // not coding exons in the beginning of the transcript if (endPositionExon < startPositionIsoform) { codingStatus = ExonCategory.NOT_CODING_PRE; // ************ SPI ******************* EPI ******************* // **<SPE>***EPE*********************************************** } // end codon or stop only exon else if (startPositionExon > endPositionIsoform) { // Some kind of hack has probably been done in the db here !! // We consider exon to be of kind STOP_ONLY if it is closed to the last coding exon !! if (startPositionExon - endPositionIsoform < 3) { codingStatus = ExonCategory.STOP_ONLY; } else { codingStatus = ExonCategory.NOT_CODING_POST; } // ************ SPI ******************* EPI ******************* // ********************************************SPE*<EPE>******* } // start codon else if (startPositionExon <= startPositionIsoform && endPositionExon < endPositionIsoform) { codingStatus = ExonCategory.START; // ************ SPI ******************* EPI ******************* // *******SPE**********<EPE>*********************************** } // end codon else if (endPositionExon >= endPositionIsoform && startPositionExon > startPositionIsoform) { codingStatus = ExonCategory.STOP; // ************ SPI ******************* EPI ******************* // *********************<SPE>******************EPE************* } // Case where only one exon can translate the whole isoform else if (startPositionExon <= startPositionIsoform) { codingStatus = ExonCategory.MONO; // ************ SPI ******************* EPI ******************* // *************SPE**********************************EPE******* } else { // In the last case it must be a coding exon codingStatus = ExonCategory.CODING; } return codingStatus; } }