package RRCResultsUploadManager;

use strict;
use warnings;

use DBI;
use lib qw(Core);

use Database;
use Configuration;

use RRCResultsManager;

my $resultsupload_manager = undef;


my $TARGET_NAME_FORMAT = "^(T[0-9]{4}(s\\d+){0,1})_(ML|M|L|xL)";
my $TARGET_NAME_FORMAT_DOMAIN = "^(T[0-9]{4}(s\\d+){0,1})-D([0-9]+)_(ML|M|L|xL)";
my $MODEL_NAME_FORMAT = "^(T[0-9]{4}(s\\d+){0,1})([A-Z]{2})([0-9]{3})_([0-9]{1})";
my $TARGET_NAME_FORMAT2 = "^(T[0-9]{4}(s\\d+){0,1})";
my $TARGET_NAME_FORMAT_DOMAIN2 = "(T[0-9]{4}(s\\d+){0,1})-D([0-9]+)";
my $MODEL_NAME_FORMAT2 = "^(T[0-9]{4}(s\\d+){0,1})([A-Z]{2})([0-9]{3})_([0-9]{1})_(ML|M|L|xL)";


sub new {
    my ($class) = @_;

    return $resultsupload_manager if(defined($resultsupload_manager));

    my $self = {
        _id => undef,
        _database => Database->new($CONFIG->{HOSTNAME}, $CONFIG->{PORT}, $CONFIG->{DATABASE}, $CONFIG->{USERNAME}, $CONFIG->{PASSWORD})
    };

    $resultsupload_manager = bless $self, $class;
    return $resultsupload_manager;

}

# parse model fields from model name and from filename
sub parseModelName{
    my ($self, $modelname, $filename, %model) = @_;
    if ($filename =~ m/$TARGET_NAME_FORMAT_DOMAIN/){
	$model{TARGET} = $1;
	$model{rr_range} = $4;
	$model{domain} = $3;
    } elsif ($filename =~ m/$TARGET_NAME_FORMAT/){
        $model{TARGET} = $1;
        $model{rr_range} = $3;
        $model{domain} = 0;
    } else {
	return undef;
    }
    if ($modelname =~ m/$MODEL_NAME_FORMAT/){
	$model{PFRMAT} = $3;
	$model{GROUP_CODE} = $4;
	$model{MODEL} = $5;
    } else {
	return undef;
    }
    return %model;
}

# parse model fields from filename and dirname
sub parseModelName2{
    my ($self, $filename, $dirname, %model) = @_;
    if ($dirname =~ m/$TARGET_NAME_FORMAT_DOMAIN2/){
        $model{TARGET} = $1;
        $model{domain} = $2;
    } elsif ($dirname =~ m/$TARGET_NAME_FORMAT2/){
        $model{TARGET} = $1;
        $model{domain} = 0;
    } else {
        return undef;
    }
    if ($filename =~ m/$MODEL_NAME_FORMAT2/){
        $model{PFRMAT} = $2;
        $model{GROUP_CODE} = $3;
        $model{MODEL} = $4;
	$model{rr_range} = $5;
    } else {
        return undef;
    }
    return %model;
}

sub parseModelScores2{
    my ($self, $l, $list_size, $prob_filter, %model) = @_;
    #Prediction    1:AUC_PR 2:F1_10 3:F1_FL 4:F1_L1 5:F1_L2 6:F1_L5 7:F1p05_10 8:F1p05_FL 9:F1p05_L1 10:F1p05_L2 11:F1p05_L5 12:MCC 13:MCCp05 14:precision_10 15:precision_FL 16:precision_L1 17:precision_L2 18:precision_L5 19:precisionp05_10 20:precisionp05_FL 21:precisionp05_L1 22:precisionp05_L2 23:precisionp05_L5 24:recall_10 25:recall_FL 26:recall_L1 27:recall_L2 28:recall_L5 29:recallp05_10 30:recallp05_FL 31:recallp05_L1 32:recallp05_L2 33:recallp05_L5
    my @tokens = split(/\s+/, $l);
    #print "$list_size $prob_filter\n";
    if ($list_size eq "FL" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[15] if ($tokens[15] !~ m/NA/i && $tokens[15] !~ m/None/i );
        $model{recall} = $tokens[25] if ($tokens[25] !~ m/NA/i && $tokens[25] !~ m/None/i );
        $model{mcc} = $tokens[12] if ($tokens[12] !~ m/NA/i && $tokens[12] !~ m/None/i );
        $model{f1} = $tokens[3] if ($tokens[3] !~ m/NA/i && $tokens[3] !~ m/None/i );
    }
    if ($list_size eq "FL" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{mcc} = $tokens[13] if ($tokens[13] !~ m/NA/i && $tokens[13] !~ m/None/i );
        $model{prec} = $tokens[20] if ($tokens[20] !~ m/NA/i && $tokens[20] !~ m/None/i );
        $model{recall} = $tokens[30] if ($tokens[30] !~ m/NA/i && $tokens[30] !~ m/None/i );
        $model{f1} = $tokens[8] if ($tokens[8] !~ m/NA/i && $tokens[8] !~ m/None/i );
    }
    if ($list_size eq "L1" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[16] if ($tokens[16] !~ m/NA/i && $tokens[16] !~ m/None/i );
        $model{recall} = $tokens[26] if ($tokens[26] !~ m/NA/i && $tokens[26] !~ m/None/i );
        $model{f1} = $tokens[4] if ($tokens[4] !~ m/NA/i && $tokens[4] !~ m/None/i );
    }
    if ($list_size eq "L1" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[21] if ($tokens[21] !~ m/NA/i && $tokens[21] !~ m/None/i );
        $model{recall} = $tokens[31] if ($tokens[31] !~ m/NA/i && $tokens[31] !~ m/None/i );
        $model{f1} = $tokens[9] if ($tokens[9] !~ m/NA/i && $tokens[9] !~ m/None/i );
    }
    if ($list_size eq "L2" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[17] if ($tokens[17] !~ m/NA/i && $tokens[17] !~ m/None/i );
        $model{recall} = $tokens[27] if ($tokens[27] !~ m/NA/i && $tokens[27] !~ m/None/i );
        $model{f1} = $tokens[5] if ($tokens[5] !~ m/NA/i && $tokens[5] !~ m/None/i );
    }
    if ($list_size eq "L2" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[22] if ($tokens[22] !~ m/NA/i && $tokens[22] !~ m/None/i );
        $model{recall} = $tokens[32] if ($tokens[32] !~ m/NA/i && $tokens[32] !~ m/None/i );
        $model{f1} = $tokens[10] if ($tokens[10] !~ m/NA/i && $tokens[10] !~ m/None/i );
    }
    if ($list_size eq "L5" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[18] if ($tokens[18] !~ m/NA/i && $tokens[18] !~ m/None/i );
        $model{recall} = $tokens[28] if ($tokens[28] !~ m/NA/i && $tokens[28] !~ m/None/i );
        $model{f1} = $tokens[6] if ($tokens[6] !~ m/NA/i && $tokens[6] !~ m/None/i );
    }
    if ($list_size eq "L5" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[23] if ($tokens[23] !~ m/NA/i && $tokens[23] !~ m/None/i );
        $model{recall} = $tokens[33] if ($tokens[33] !~ m/NA/i && $tokens[33] !~ m/None/i );
        $model{f1} = $tokens[11] if ($tokens[11] !~ m/NA/i && $tokens[11] !~ m/None/i );
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[14] if ($tokens[14] !~ m/NA/i && $tokens[14] !~ m/None/i );
        $model{recall} = $tokens[24] if ($tokens[24] !~ m/NA/i && $tokens[24] !~ m/None/i );
        $model{f1} = $tokens[2] if ($tokens[2] !~ m/NA/i && $tokens[2] !~ m/None/i );
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[19] if ($tokens[19] !~ m/NA/i && $tokens[19] !~ m/None/i );
        $model{recall} = $tokens[29] if ($tokens[29] !~ m/NA/i && $tokens[29] !~ m/None/i );
        $model{f1} = $tokens[7] if ($tokens[7] !~ m/NA/i && $tokens[7] !~ m/None/i );
    }
    return %model;
}

sub parseModelScores{
    my ($self, $l, $list_size, $prob_filter, %model) = @_;
    # Prediction    1:AUC_PR 2:F1_10 3:F1_FL 4:F1_L2 5:F1_L5 6:F1_pw_10 7:F1_pw_FL 8:F1_pw_L2 9:F1_pw_L5 10:F1p05_10 11:F1p05_FL 12:F1p05_L2 13:F1p05_L5 14:F1p05_pw_10 15:F1p05_pw_FL 16:F1p05_pw_L2 17:F1p05_pw_L5 18:MCC 19:MCCp05 20:MCCss_short 21:MCCssp05_short 22:prec_FDR_pw_10 23:prec_FDR_pw_FL 24:prec_FDR_pw_L2 25:prec_FDR_pw_L5 26:prec_FDR_pw05_10 27:prec_FDR_pw05_FL 28:prec_FDR_pw05_L2 29:prec_FDR_pw05_L5 30:precision_10 31:precision_FL 32:precision_L2 33:precision_L5 34:precision_pw_10 35:precision_pw_FL 36:precision_pw_L2 37:precision_pw_L5 38:precisionp05_10 39:precisionp05_FL 40:precisionp05_L2 41:precisionp05_L5 42:precisionp05_pw_10 43:precisionp05_pw_FL 44:precisionp05_pw_L2 45:precisionp05_pw_L5 46:precisionss_short 47:precisionssp05_short 48:recall_10 49:recall_FL 50:recall_L2 51:recall_L5 52:recall_pw_10 53:recall_pw_FL 54:recall_pw_L2 55:recall_pw_L5 56:recallp05_10 57:recallp05_FL 58:recallp05_L2 59:recallp05_L5 60:recallp05_pw_10 61:recallp05_pw_FL 62:recallp05_pw_L2 63:recallp05_pw_L5 64:recallss_TPshort_10 65:recallss_TPshort_FL 66:recallss_TPshort_L2 67:recallss_TPshort_L5 68:recallss_short 69:recallssp05_TPshort_10 70:recallssp05_TPshort_FL 71:recallssp05_TPshort_L2 72:recallssp05_TPshort_L5 73:recallssp05_short 74:wA_prec_FDR_10 75:wA_prec_FDR_FL 76:wA_prec_FDR_L2 77:wA_prec_FDR_L5 78:wA_prec_FDR_p05_10 79:wA_prec_FDR_p05_FL 80:wA_prec_FDR_p05_L2 81:wA_prec_FDR_p05_L5 82:wA_precision_10 83:wA_precision_FL 84:wA_precision_L2 85:wA_precision_L5 86:wA_precisionp05_10 87:wA_precisionp05_FL 88:wA_precisionp05_L2 89:wA_precisionp05_L5

    my @tokens = split(/\s+/, $l);
    #print "$list_size $prob_filter\n";
    if ($list_size eq "FL" && $prob_filter eq "0"){
	$model{list_size} = $list_size;
	$model{prob_filter} = $prob_filter;
	$model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
	$model{prec} = $tokens[31] if ($tokens[31] !~ m/NA/i && $tokens[31] !~ m/None/i );
	$model{recall} = $tokens[49] if ($tokens[49] !~ m/NA/i && $tokens[49] !~ m/None/i );
	$model{prec_ss} = $tokens[46] if ($tokens[46] !~ m/NA/i && $tokens[46] !~ m/None/i );
	$model{recall_ss} = $tokens[68] if ($tokens[68] !~ m/NA/i && $tokens[68] !~ m/None/i );
        $model{recall_ss_tp} = $tokens[65] if ($tokens[65] !~ m/NA/i && $tokens[65] !~ m/None/i );
	$model{mcc} = $tokens[18] if ($tokens[18] !~ m/NA/i && $tokens[18] !~ m/None/i );
	$model{mcc_ss} = $tokens[20] if ($tokens[20] !~ m/NA/i && $tokens[20] !~ m/None/i );
	$model{f1} = $tokens[3] if ($tokens[3] !~ m/NA/i && $tokens[3] !~ m/None/i );
	#$model{f1_ss} = $tokens[] if ($tokens[] !~ m/NA/i && $tokens[] !~ m/None/i );
	$model{prec_prob} = $tokens[35] if ($tokens[35] !~ m/NA/i && $tokens[35] !~ m/None/i );
	$model{recall_prob} = $tokens[53] if ($tokens[53] !~ m/NA/i && $tokens[53] !~ m/None/i );
	$model{f1_prob} = $tokens[7] if ($tokens[7] !~ m/NA/i && $tokens[7] !~ m/None/i );
	if (defined($model{prec_ss}) && defined($model{recall_ss}) && ($model{prec_ss} != 0) && ($model{recall_ss} != 0)){
		$model{f1_ss} = 2 * ($model{prec_ss} * $model{recall_ss}) / ($model{prec_ss} + $model{recall_ss});
	}
	$model{prec_FDR_pw} = $tokens[23] if ($tokens[23] !~ m/NA/i && $tokens[23] !~ m/None/i );
	$model{prec_pwa} = $tokens[83] if ($tokens[83] !~ m/NA/i && $tokens[83] !~ m/None/i );
	$model{prec_FDR_pwa} = $tokens[75] if ($tokens[75] !~ m/NA/i && $tokens[75] !~ m/None/i );
    }
    if ($list_size eq "FL" && $prob_filter eq "0.5"){
	$model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
	$model{mcc} = $tokens[19] if ($tokens[19] !~ m/NA/i && $tokens[19] !~ m/None/i );
        $model{prec} = $tokens[39] if ($tokens[39] !~ m/NA/i && $tokens[39] !~ m/None/i );
        $model{recall} = $tokens[57] if ($tokens[57] !~ m/NA/i && $tokens[57] !~ m/None/i );
        $model{prec_ss} = $tokens[47] if ($tokens[47] !~ m/NA/i && $tokens[47] !~ m/None/i );
        $model{recall_ss} = $tokens[73] if ($tokens[73] !~ m/NA/i && $tokens[73] !~ m/None/i );
	$model{recall_ss_tp} = $tokens[70] if ($tokens[70] !~ m/NA/i && $tokens[70] !~ m/None/i );
	$model{mcc_ss} = $tokens[21] if ($tokens[21] !~ m/NA/i && $tokens[21] !~ m/None/i );
	$model{f1} = $tokens[11] if ($tokens[11] !~ m/NA/i && $tokens[11] !~ m/None/i );
        if (defined($model{prec_ss}) && defined($model{recall_ss}) && ($model{prec_ss} != 0) && ($model{recall_ss} != 0)){
                $model{f1_ss} = 2 * ($model{prec_ss} * $model{recall_ss}) / ($model{prec_ss} + $model{recall_ss});
        }
	$model{prec_FDR_pw} = $tokens[27] if ($tokens[27] !~ m/NA/i && $tokens[27] !~ m/None/i );
	$model{prec_prob} = $tokens[43] if ($tokens[43] !~ m/NA/i && $tokens[43] !~ m/None/i );
        $model{recall_prob} = $tokens[61] if ($tokens[61] !~ m/NA/i && $tokens[61] !~ m/None/i );
        $model{f1_prob} = $tokens[15] if ($tokens[15] !~ m/NA/i && $tokens[15] !~ m/None/i );
        $model{prec_pwa} = $tokens[87] if ($tokens[87] !~ m/NA/i && $tokens[87] !~ m/None/i );
        $model{prec_FDR_pwa} = $tokens[79] if ($tokens[79] !~ m/NA/i && $tokens[79] !~ m/None/i );

    }
    if ($list_size eq "L2" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[32] if ($tokens[32] !~ m/NA/i && $tokens[32] !~ m/None/i );
        $model{recall} = $tokens[50] if ($tokens[50] !~ m/NA/i && $tokens[50] !~ m/None/i );
	$model{recall_ss_tp} = $tokens[66] if ($tokens[66] !~ m/NA/i && $tokens[66] !~ m/None/i );
	$model{f1} = $tokens[4] if ($tokens[4] !~ m/NA/i && $tokens[4] !~ m/None/i );
        $model{prec_prob} = $tokens[36] if ($tokens[36] !~ m/NA/i && $tokens[36] !~ m/None/i );
        $model{recall_prob} = $tokens[54] if ($tokens[54] !~ m/NA/i && $tokens[54] !~ m/None/i );
        $model{f1_prob} = $tokens[8] if ($tokens[8] !~ m/NA/i && $tokens[8] !~ m/None/i );
	$model{prec_FDR_pw} = $tokens[24] if ($tokens[24] !~ m/NA/i && $tokens[24] !~ m/None/i );
        $model{prec_pwa} = $tokens[84] if ($tokens[84] !~ m/NA/i && $tokens[84] !~ m/None/i );
        $model{prec_FDR_pwa} = $tokens[76] if ($tokens[76] !~ m/NA/i && $tokens[76] !~ m/None/i );

    }
    if ($list_size eq "L2" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[40] if ($tokens[40] !~ m/NA/i && $tokens[40] !~ m/None/i );
        $model{recall} = $tokens[58] if ($tokens[58] !~ m/NA/i && $tokens[58] !~ m/None/i );
	$model{recall_ss_tp} = $tokens[71] if ($tokens[71] !~ m/NA/i && $tokens[71] !~ m/None/i );
	$model{f1} = $tokens[12] if ($tokens[12] !~ m/NA/i && $tokens[12] !~ m/None/i );
	$model{prec_FDR_pw} = $tokens[28] if ($tokens[28] !~ m/NA/i && $tokens[28] !~ m/None/i );
	$model{prec_prob} = $tokens[44] if ($tokens[44] !~ m/NA/i && $tokens[44] !~ m/None/i );
        $model{recall_prob} = $tokens[62] if ($tokens[62] !~ m/NA/i && $tokens[62] !~ m/None/i );
        $model{f1_prob} = $tokens[16] if ($tokens[16] !~ m/NA/i && $tokens[16] !~ m/None/i );
        $model{prec_pwa} = $tokens[88] if ($tokens[88] !~ m/NA/i && $tokens[88] !~ m/None/i );
        $model{prec_FDR_pwa} = $tokens[80] if ($tokens[80] !~ m/NA/i && $tokens[80] !~ m/None/i );
    }
    if ($list_size eq "L5" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[33] if ($tokens[33] !~ m/NA/i && $tokens[33] !~ m/None/i );
        $model{recall} = $tokens[51] if ($tokens[51] !~ m/NA/i && $tokens[51] !~ m/None/i );
	$model{recall_ss_tp} = $tokens[67] if ($tokens[67] !~ m/NA/i && $tokens[67] !~ m/None/i );
	$model{f1} = $tokens[5] if ($tokens[5] !~ m/NA/i && $tokens[5] !~ m/None/i );
        $model{prec_prob} = $tokens[37] if ($tokens[37] !~ m/NA/i && $tokens[37] !~ m/None/i );
        $model{recall_prob} = $tokens[55] if ($tokens[55] !~ m/NA/i && $tokens[55] !~ m/None/i );
        $model{f1_prob} = $tokens[9] if ($tokens[9] !~ m/NA/i && $tokens[9] !~ m/None/i );
	$model{prec_FDR_pw} = $tokens[25] if ($tokens[25] !~ m/NA/i && $tokens[25] !~ m/None/i );
        $model{prec_pwa} = $tokens[85] if ($tokens[85] !~ m/NA/i && $tokens[85] !~ m/None/i );
        $model{prec_FDR_pwa} = $tokens[77] if ($tokens[77] !~ m/NA/i && $tokens[77] !~ m/None/i );
    }
    if ($list_size eq "L5" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[41] if ($tokens[41] !~ m/NA/i && $tokens[41] !~ m/None/i );
        $model{recall} = $tokens[59] if ($tokens[59] !~ m/NA/i && $tokens[59] !~ m/None/i );
	$model{recall_ss_tp} = $tokens[72] if ($tokens[72] !~ m/NA/i && $tokens[72] !~ m/None/i );
	$model{f1} = $tokens[13] if ($tokens[13] !~ m/NA/i && $tokens[13] !~ m/None/i );
	$model{prec_FDR_pw} = $tokens[29] if ($tokens[29] !~ m/NA/i && $tokens[29] !~ m/None/i );
        $model{prec_prob} = $tokens[45] if ($tokens[45] !~ m/NA/i && $tokens[45] !~ m/None/i );
        $model{recall_prob} = $tokens[63] if ($tokens[63] !~ m/NA/i && $tokens[63] !~ m/None/i );
        $model{f1_prob} = $tokens[17] if ($tokens[17] !~ m/NA/i && $tokens[17] !~ m/None/i );
        $model{prec_pwa} = $tokens[89] if ($tokens[89] !~ m/NA/i && $tokens[89] !~ m/None/i );
        $model{prec_FDR_pwa} = $tokens[81] if ($tokens[81] !~ m/NA/i && $tokens[81] !~ m/None/i );
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[30] if ($tokens[30] !~ m/NA/i && $tokens[30] !~ m/None/i );
        $model{recall} = $tokens[48] if ($tokens[48] !~ m/NA/i && $tokens[48] !~ m/None/i );
	$model{recall_ss_tp} = $tokens[64] if ($tokens[64] !~ m/NA/i && $tokens[64] !~ m/None/i );
	$model{f1} = $tokens[2] if ($tokens[2] !~ m/NA/i && $tokens[2] !~ m/None/i );
        $model{prec_prob} = $tokens[34] if ($tokens[34] !~ m/NA/i && $tokens[34] !~ m/None/i );
        $model{recall_prob} = $tokens[52] if ($tokens[52] !~ m/NA/i && $tokens[52] !~ m/None/i );
        $model{f1_prob} = $tokens[6] if ($tokens[6] !~ m/NA/i && $tokens[6] !~ m/None/i );
	$model{prec_FDR_pw} = $tokens[22] if ($tokens[22] !~ m/NA/i && $tokens[22] !~ m/None/i );
        $model{prec_pwa} = $tokens[82] if ($tokens[82] !~ m/NA/i && $tokens[82] !~ m/None/i );
        $model{prec_FDR_pwa} = $tokens[74] if ($tokens[74] !~ m/NA/i && $tokens[74] !~ m/None/i );
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{auc_pr} = $tokens[1] if ($tokens[1] !~ m/NA/i && $tokens[1] !~ m/None/i );
        $model{prec} = $tokens[38] if ($tokens[38] !~ m/NA/i && $tokens[38] !~ m/None/i );
        $model{recall} = $tokens[56] if ($tokens[56] !~ m/NA/i && $tokens[56] !~ m/None/i );
	$model{recall_ss_tp} = $tokens[69] if ($tokens[69] !~ m/NA/i && $tokens[69] !~ m/None/i );
	$model{f1} = $tokens[10] if ($tokens[10] !~ m/NA/i && $tokens[10] !~ m/None/i );
	$model{prec_FDR_pw} = $tokens[26] if ($tokens[26] !~ m/NA/i && $tokens[26] !~ m/None/i );
        $model{prec_prob} = $tokens[42] if ($tokens[42] !~ m/NA/i && $tokens[42] !~ m/None/i );
        $model{recall_prob} = $tokens[60] if ($tokens[60] !~ m/NA/i && $tokens[60] !~ m/None/i );
        $model{f1_prob} = $tokens[14] if ($tokens[14] !~ m/NA/i && $tokens[14] !~ m/None/i );
	$model{prec_pwa} = $tokens[86] if ($tokens[86] !~ m/NA/i && $tokens[86] !~ m/None/i );
        $model{prec_FDR_pwa} = $tokens[78] if ($tokens[78] !~ m/NA/i && $tokens[78] !~ m/None/i );
    }
    return %model;
}


