#!/usr/bin/env python3

from sys import argv
import matplotlib.pyplot as plt
import numpy as np

weights = []
weights_f = []
IPs = []
IPs_f = []

input_file = str(argv[1])
output_file = str(argv[2])

with open(input_file, 'rt') as arch:
    info = arch.read().split('\n')


for line in info:
    if line.startswith('Molecular weight'):
        weights.append(float(line.split(' ')[3])/1000)
    elif line.startswith('Isoelectric Point'):
        IPs.append(float(line.split(' ')[3]))
    else:
        continue

print(f'Молекулярная масса принимает значения от {min(weights):.01f} кДа до {max(weights):.01f} кДа')
print(f'pI принимает значения от {min(IPs):.02f} до {max(IPs):.02f}')
weight_lims = list(map(float, input('Границы рассматриваемого диапазона молекулярных весов (кДа): ').split()))
IP_lims = list(map(float, input('Границы рассматриваемого диапазона pI: ').split()))

for i in range(len(weights)):
    if max(weight_lims) >= weights[i] >= min(weight_lims) and max(IP_lims) >= IPs[i] >= min(IP_lims):
        weights_f.append(weights[i])
        IPs_f.append(IPs[i])
    else:
        continue

IP_median = np.median(IPs)
IP_quartiles = np.quantile(IPs, [0.25, 0.75])
weight_median = np.median(weights)
weight_quartiles = np.quantile(weights, [0.25, 0.75])

print(f'Значения первых трех квартилей для молекулярных масс (кДа): {weight_quartiles[0]:.01f}; {weight_median:.01f}; {weight_quartiles[1]:.01f}')
print(f'Значения первых трех квартилей для pI: {IP_quartiles[0]:.02f}; {IP_median:.02f}; {IP_quartiles[1]:.02f}')

plt.figure(figsize = (20, 10))
plt.scatter(IPs_f, weights_f, s = 10, color = 'green')
plt.axvline(IP_median, color = 'red', linestyle = 'solid')
plt.axvline(IP_quartiles[0], color = 'red', linestyle = '--')
plt.axvline(IP_quartiles[1], color = 'red', linestyle = '--')
plt.axhline(weight_median, color = 'blue', linestyle = 'solid')
plt.axhline(weight_quartiles[0], color = 'blue', linestyle = '--')
plt.axhline(weight_quartiles[1], color = 'blue', linestyle = '--')
plt.gca().invert_yaxis()
plt.xlabel('Изоэлектрическая точка (pI)', fontsize = 20)
plt.ylabel('Молекулярная масса, кДа', fontsize = 22)
plt.tick_params(labelsize = 16)
plt.savefig(output_file)