All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.repseq.gen.dist.CommonNormalDTrimmingModel Maven / Gradle / Ivy

package io.repseq.gen.dist;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import io.repseq.core.GeneFeature;
import io.repseq.core.VDJCGene;
import io.repseq.gen.DTrimming;
import org.apache.commons.math3.distribution.EnumeratedIntegerDistribution;
import org.apache.commons.math3.random.RandomGenerator;

import static com.fasterxml.jackson.annotation.JsonProperty.Access.READ_ONLY;

public final class CommonNormalDTrimmingModel implements DTrimmingModel {
    @JsonUnwrapped
    @JsonProperty(access = READ_ONLY)
    public final NormalDistributionParameters parameters5, parameters3;
    public final int maxPLength5, maxPLength3;

    @JsonCreator
    public CommonNormalDTrimmingModel(@JsonProperty("parameters5") NormalDistributionParameters parameters5,
                                      @JsonProperty("parameters3") NormalDistributionParameters parameters3,
                                      @JsonProperty("maxPLength5") int maxPLength5,
                                      @JsonProperty("maxPLength3") int maxPLength3) {
        this.parameters5 = parameters5;
        this.parameters3 = parameters3;
        this.maxPLength5 = maxPLength5;
        this.maxPLength3 = maxPLength3;
    }

    @Override
    public DTrimmingGenerator create(RandomGenerator random, VDJCGene gene) {
        final int dLength = gene.getPartitioning().getLength(GeneFeature.DRegion);
        final EnumeratedIntegerDistribution dist3 = parameters3.truncatedDistribution(random, -dLength,
                Math.min(dLength, maxPLength3));
        final EnumeratedIntegerDistribution dist5 = parameters5.truncatedDistribution(random, -dLength,
                Math.min(dLength, maxPLength5));
        return new DTrimmingGenerator() {
            @Override
            public DTrimming sample() {
                int trimming3 = dist3.sample();
                int trimming5 = dist5.sample();
                if (trimming3 + trimming5 < -dLength) {
                    int excess = dLength - trimming3 - trimming5;
                    trimming3 += excess / 2;
                    trimming5 += excess - (excess / 2);
                }
                return new DTrimming(trimming3, trimming5);
            }
        };
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy