#!/usr/bin/perl-w;
use strict;

#Программа принимает страницу базы данных OMP в htm-формате

print "Insert OPM data file name, please\n";
my $opm=<stdin>; chomp $opm;
open FILE, $opm or die;
my @opm=<FILE>;
my $i; my %sub; my $c;

#Из текста вычленяются строчки, описывающие трансмембранные домены по всем указанным цепям.

foreach $i(@opm)
	{
	 if($i=~m/([A-Z]).+ Segments:/)
		{
		 $sub{$1}=$i;
		}
	}
close FILE;
my @start1; my @end1;

#Пользователь выбирает нужную ему цепь/мономер на случай, если в OPM приведено несколько разных цепей/мономеров.

print "Choose one of ".keys(%sub)." chain(s)\n";
foreach $i(keys %sub){print "$i\n";}
my $chain=<stdin>; chomp $chain;

#Ввод поправки к нумерации

print "If PDB-file residue numbers don't correspond to those in the sequence, input the sequence number of the first residue in your structure, else print 1\n";
my $popr=<stdin>;

#Программа извлекает первые и последние а.о. трансмембранных доменов. Учитываются лишние пробелы в записи OMP. 

$_=$sub{$chain};
while ( /(\d+)\s*-\s*(\d+)/g )
    	{
	 push @start1, $1+$popr-1; 
	 push @end1, $2+$popr-1;
	}

#Пользователь вводит результат предсказания TMHMM в текстовом формате

print "Insert prediction file name, please\n";
my $tmh=<stdin>; chomp $tmh;
open FILE, $tmh or die;
my @tmh=<FILE>;
my @start2; my @end2; my $l;

#Из файла извлекаются длина последовательности и координаты трансмембранных доменов.

foreach $i(@tmh)
	{
	 if($i=~m/TMhelix\s+(\d+)\s+(\d+)/)
		{
		 push @start2, $1;
		 push @end2, $2;
		}
	 elsif($i=~m/Length: (\d+)/){$l=$1;}
	}
close FILE;
my $mem1; my $mem2; my $tp; my $fp; my $tn; my $fn;

#Каждый из а.о. истинных т-м. спиралей соотносится с предсказанными участками. Находим число верно положительных и ложно отрицательных.

for($i=0; $i<@start1; $i++)
	{
	 $mem1+=$end1[$i]-$start1[$i]+1;
	 my $q1;
	 for($q1=$start1[$i]; $q1<=$end1[$i]; $q1++)
		{
		 my $q2; my $m=0;
		 for($q2=0; $q2<@start2; $q2++)
			{
			 if($start2[$q2]<=$q1 and $q1<=$end2[$q2]){$tp++; $m=1;}
			}	
		 if($m==0){$fn++;}
		}
	}

#Вычисляется общее число а.о., согласно предсказанию, находящихся в мембране.

for($i=0; $i<@start2; $i++)
	{
	$mem2+=$end2[$i]-$start2[$i]+1;
	}

#Истинно отрицательные - это все а.о. последовательности, кроме предсказанных и ложно отрицательных. Ложно положительные - все предсказанные, кроме истинно положительных.

$tn=$l-$mem2-$fn;
$fp=$mem2-$tp;

#Пользователь выбирает имя для файла с результатами.

print "Output file name\n";
my $out=<stdin>; chomp $out;
open FILE, ">$out" or die;
print FILE "Sequence length: $l
Transmembrane residues predicted: $mem2
True positives: $tp
True negatives: $tn
False negatives: $fn
False positives: $fp
Sesitivity:".$tp/($tp+$fn)."
Specificity:".$tn/($tn+$fp)."
Precision:".$tp/$mem2."
Overprediction:".$fp/$mem2."
Underprediction:".$fn/($l-$mem2);
