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

net.maizegenetics.analysis.data.CountAssociationsPlugin.kt Maven / Gradle / Ivy

package net.maizegenetics.analysis.data

import com.google.common.collect.ImmutableRangeMap
import com.google.common.collect.Range
import com.google.common.collect.RangeMap
import net.maizegenetics.dna.map.Position
import net.maizegenetics.plugindef.AbstractPlugin
import net.maizegenetics.plugindef.DataSet
import net.maizegenetics.plugindef.GeneratePluginCode
import net.maizegenetics.plugindef.PluginParameter
import net.maizegenetics.util.Utils
import org.apache.log4j.Logger
import java.awt.Frame
import javax.swing.ImageIcon

class CountAssociationsPlugin(parentFrame: Frame? = null, isInteractive: Boolean = false) : AbstractPlugin(parentFrame, isInteractive) {

    private val myLogger = Logger.getLogger(CountAssociationsPlugin::class.java)

    private var intervalFile = PluginParameter.Builder("intervals", null, String::class.java)
            .description("Interval File.")
            .inFile()
            .required(true)
            .build()

    private var gwasResults = PluginParameter.Builder("gwasResults", null, String::class.java)
            .description("GWAS Result File.")
            .inFile()
            .required(true)
            .build()

    private var outputFile = PluginParameter.Builder("outputCountFile", null, String::class.java)
            .description("Output Count File.")
            .outFile()
            .required(true)
            .build()


    override fun processData(input: DataSet?): DataSet? {

        //Import the intervals into a rangeSet
        val intervalMap = loadInIntervalFile(intervalFile())

        //Map>
        val outputMap = mutableMapOf>()

        val traitSet = mutableSetOf()
        val intervalSet = intervalMap.asMapOfRanges().map { it.value }.toSortedSet()
        var traitCount = 0

        Utils.getBufferedReader(gwasResults()).use { reader ->
            var currLine: String? = reader.readLine()

            while (currLine != null) {
//                    if (currLine.startsWith("Trait")) {
                if (currLine.startsWith("trait")) {
                    currLine = reader.readLine()
                    continue
                }

                val currLineSplit = currLine.split(",")

                val traitName = currLineSplit[0]


                traitSet.add(traitName)
//                    val pos = Position.of(currLineSplit[2], currLineSplit[3].toInt())
                val pos = Position.of(currLineSplit[1], currLineSplit[2].toInt())
                val intervalHit = intervalMap.get(pos)


                if (intervalHit == null) {
                    currLine = reader.readLine()
                    continue
                }

                if (!outputMap.containsKey(intervalHit)) {
                    outputMap[intervalHit] = mutableMapOf()
                }
                if (!outputMap[intervalHit]!!.containsKey(traitName)) {
                    outputMap[intervalHit]?.put(traitName, 1)
                } else {
                    val currentCount = outputMap[intervalHit]?.get(traitName) ?: 0
                    outputMap[intervalHit]?.put(traitName, currentCount + 1)
                }


                currLine = reader.readLine()
            }
        }


        Utils.getBufferedWriter(outputFile()).use { output ->

            val sortedTraits = traitSet.sorted()
            output.write("Interval\t${sortedTraits.joinToString("\t")}\n")

            for (interval in intervalSet) {
                val countMap = outputMap[interval]
                val countList = mutableListOf()
                for (trait in sortedTraits) {
                    if (countMap == null) {
                        countList.add(0)
                    } else {
                        val count = countMap[trait] ?: 0
                        countList.add(count)
                    }
                }

                output.write("${interval}\t${countList.joinToString("\t")}\n")
            }
        }
        return null
    }

    fun loadInIntervalFile(intervalFile: String): RangeMap {
        val intervalMapBuilder = ImmutableRangeMap.Builder()
        Utils.getBufferedReader(intervalFile).readLines()
                .filter { !it.startsWith("seqnames") }
                .map { it.split(",") }
                .map { Pair(Range.closed(Position.of(it[0], it[1].toInt()), Position.of(it[0], it[2].toInt())), it[3]) }
                .forEach { intervalMapBuilder.put(it.first, it.second) }
        return intervalMapBuilder.build()
    }

    override fun getIcon(): ImageIcon? {
        return null
    }

    override fun getButtonName(): String {
        return ("Count Associations")
    }

    override fun getToolTipText(): String {
        return ("Create a count file For Associations")
    }

    /**
     * Interval File.
     *
     * @return Intervals
     */
    fun intervalFile(): String {
        return intervalFile.value()
    }

    /**
     * Set Intervals. Interval File.
     *
     * @param value Intervals
     *
     * @return this plugin
     */
    fun intervalFile(value: String): CountAssociationsPlugin {
        intervalFile = PluginParameter(intervalFile, value)
        return this
    }

    /**
     * GWAS Result File.
     *
     * @return Gwas Results
     */
    fun gwasResults(): String {
        return gwasResults.value()
    }

    /**
     * Set Gwas Results. GWAS Result File.
     *
     * @param value Gwas Results
     *
     * @return this plugin
     */
    fun gwasResults(value: String): CountAssociationsPlugin {
        gwasResults = PluginParameter(gwasResults, value)
        return this
    }

    /**
     * Output Count File.
     *
     * @return Output Count File
     */
    fun outputFile(): String {
        return outputFile.value()
    }

    /**
     * Set Output Count File. Output Count File.
     *
     * @param value Output Count File
     *
     * @return this plugin
     */
    fun outputFile(value: String): CountAssociationsPlugin {
        outputFile = PluginParameter(outputFile, value)
        return this
    }


}

fun main(args: Array) {
    GeneratePluginCode.generateKotlin(CountAssociationsPlugin::class.java)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy