Skip to content
Snippets Groups Projects
visualiseProfile.py 3.73 KiB
#!/usr/bin/env -S PYTHONPATH=lib/python python3

from GEODE import fromTSV, toKey, toTSV
from GEODE.store import prepare
from GEODE.signal import gate, resample
import matplotlib.pyplot as plot
import seaborn
from sys import argv

def plotSingle(measure):
    return gate(measure['position'], measure['totalSize'], offset=1)

histData = [0.3741792369121561, 0.7607808340727595, 0.8889086069210292,
            0.7491570541259982, 1.2057675244010648, 1.0869565217391306,
            1.096095829636202, 0.7124223602484473, 0.7251109139307897,
            0.9335403726708075, 1.2277728482697428, 0.9582963620230699,
            0.8540372670807452, 1.0281277728482696, 1.4221827861579415,
            0.9218278615794143, 0.46814551907719604, 0.7717834960070986,
            1.083762200532387, 0.65226264418811, 0.5771073646850046,
            0.8025732031943212, 0.5266193433895296, 0.8911268855368234,
            0.6836734693877551, 0.9039041703637977, 0.8720496894409939,
            0.7113575865128662, 0.8984028393966283, 0.8993788819875776,
            1.0016858917480034, 0.5857142857142857, 0.7364685004436559,
            0.8047914818101152, 0.7055900621118011, 0.9018633540372669,
            0.944010647737356, 0.9955634427684119, 1.0425909494232473,
            0.9046140195208519, 0.8504880212954751, 1.1251109139307898,
            0.44631765749778174, 0.49893522626441883, 0.6860692102928126,
            0.7024844720496894, 0.4693877551020407, 1.5570541259982251,
            0.8903283052351374, 0.6923691215616682, 0.8062999112688553,
            1.0178349600709848, 0.5559006211180125, 0.7621118012422359,
            0.848447204968944, 0.5782608695652174, 0.8464063886424137,
            0.5537710736468501, 0.7160603371783496, 0.7982253771073646,
            0.8371783496007098, 0.9143744454303461, 1.0799467613132205,
            0.9581188997338067, 0.8597160603371785, 0.864685004436557,
            1.2598935226264418, 1.3385093167701863, 0.45891748003549254,
            0.9355811889973382, 0.6289263531499556, 0.7637089618456078,
            0.7324755989352264, 0.754924578527063, 0.568589174800355,
            0.49778172138420584, 0.7707187222715175, 1.0097604259094939,
            0.8621118012422362, 0.8971606033717835, 1.1584738243123336,
            1.1568766637089618, 0.7698314108251997, 0.9032830523513753,
            0.5743566992014197, 0.8896184560780832, 0.7858917480035492,
            0.9899733806566103, 1.617657497781721, 1.066725820763088,
            0.6067435669920143, 1.1874001774622889, 1.0669920141969833,
            1.1996450754214731, 1.4835847382431233, 1.6580301685891752,
            2.2103815439219168, 2.4215616681455185, 2.7979591836734694,
            5.278970718722271]

def plotProfile(profile, outputPath):
    plot.figure(figsize=(16,13))
    ax = seaborn.lineplot(profile)
    ax.set_xlabel("Position")
    ax.set_xlim(0, 100)
    ax.set_ylim(0)
    ax.xaxis.set_major_formatter('{x}%')
    ax.set_ylabel("Density")
    ax.yaxis.set_major_formatter('{x}%')
    curve = ax.lines[0]
    x, y = curve.get_xydata()[:,0], curve.get_xydata()[:,1]
    ax.fill_between(x, y, alpha=0.3)
    plot.savefig(prepare(outputPath), dpi=300, bbox_inches='tight')

def computeProfile(measures, resolution=100):
    profile = [0]*resolution
    for resampled in map(resample(resolution), map(plotSingle, measures)):
        profile = list(map(sum, zip(profile, resampled)))
    return [100*x/len(measures) for x in profile]

def drawProfile(measures, outputPath):
    profile = computeProfile(measures)
    toTSV(prepare(f"{outputPath}/profile.tsv"), profile, sortBy=None)
    plotProfile(profile, f"{outputPath}/profile.png")

if __name__ == '__main__':
    drawProfile([measure for _, measure in fromTSV(argv[1]).iterrows()], argv[2])
    #plotProfile(histData, argv[2])