sub parseModelListLength{
    my ($self, $l, $list_size, $prob_filter, %model) = @_;
    #domain model range 10 10p05 L5 L5p05 L2 L2p05 FL FLp05
    ##domain model range 10 10p05 L1 L1p05 L2 L2p05 L5 L5p05 FL FLp05
    my @tokens = split(/\s+/, $l);
    if ($list_size eq "FL" && $prob_filter eq "0"){
	$model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{no_conts_m} = $tokens[11];
    }
    if ($list_size eq "FL" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[12];
    }
    if ($list_size eq "L1" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[5];
    }
    if ($list_size eq "L1" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[6];
    }
    if ($list_size eq "L2" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[7];
    }
    if ($list_size eq "L2" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[8];
    }
    if ($list_size eq "L5" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[9];
    }
    if ($list_size eq "L5" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[10];
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[3];
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{no_conts_m} = $tokens[4];
    }
    return %model;
}
 
sub uploadModelListLength{
    my ($self, $file, $dir) = @_;
    my $manager = new RRCResultsManager();
    my %model = $manager->get_new_model();
    my $infile = sprintf("%s/%s", $dir, $file);
    if (open(IN, "< $infile")){
	my $l = <IN> ; # skip header
        while(defined($l = <IN>)){
	   chomp $l;
	   #domain model range 10 10p05 L5 L5p05 L2 L2p05 FL FLp05
	   my @tokens = split(/\s+/, $l);
	   my $modelname = $tokens[1];
	   foreach  my $list_size (qw/FL L1 L2 L5 TOP10/){
                foreach my $prob_filter (qw/0 0.5/){
		   %model = $manager->get_new_model();
		   %model = $self->parseModelName($modelname, $file, %model);
		   %model = $self->parseModelListLength($l, $list_size, $prob_filter, %model);
		   my $id = $manager->exist_by_parameters(%model);
                   if (defined($id) && $id > 0){
                        $model{id} = $id;
                        $manager->update(%model);
                   } else {
			# do nothing
                        #$model{id} = $manager->add(%model);
                   }
		}
	   }
	}
        close IN;
    }
}

sub upload_results{
    my ($self, $file, $dir) = @_;
    my $manager = new RRCResultsManager();
    my %model = $manager->get_new_model();
    my $infile = sprintf("%s/%s", $dir, $file);
    if (open(IN, "< $infile")){
	my $l = <IN>; # read header
	while(defined($l = <IN>)){
	   # 
	   chomp $l;
	   if ($l =~ m/^$/){next;}
	   my @tokens = split(/\s+/, $l);
	   # list_size = "FL"  
	   my $modelname = $tokens[0];
	   foreach  my $list_size (qw/FL L1 L2 L5 TOP10/){
		foreach my $prob_filter (qw/0 0.5/){
		   %model = $manager->get_new_model();
		   %model = $self->parseModelName($modelname, $file, %model);
		   %model = $self->parseModelScores2($l, $list_size, $prob_filter, %model);
		   if (!(defined($model{prec}) && defined($model{recall}) && defined($model{f1}) )){next;}
		   my $id = $manager->exist_by_parameters(%model);
		   if (defined($id) && $id > 0){
			$model{id} = $id;
			$manager->update(%model);
		   } else {
			$model{id} = $manager->add(%model);
		   }
		}
	   }
	}
	close(IN);
    }
}

sub parseRRCESScores{
    my ($self, $l, $list_size, $prob_filter, %model) = @_;
    my @tokens = split(/,/, $l);
    if ($list_size eq "FL" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces} = $tokens[5];
    }
    if ($list_size eq "FL" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces} = $tokens[10];
    }
    if ($list_size eq "L1" && $prob_filter eq "0"){
	$model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} = $tokens[4];
    }
    if ($list_size eq "L1" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} = $tokens[9];
    }
    if ($list_size eq "L2" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} = $tokens[3];
    }
    if ($list_size eq "L2" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} =  $tokens[8];
    }
    if ($list_size eq "L5" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} = $tokens[2];
    }
    if ($list_size eq "L5" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} = $tokens[7];
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} = $tokens[1];
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
	$model{rrces} = $tokens[6];
    }
    return %model;
}

sub upload_results_rrces{
    my ($self, $file, $dir) = @_;
    my $manager = new RRCResultsManager();
    my $infile = sprintf("%s/%s", $dir, $file);
    if (open(IN, "< $infile")){
        my $l = <IN>; # read header
        while(defined($l = <IN>)){
           # Model,10p0,L5p0,L2p0,L1p0,FLp0,10p05,L5p05,L2p05,L1p05,FLp05
           my @tokens = split(/,/, $l);
           my $modelname = $tokens[0];
           foreach my $list_size (qw/FL L1 L2 L5 TOP10/){
                foreach my $prob_filter (qw/0 0.5/){
		   my %model = $manager->get_new_model();
		   %model = $self->parseModelName($modelname, $file, %model);
		   %model = $self->parseRRCESScores($l, $list_size, $prob_filter, %model);
        	   my $id = $manager->exist_by_parameters(%model);
	           if (defined($id) && $id > 0){
	                $model{id} = $id;
        	        $manager->update(%model);
	           } else {
    #    	        $model{id} = $manager->add(%model);
	           }
		}
	   }
        }
        close(IN);
    }
}

sub upload_results_rrces_ext{
    my ($self, $file, $dir) = @_;
    my $manager = new RRCResultsManager();
    my $infile = sprintf("%s/%s", $dir, $file);
    if (open(IN, "< $infile")){
        my $l = <IN>; # read header
        while(defined($l = <IN>)){
           # Model,10p0,L5p0,L2p0,FLp0,10p05,L5p05,L2p05,FLp05
           my @tokens = split(/,/, $l);
           my $modelname = $tokens[0];
           foreach my $list_size (qw/FL L1 L2 L5 TOP10/){
                foreach my $prob_filter (qw/0 0.5/){
                   my %model = $manager->get_new_model();
                   %model = $self->parseModelName($modelname, $file, %model);
                   %model = $self->parseRRCESScores_ext($l, $list_size, $prob_filter, %model);
                   my $id = $manager->exist_by_parameters(%model);
                   if (defined($id) && $id > 0){
                        $model{id} = $id;
                        $manager->update(%model);
                   } else {
    #                   $model{id} = $manager->add(%model);
                   }
                }
           }

        }
        close(IN);
    }
}

sub parseRRCESScores_ext{
    my ($self, $l, $list_size, $prob_filter, %model) = @_;
    my @tokens = split(/,/, $l);
    if ($list_size eq "FL" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[5];
    }
    if ($list_size eq "FL" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[10];
    }
    if ($list_size eq "L1" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[4];
    }
    if ($list_size eq "L1" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[9];
    }
    if ($list_size eq "L2" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[3];
    }
    if ($list_size eq "L2" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} =  $tokens[8];
    }
    if ($list_size eq "L5" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[2];
    }
    if ($list_size eq "L5" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[7];
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[1];
    }
    if ($list_size eq "TOP10" && $prob_filter eq "0.5"){
        $model{list_size} = $list_size;
        $model{prob_filter} = $prob_filter;
        $model{rrces_ext} = $tokens[6];
    }
    return %model;
}


sub upload_AUC_PR_coords{
    my ($self, $file, $dir) = @_;
    my $infile = sprintf("%s/%s", $dir, $file);
    if (open(IN, "< $infile")){
	my $manager = new RRCResultsManager();
	my %model = $manager->get_new_model();
	%model = $self->parseModelName2($file, $dir);
	my $pr_x = ''; my $pr_y = '';
	#my $pr_coord = '';
	while(defined(my $l = <IN>)){
	  if ($l =~ m/^(\S+)\s+(\S+)$/){
		my $tmp_x = $1; my $tmp_y = $2;
		$pr_x .= sprintf("%.2f,", $tmp_x); 
		$pr_y .= sprintf("%.5f,", $tmp_y);
		#$pr_coord .= sprintf("%.2f:%.5f,", $tmp_x, $tmp_y); 
	  }
	}
	$pr_x =~ s/,$//;
	$pr_y =~ s/,$//;
	#$pr_coord =~ s/,$//;
	close IN;
	$model{list_size} = 'FL';
	$model{prob_filter} = '0';
	$model{pr_x} = $pr_x;
	$model{pr_y} = $pr_y;
	#$model{pr_coord} = $pr_coord;
	my $id = $manager->exist_by_parameters(%model);
        if (defined($id) && $id > 0){
		$model{id} = $id;
		$manager->update(%model);
	} else {
#		$model{id} = $manager->add(%model);
	}
    }
}

sub upload_AUC_PR_java{
    my ($self, $file, $dir) = @_;
    my $infile = sprintf("%s/%s", $dir, $file);
    if (open(IN, "< $infile")){
        my $manager = new RRCResultsManager();
        my %model = $manager->get_new_model();
        %model = $self->parseModelName2($file, $dir);
	my $auc_pr_java = undef;
        while(defined(my $l = <IN>)){
          if ($l =~ m/^Area\s+Under\s+the\s+Curve\s+for\s+Precision\s+-\s+Recall\s+is\s+(\S+)/){
		$auc_pr_java = $1;
		last;
          }
        }
        close IN;
        $model{list_size} = 'FL';
        $model{prob_filter} = '0';
        $model{auc_pr_java} = $auc_pr_java;
        my $id = $manager->exist_by_parameters(%model);
        if (defined($id) && $id > 0){
                $model{id} = $id;
                $manager->update(%model);
        } else {
#               $model{id} = $manager->add(%model);
        }
    }
}


1;

