package ResultsUploadManager;

use strict;
use warnings;

use DBI;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use DateTime;

use lib qw(Core);
use lib qw(Classes);

use Database;

use PDBUtils;

use Configuration;
use LocalConfiguration;
use Statistics;


use ResultsManager;
use ResultsTargetManager;
use ResultsTemplatesManager;
use ResultsRefinementManager;
use ResultsTargetRefinementManager;
use QAAnalysisManager;
use QAResultsManager;

use ImagesManager;
use TargetsManager;
use SmithWaterman;
use String;
use Email;
my $resultsupload_manager = undef;

#Regexp definition for parsing:
my $GDT_DISTANCE_CUTOFF = "GDT DIST_CUTOFF[\\s]+[0-9]+";
my $GDT_No_CA_max ="GDT NUMBER_CA [\\s]+[0-9]+";
my $GDT_No_OF_CA_Tg = "GDT PERCENT_CA [\\s]+[0-9]+";
my $GDT_RMS_LOCAL = "GDT RMS_LOCAL";
my $NUMBER_OF_CA_Tg = "NUMBER_CA";

my $CRN_LINE = "CRN = ALL/NP  . . . . .";

#my $CRMSCA_LINE = "TEST\s\(CA\)\s\sRMS\s=";

my $PERC_RES_LINE = "PERCENT_CA";
my $ALL_LINE = "ALL . . . . . . . . . .";
my $SOVO_LINE = "SOV observed";
my $LCS_LINE = "^LCS_GDT[\\s]+\\S+\\s+[0-9]+\\s+\\S+\\s+[0-9]+\\s+";
my $SSP_LINE = "^\\sSSP[\\s]+[0-9]+";
my $ERROR_LINE = "# ERROR";
my $SUMMARY_LINE = "^SUMMARY";
my $FILE_NAME_FORMAT = "^(.{5,10})(TS|RR|QA)(.{3})_(.{1})";
my $FILE_NAME_FORMAT_PARENT = "^(.{5,10})(TS|RR|QA)(.{3})_(.{1})_(.{1})";
my $FILE_NAME_FORMAT_PARENT_DOMAIN = "^(.{5,10})(TS|RR|QA)(.{3})_(.{1})_(.{1})-D([0-9]+)";
my $FILE_NAME_FORMAT_DOMAIN =        "^(.{5,10})(TS|RR|QA)(.{3})_(.{1})-D([0-9]+)";


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;
}

sub parce_filename {
    my ($self, $file_name, %model) = @_;
    # The format file name should be
    # T[targetsufix 1 latter][target number 3 digets ][PFRMAT 2 letters][Group Code 3 digites]_[Model number 1 digit]_[parent number 1 diget]-[domain number 1 digits]
    # Example T0420AL020_4_2-1
    # TODO: this format could be improved for domain number

print "FILE " . $file_name ."\n";

if($file_name=~/$FILE_NAME_FORMAT_PARENT_DOMAIN/) {
print "CASE 4 \n";
	$model{TARGET} = $1;
        $model{PFRMAT} = $2;
        $model{CODE} = $3;
        $model{MODEL} = $4;
        $model{parent} = $5;
        $model{domain} = $6;
    } elsif ($file_name=~/$FILE_NAME_FORMAT_DOMAIN/) {
print "CASE 2 \n";
	$model{TARGET} = $1;
        $model{PFRMAT} = $2;
        $model{CODE} = $3;
        $model{MODEL} = $4;
        $model{parent} = 0;
        $model{domain} = $5;
    } elsif($file_name=~/$FILE_NAME_FORMAT_PARENT/) {
print "CASE 3 \n";
	$model{TARGET} = $1;
        $model{PFRMAT} = $2;
        $model{CODE} = $3;
        $model{MODEL} = $4;
        $model{parent} = $5;
        $model{domain} = 0;
    }
 elsif($file_name=~/$FILE_NAME_FORMAT/) {

 print "CASE 1 \n";
 	$model{TARGET} = $1;
         $model{PFRMAT} = $2;
         $model{CODE} = $3;
         $model{MODEL} = $4;
         $model{parent} = 0;
         $model{domain} = 0;
     }

#print $file_name . $model{domain} . "HELLO!";

    return %model;
}

sub upload_lga_tr {
	my ($self, $file_name, $file_dir, $type, $table_name) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);
	my $rr_manager = new ResultsRefinementManager();
	my %rr_model = $rr_manager->get_new_model();
	%rr_model = $self->parce_filename($file_name, %rr_model);

	$rr_model{predictions_id} = $rr_manager->get_predictions_id(%rr_model);

	#TODO: If prediction are not exist - return null or exit
	# need some notification or log info for such case
	if($rr_model{predictions_id} eq '' || $rr_model{predictions_id} == 0 ) {
	    print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	    return 0;
	}

	if(open(FILE, $file)) {
	    while(<FILE>) {
		my $line = $_;
# RMSD_GDC results:       CA      MC common percent     ALL common percent   GDC_mc  GDC_all   GDC_at
#NUMBER_OF_ATOMS_AA:      123     492    492  100.00     953    953  100.00               123      104
					 #SUMMARY(RMSD_GDC):      5.323   5.329   5.386  46.899   41.558  31.276
		if($line =~ /^SUMMARY\(RMSD_GDC\):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		    $rr_model{lga_4_tr} = $6;
		}
	    }
	    close(FILE);
	} else {
	    print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}
	########### ALIGNMENT alignment_4

	my $target_manager = new TargetsManager();
	my $targets_id = $target_manager->get_id_by_name($rr_model{TARGET});
	my %target_info = $target_manager->info($targets_id);

	$rr_model{id} = $rr_manager->exist_by_parameters(%rr_model);
	$rr_model{parent} = $rr_model{parent} eq 'c' ? 0 :$rr_model{parent} ;
	if ($rr_model{id} ne '' && $rr_model{id} != 0) {

	    $rr_manager->update(%rr_model);
	} else {
	    $rr_model{id} = $rr_manager->add(%rr_model);
	}
	$rr_manager->ToString("\n", %rr_model);

    return $result;

}

sub upload_gdt_sc {
	my ($self, $file_name, $file_dir, $type, $table_name) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);
	my $r2_manager = new ResultsManager();
	my %rr_model = $r2_manager->get_new_model();
	%rr_model = $self->parce_filename($file_name, %rr_model);

	$rr_model{predictions_id} = $r2_manager->get_predictions_id(%rr_model);

	#TODO: If prediction are not exist - return null or exit
	# need some notification or log info for such case
	if($rr_model{predictions_id} eq '' || $rr_model{predictions_id} == 0 ) {
	    print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	    return 0;
	}

	if(open(FILE, $file)) {
	    while(<FILE>) {
		my $line = $_;
# RMSD_GDC results:       CA      MC common percent     ALL common percent   GDC_mc  GDC_all   GDC_at
#NUMBER_OF_ATOMS_AA:      123     492    492  100.00     953    953  100.00               123      104
					 #SUMMARY(RMSD_GDC):      5.323   5.329   5.386  46.899   41.558  31.276
		if($line =~ /^SUMMARY\(RMSD_GDC\):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		    $rr_model{lga_4_tr} = $6;
		}
	    }
	    close(FILE);
	} else {
	    print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}
	########### ALIGNMENT alignment_4

	my $target_manager = new TargetsManager();
	my $targets_id = $target_manager->get_id_by_name($rr_model{TARGET});
	my %target_info = $target_manager->info($targets_id);

	$rr_model{id} = $r2_manager->exist_by_parameters(%rr_model);
	$rr_model{parent} = $rr_model{parent} eq 'c' ? 0 :$rr_model{parent} ;
	if ($rr_model{id} ne '' && $rr_model{id} != 0) {

	    $r2_manager->update_results(%rr_model);
	} else {
	    $rr_model{id} = $r2_manager->add(%rr_model);
	}
	$r2_manager->ToString("\n", %rr_model);

    return $result;

}

# this method was rewritten by BM
# because in evaluation system for sequence dependent analysis we use lga with parameter -gdc_sc,
# which allows us to fetch data rms_ca, rms_all and gdt_sc from one file (lga output)
# in this case it's needless to run ace (remind, we fetched rms_all data from ace outputfile)
sub upload_lga {
	my ($self, $file_name, $file_dir, $type) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);

	my $results_manager = new ResultsManager();
	my %results_model = $results_manager->get_new_model();
	%results_model = $self->parce_filename($file_name, %results_model);
	$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

	#TODO: If prediction are not exist - return null or exit
	# need some notification or log info for such case
	if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
		print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
		return 0;
	}

	my $valid_data = 0;
	if(open(FILE, $file)) {
		while(<FILE>) {
			my $line = $_;
				      #CA            N1   N2   DIST      N    RMSD    GDT_TS    LGA_S3     LGA_Q
				     #SUMMARY(GDT)   82   83    4.0     79    1.26    86.446    91.767     5.817
			if($line =~ /^SUMMARY\((GDT|LGA)\)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
			    $valid_data ++;
				if($type == 4) {
					$results_model{n1_4} = $2;
					$results_model{n2_4} = $3;
					$results_model{dist_4} = $4;
					$results_model{nres_4} = $5;
					$results_model{rmsd_4} = $6;
					$results_model{gdt_ts_4} = $7;
					$results_model{lga_s_4} = $8;
					$results_model{lga_q_4} = $9;
				} else {
					$results_model{n1_5} = $2;
					$results_model{n2_5} = $3;
					$results_model{dist_5} = $4;
					$results_model{nres_5} = $5;
					$results_model{rmsd_5} = $6;
					$results_model{gdt_ts_5} = $7;
					$results_model{lga_s_5} = $8;
					$results_model{lga_q_5} = $9;
				}
			}
				# RMSD_GDC results:       CA      MC common percent     ALL common percent   GDC_mc  GDC_all   GDC_at
				#SUMMARY(RMSD_GDC):     7.844          7.751                  9.166           23.843   20.993   10.109
			if($line =~ /^SUMMARY\(RMSD_GDC\):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/){
				if($type == 4){
					$results_model{ace_rms_ca} = $1;
					$results_model{ace_rms_all} = $3;
					$results_model{lga_4_tr} = $6;
					$results_model{gdc_all} = $5;
				}
			}

			if($line =~ /^GDT PERCENT_AT\s+(.*)/) {
				if($type == 4) {
					$results_model{gdt_ca_percentage_4} = $1;
				}
			}
			if($line =~ /^LGA_ASGN_ATOMS RMSD:\s+(\S+)\s+Number of assigned atoms:\s+(\S+).*/) {
				if($type == 4) {
					$results_model{asgn_4} = $2;
					$results_model{np_p_4} = (($results_model{n2_4} == 0 && $results_model{n2_4} ne '') ? 0 : (($results_model{asgn_4}/$results_model{n2_4})*100));
				}
			}
			if($line =~ /^GDT PERCENT_AT\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
			    if($type == 4) {
				$results_model{gdt_ha_4} = (($1 + $2 + $4 + $8)/4);
			    }
			}
		}
		close(FILE);

	} else {
		print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}
	########### ALIGNMENT alignment_4
	if($type == 4) {
		my $target_manager = new TargetsManager();
		my $targets_id = $target_manager->get_id_by_name($results_model{TARGET});
		my %target_info = $target_manager->info($targets_id);
		$results_model{alignment_4} = $self->get_LGA_distances($target_info{NUMBER_OF_AA}, $file);
	}

	####need to check if data not empty - if yes set model with default data:
	if ($valid_data eq 0) {
	    if($type == 4) {
		    $results_model{n1_4} = 0;
		    $results_model{n2_4} = 0;
		    $results_model{dist_4} = 0;
		    $results_model{nres_4} = 0;
		    $results_model{rmsd_4} = 0;
		    $results_model{gdt_ts_4} = 0;
		    $results_model{lga_s_4} = 0;
		    $results_model{lga_q_4} = 0;
		    $results_model{gdt_ca_percentage_4} = 0;
		    $results_model{asgn_4} = 0;
		    $results_model{np_p_4} = 0;
		    $results_model{gdt_ha_4} = 0;
	    } else {
		    $results_model{n1_5} = 0;
		    $results_model{n2_5} = 0;
		    $results_model{dist_5} = 0;
		    $results_model{nres_5} = 0;
		    $results_model{rmsd_5} = 0;
		    $results_model{gdt_ts_5} = 0;
		    $results_model{lga_s_5} = 0;
		    $results_model{lga_q_5} = 0;
	    }
	}




	$results_model{id} = $results_manager->exist_by_parameters(%results_model);

#print "\nRESULT ID: $results_model{id}\n";
	if ($results_model{id} ne '' && $results_model{id} != 0) {
		$results_manager->update_results(%results_model);
	} else {
#print "\n!!!!! add !!!\n";
		$results_model{id} = $results_manager->add(%results_model);

	}

	#TODO check new model through $results_manager->info
	#$results_manager->ToString("\n", %results_model);



    ### 1 need to parce file name for prediction indentification
    ### we have to know a foloowing parameters for indentification
    ### a) Target name b) group code c) PFRMAT d) Model number
    ### a few additional parameters if exist:
    ### parent number and domain number if not exist use 0 value for them


    ### 2 check if results record is exist for this prediction and update it
    ### if not add new record to rasults table
    ### NOTE: please use Results Model from ResultsManager.pm

    ###

    return $result;
}

sub upload_mammoth {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
	    print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	    return 0;
    }
    my $valid_data = 0;
    my $n = undef;
    my $trigger = 0;
    if(open(FILE, $file)) {
        my $star_seq = '';
        my $pred_seq = '';
        my $exp_seq  = '';
	while(<FILE>) {
	    my $line = $_;
	    if ($line =~ m/^==> PREDICTION/){
		$line = <FILE>; $line = <FILE>;
                $line = <FILE>; chomp $line;
                if ($line =~ m/^\s+Number of residues:\s+(\d+)/){
                      $n = $1;
                }
	    }
	    #Z-score=      14.855727        -ln(E)=      14.330478
	    if($line =~ /^Z-score=\s+(\S+)\s+-ln\(E\)=\s+(\S+).*/) {
		$results_model{z_score_m} = $1;
		$results_model{ln_e_m} = $2;
		$valid_data++;
	    }
            if ($line =~ /Final Structural Alignment/){
                        $trigger = 1;
                        next;
            }
            if ($trigger == 1 && $line =~ m/\*/ && $line =~ m/^\s{11}[\*\s]+$/){
               $star_seq .= substr($line, 10);
               # Prediction CDWEEISVKG PNGESSVIHD RKSGKKFSIE EALQSGRLTP AHYDRYVNKD
               $line = <FILE>;
               chomp $line;
               $pred_seq .= substr($line, 10);
               $line =<FILE>; $line=<FILE>; $line=<FILE>;
               $line =<FILE>;
               chomp $line;
               $exp_seq  .= substr($line, 10);
               $line=<FILE>;
            }
	    #calc alignment
	    my $count = 0;
	    for(my $i = 0; $i < length($pred_seq); $i++){
	           if (substr($star_seq,$i,1) eq '*'
        	        && substr($pred_seq,$i,1) eq substr($exp_seq,$i,1)
                	){
                        $count++;
           	    }
	    }
	    if (defined($n) && $n != 0){
                $results_model{mammoth_p_align} = sprintf("%.4f",100.0*$count/$n);
	    } else {
		$results_model{mammoth_p_align} = sprintf("%.4f",0.0);
	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
	$results_model{z_score_m} = 0;
	$results_model{ln_e_m} = 0;
	$results_model{mammoth_p_align} = 0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
	$results_manager->update_results(%results_model);
    } else {
	$results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}

sub upload_lddt {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #Global LDDT score: 0.4495
            if($line =~ /^Global\s+LDDT\s+score:\s+(\S+).*/) {
                $results_model{lddt} = $1;
                $valid_data++;
		last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{lddt} = -999.999;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
	if (defined($results_model{TARGET}) && $results_model{TARGET} =~ m/^[TRSNFAXLsnfaxl]/){
	  my $alignment = $self->parse_lddt_alignment($file);
          if (defined($alignment)) {
             $results_manager->add_alignment($results_model{id}, 'lddt', $alignment);
          }
	}
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}

sub parse_lddt_alignment {
    my ($self, $file) = @_;
    my $result = undef;
    if (open FILE, "< $file") {
        my $triger = 0;
        $result = '';
        while(defined(my $l = <FILE>)){
            chomp $l;
            # test for line-triger of the data source
            # Chain   ResName ResNum  ...
            if ($l =~ m/^Chain\s+ResName\s+/) {
                $triger = 1;
                next;
            }
            if ($triger == 1) {
                #Chain   ResName ResNum  Asses.  Q.Prob. Score   (Conserved/Total, over 4 thresholds)
                #A       ALA     2       Yes     No      0.8794  (1516/1724)
                if ($l =~ m/^\S{0,}\s+\S+\s+(\d+)\s+\S+\s+\S+\s+(\S+)/) {
                   my $res = $1; my $score = $2;
		   if ($score ne '-'){
                      $result .= "$res:$score ";
		   }
                }
            }
        }
        close FILE;
        chomp $result;
    } else {
        print sprintf("ERROR: Can't open file %s", $file);
    }
    return $result;
}


sub upload_rpf {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #0.4495
            if($line =~ /^([0-9\-]\S+)/) {
                $results_model{rpf} = $1;
                $valid_data++;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{rpf} = -999.999;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}


sub upload_flexe {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #/local/CASP13/MODELS//TR828/TR828TS342_4 4.10 16.45 9.32
            if($line =~ /^\S+\s+\S+\s+(\S+)\s+\S+/) {
                $results_model{flexe} = $1;
                $valid_data++;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{flexe} = -1.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}

sub upload_rf {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #T0759TS008_1-D2 5.33
            if($line =~ /^\S+\s+(\S+)/) {
                $results_model{rf} = $1;
                $valid_data++;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{rf} = -1.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}



# upload ce
sub upload_ce {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
	my $nn_aa; # length of sequence, use d for normaliazation
        while(<FILE>) {
            my $line = $_;
	    # Align T0760.pdb.pdb 201 with T0760TS184_1.pdb 242
	    if ($line =~ m/^Align\s+\S+\s+(\S+)/) {
                        $nn_aa = $1;
                }
	    # Twists 0 ini-len 201 ini-rmsd 2.88 opt-equ 191 opt-rmsd 2.47 chain-rmsd 2.47 Score 513.08 align-len 216 gaps 25 (11.57%)

                if ($line =~ m/align-len\s+(\d+)\s+gaps\s+(\d+)/){
                        my $total_align = $1; my $no_gaps = $2;
                        if (defined($nn_aa) && $nn_aa != 0){
                                $results_model{ce_p_align} = sprintf("%.4f", 100.0*($total_align - $no_gaps)/$nn_aa);
				$valid_data++;
                        }
                }
	    # Z-score 6.58 Afp-num 6 Identity 92.67% Similarity 93.72%
                if ($line =~ m/^Z-score\s+(\S+)/){
                        $results_model{ce} = $1;
			$valid_data++;
                        last;
                }

        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data != 2) {
        $results_model{ce} = -1.0;
	$results_model{ce_p_align} = 0.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}


# upload qcs and conts
sub upload_qcs {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #scores_for_model        99.5411278772   97.7723652941   93.5882401754   96.4832470606   97.8590624055   78.3019458099   93.9243314371   89.5217810602
            if($line =~ /^scores_for_model/) {
                my @tokens = split(/\s+/, $line);
		$results_model{qcs} = $tokens[8];
		$results_model{conts} = $tokens[6];
                $valid_data++;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{qcs} = -1.0;
	$results_model{conts} = -1.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}

# upload sov
sub upload_sov {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #SOV_NORMALIZED: 100.00
            if($line =~ /^SOV_NORMALIZED:\s+(\S+)/) {
                $results_model{sov} = $1;
                $valid_data++;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{sov} = -1.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}


# upload sov
sub upload_contsintra {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            if($line =~ /^\S+\s+(\S+)/) {
                $results_model{contsintra} = $1;
                $valid_data++;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{contsintra} = 0.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}

# upload tm_align
sub upload_tm_align {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    my $star_seq = '';
    my $pred_seq = '';
    my $targ_seq  = '';
    my $n = undef;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            if ($line =~ m/^Length of Chain_1:\s+(\d+)/){
                $n = $1;
            }
            #TM-score= 0.44017 (if normalized by length of Chain_1)
            if($line =~ /^TM-score=\s+(\S+)\s+\(if normalized by length of Chain_1\)/) {
                $results_model{tm_align} = $1;
                $valid_data++;
            }
            if ($line =~ m/denotes aligned residue pairs of d/){
                $line = <FILE>; chomp $line;
                $targ_seq = $line;
                $line = <FILE>; chomp $line;
                $star_seq = $line;
                $line = <FILE>; chomp $line;
                $pred_seq = $line;
                last;
           }
        }
        close(FILE);
        # calc alignment
        my $count = 0;
        for(my $i = 0; $i < length($pred_seq); $i++){
           if (substr($star_seq,$i,1) eq ':'
                && substr($pred_seq,$i,1) eq substr($targ_seq,$i,1)
                ){
                        $count++;
           }
        }
        if (defined($n) && $n != 0){
          $results_model{tm_n_align} = sprintf("%.4f", 100.0*$count/$n);
        } else {
          $results_model{tm_n_align} = sprintf("%.4f", 0.0);
        }
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{tm_align} = -1.0;
        $results_model{tm_n_align} = 0.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}


# upload tm_score
sub upload_tm_score {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #TM-score = 0.44017
            if($line =~ /^TM-score\s*=\s+(\S+)/) {
                $results_model{tm_score} = $1;
                $valid_data++;
		last;
            }
        }
        close(FILE);

    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    if ($valid_data eq 0) {
        $results_model{tm_score} = -1.0;
    }


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}


sub upload_sg_py {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $sphere_index = 6;
    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not associate file prediction with DB \n $file \n";
            return 0;
    }
    my $alignment = "";
    if(open(FILE, $file)) {
	while(<FILE>) {
            my $line = $_;
	    #162   ASP;0.0|1.0;0.04559941360083554|1.0;...
            if($line =~ /^\d+\s+[A-Z]{3};/) {
		my @tokens = split(/;/, $line);
                if ($tokens[$sphere_index] =~ m/([0-9]{1,}\.{0,1}[0-9]{1,})\|([0-9]{1,}\.{0,1}[0-9]{1,})/){
                   my $cur_rmsd = $1;
                   my $fr = $2; # fraction of atoms, the rmsd was calculated at 
                   if ($fr == 0){next;}
		   if ($tokens[0] =~ m/^(\d+)/){
                        my $res = $1;
                        $alignment .= sprintf("%d:%.3f ", $res, $cur_rmsd/$fr);
                   }
		}
	    }
	    if ($line =~ m/Global\s+score:\s+(\S+)/){
		my $score = $1;
		$results_model{sg_py} = sprintf("%8.5f", 100.0*$score);
	    }
	}	
	close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
	 
        if (defined($results_model{TARGET}) && $results_model{TARGET} =~ m/^[TRNSFAXLnsfaxl]/) {
          if (defined($alignment) && $alignment ne '') {
            $results_manager->add_alignment($results_model{id}, 'sg_py', $alignment);
          }
        }
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    return $result;

}
#
# sg_lvr score is calculated as mean between perc_6_2 and perc_6_4
# perc_6_2 - percentage of residues under cutoff 2A for sphere radius 6A
# rmsd parsed from the file is adjusted by fraction of atoms at which it was calculated
# so the condition : rmsd/fraction <= cutoff
# in database the field sg_lvr_6_2 was used
sub upload_sg_lvr {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $sphere_index = 6;
    my $rmsd_cutoff1 = 2.0;
    my $rmsd_cutoff2 = 4.0;
    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $alignment = "";
    my $count_sphere = 0;
    my $count_sphere_cutoff1 = 0;
    my $count_sphere_cutoff2 = 0; # count spheres under cutOff adjusted (i.e. weighted by the fraction of atoms at which the rmsd was calculated)
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #162   ASP;0.0|1.0;0.04559941360083554|1.0;...
            if($line =~ /^\d+\s+[A-Z]{3};/) {
		$count_sphere++;
		my @tokens = split(/;/, $line);
		if ($tokens[$sphere_index] =~ m/([0-9]{1,}\.{0,1}[0-9]{1,})\|([0-9]{1,}\.{0,1}[0-9]{1,})/){
		   my $cur_rmsd = $1;
		   my $fr = $2; # fraction of atoms at which rmsd was calculated
		   if ($fr == 0){next;}
		   # adjust the rmsd
		   if ( $cur_rmsd/$fr <= $rmsd_cutoff1) {
			$count_sphere_cutoff1++;
		   }
		   if ( $cur_rmsd/$fr <= $rmsd_cutoff2) {
                        $count_sphere_cutoff2++;
                   }
		   if ($tokens[0] =~ m/^(\d+)/){
			my $res = $1;
			$alignment .= sprintf("%d:%.3f ", $res, $cur_rmsd/$fr);
		   }
		}
            }
        }
	if ($count_sphere > 0){
	  $results_model{sg_lvr_6_2} = sprintf("%8.5f", 100.0 * (0.5*($count_sphere_cutoff1 + $count_sphere_cutoff2)/$count_sphere));
#	  $results_model{sg_lvr_6_2_a} = sprintf("%8.5f", 100.0 * ($count_sphere_cutoff_a/$count_sphere))
	}
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
	if (defined($results_model{TARGET}) && $results_model{TARGET} =~ m/^[TRNSFAXLnsfaxl]/) {
	  if (defined($alignment) && $alignment ne '') {
            $results_manager->add_alignment($results_model{id}, 'sg_lvr', $alignment);
          }
	}

    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    return $result;
}

sub upload_refinement_sg_lvr_results {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $sphere_index = 6;
    my $rmsd_cutoff1 = 2.0;
    my $rmsd_cutoff2 = 4.0;
    my $results_manager = new ResultsRefinementManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $alignment = "";
    my $count_sphere = 0;
    my $count_sphere_cutoff1 = 0;
    my $count_sphere_cutoff2 = 0; # count spheres under cutOff adjusted (i.e. weighted by the fraction of atoms at which the rmsd was calculated)
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #162   ASP;0.0|1.0;0.04559941360083554|1.0;...
            if($line =~ /^\d+\s+[A-Z]{3};/) {
                $count_sphere++;
                my @tokens = split(/;/, $line);
                if ($tokens[$sphere_index] =~ m/([0-9]{1,}\.{0,1}[0-9]{1,})\|([0-9]{1,}\.{0,1}[0-9]{1,})/){
                   my $cur_rmsd = $1;
                   my $fr = $2; # fraction of atoms at which rmsd was calculated
                   if ($fr == 0){next;}
                   # adjust the rmsd
                   if ( $cur_rmsd/$fr <= $rmsd_cutoff1) {
                        $count_sphere_cutoff1++;
                   }
                   if ( $cur_rmsd/$fr <= $rmsd_cutoff2) {
                        $count_sphere_cutoff2++;
                   }
                   if ($tokens[0] =~ m/^(\d+)/){
                        my $res = $1;
                        $alignment .= sprintf("%d:%.3f ", $res, $cur_rmsd/$fr);
                   }
                }
            }
        }
        if ($count_sphere > 0){
          $results_model{sg_lvr_6_2} = sprintf("%8.5f", 100.0 * (0.5*($count_sphere_cutoff1 + $count_sphere_cutoff2)/$count_sphere));
#         $results_model{sg_lvr_6_2_a} = sprintf("%8.5f", 100.0 * ($count_sphere_cutoff_a/$count_sphere))
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }
    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update(%results_model);
    } else {
        $results_model{id} = $results_manager->add(%results_model);
    }
    if (defined($alignment) && $alignment ne '') {
       $results_manager->add_alignment($results_model{id}, 'sg_lvr', $alignment);
    }

    return $result;
}

sub upload_refinement_sg_py_results {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $sphere_index = 6;
    my $results_manager = new ResultsRefinementManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not associate file prediction with DB \n $file \n";
            return 0;
    }
    my $alignment = "";
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #162   ASP;0.0|1.0;0.04559941360083554|1.0;...
            if($line =~ /^\d+\s+[A-Z]{3};/) {
                my @tokens = split(/;/, $line);
                if ($tokens[$sphere_index] =~ m/([0-9]{1,}\.{0,1}[0-9]{1,})\|([0-9]{1,}\.{0,1}[0-9]{1,})/){
                   my $cur_rmsd = $1;
                   my $fr = $2; # fraction of atoms, the rmsd was calculated at 
                   if ($fr == 0){next;}
                   if ($tokens[0] =~ m/^(\d+)/){
                        my $res = $1;
                        $alignment .= sprintf("%d:%.3f ", $res, $cur_rmsd/$fr);
                   }
                }
            }
            if ($line =~ m/Global\s+score:\s+(\S+)/){
                my $score = $1;
                $results_model{sg_py} = sprintf("%8.5f", 100.0*$score);
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update(%results_model);

        if (defined($alignment) && $alignment ne '') {
            $results_manager->add_alignment($results_model{id}, 'sg_py', $alignment);
        }
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    return $result;
}



sub upload_cad_score {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($file_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
            return 0;
    }
    my $valid_data = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #AA 0.585525
            if($line =~ /^AA\s+(\S+).*/) {
                $results_model{cad_aa} = $1;
                # $valid_data++;
            }
=head
            if($line =~ /^AM\s+(\S+).*/) {
                $results_model{cad_am} = $1;
                # $valid_data++;
            }
            if($line =~ /^AS\s+(\S+).*/) {
                $results_model{cad_as} = $1;
                # $valid_data++;
            }
            if($line =~ /^MA\s+(\S+).*/) {
                $results_model{cad_ma} = $1;
                # $valid_data++;
            }
            if($line =~ /^MM\s+(\S+).*/) {
                $results_model{cad_mm} = $1;
                # $valid_data++;
            }
            if($line =~ /^MS\s+(\S+).*/) {
                $results_model{cad_ms} = $1;
                # $valid_data++;
            }
            if($line =~ /^SA\s+(\S+).*/) {
                $results_model{cad_sa} = $1;
                # $valid_data++;
            }
            if($line =~ /^SM\s+(\S+).*/) {
                $results_model{cad_sm} = $1;
                # $valid_data++;
            }
=cut
            if($line =~ /^SS\s+(\S+).*/) {
                $results_model{cad_ss} = $1;
                # $valid_data++;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    ####need to check if data not empty - if yes set model with default data:
    #if ($valid_data eq 0) {
    #    $results_model{} = -999.999;
    #}


    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return $result;
}



sub upload_lga_rms_ca {
	my ($self, $file_name, $file_dir, $type) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);

	my $results_manager = new ResultsManager();
	my %results_model = $results_manager->get_new_model();
	%results_model = $self->parce_filename($file_name, %results_model);
	$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

	#TODO: If prediction are not exist - return null or exit
	# need some notification or log info for such case
	if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
		print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
		return 0;
	}

	my $valid_data =0;
	if(open(FILE, $file)) {
		while(<FILE>) {
			my $line = $_;

			if($line =~ /^Std_ASGN_ATOMS RMSD:\s+(\S+)\s+(.*)/) {
				if($type == 4) {
				    $results_model{ace_rms_ca} = $1;
				    $valid_data++;
				}
			}
		}
		close(FILE);

	} else {
		print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}

	###need to check if data not empty - if yes set model with default data:
	if ($valid_data eq 0) {
	    $results_model{ace_rms_ca} = 0;
	}


	$results_model{id} = $results_manager->exist_by_parameters(%results_model);
	#print "\nRESULT ID: $results_model{id}\n";
	if ($results_model{id} ne '' && $results_model{id} != 0) {
		$results_manager->update_results(%results_model);
	} else {
	#print "\n!!!!! add !!!\n";
		$results_model{id} = $results_manager->add(%results_model);
	}

	#TODO check new model through $results_manager->info
	#$results_manager->ToString("\n", %results_model);

    return $result;
}

sub upload_ace {
	my ($self, $file_name, $file_dir, $type) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);

	my $results_manager = new ResultsManager();
	my %results_model = $results_manager->get_new_model();


###TODO: this part TMP ADDED
### need to improve file extention


	%results_model = $self->parce_filename($file_name, %results_model);
	$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

	#TODO: If prediction are not exist - return null or exit
	# need some notification or log info for such case
	if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
		print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
		return 0;
	}

	my $ace_rms_all_flag = 0;
	my $valid_data =0;
	if(open(FILE, $file)) {
		while(<FILE>) {
			my $line = $_;
#print "$line \n";
			### RMS CA --> MOVED FROM LGA 4
			########### RMS CA
			#if($line =~ /^\s*TEST \(CA\)  RMS =\s+(\S+).*/) {
			#	$results_model{ace_rms_ca} = $1;
			#}
			########### RMS ALL
			if($line =~ /^\s*\(ALL\) RMS:                   CRMSALL.*/) {
				$ace_rms_all_flag = 1;
			}
			if($ace_rms_all_flag > 0) {
				if($line =~ /^\s*ALL . . . . . . . . . .\s+(\S+).*/) {
					$results_model{ace_rms_all} = $1;
					$ace_rms_all_flag = 0;
				}

			}
			###########
		}

		close(FILE);

	} else {
		print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}

	###need to check if data not empty - if yes set model with default data:
	if (!defined($results_model{ace_rms_all})) {
	    $results_model{ace_rms_all} = 0;
	}

	$results_model{id} = $results_manager->exist_by_parameters(%results_model);
	if ($results_model{id} ne '' && $results_model{id} != 0) {
		$results_manager->update_results(%results_model);
	} else {
		$results_model{id} = $results_manager->add(%results_model);

	}

	#TODO check new model through $results_manager->info
	#$results_manager->ToString("\n", %results_model);



    ### 1 need to parce file name for prediction indentification
    ### we have to know a foloowing parameters for indentification
    ### a) Target name b) group code c) PFRMAT d) Model number
    ### a few additional parameters if exist:
    ### parent number and domain number if not exist use 0 value for them


    ### 2 check if results record is exist for this prediction and update it
    ### if not add new record to rasults table
    ### NOTE: please use Results Model from ResultsManager.pm

    ###

    return $result;
}

sub upload_caca {
	my ($self, $file_name, $file_dir) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);

	if(open(FILE, $file)) {
	    while(<FILE>) {
		my $line = $_;
		########### T0387TS213_5: 1/0 collisions
		if($line =~ /^(\S+):\s+(\S+)\/(\S+)\s+collisions\s+.*/) {
		    my $model_name = $1;
		    my $errors = $2;

		    if ($errors > 0 ) {
			my $results_manager = new ResultsManager();
			my %results_model = $results_manager->get_new_model();
			%results_model = $self->parce_filename($model_name, %results_model);
			$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

			#TODO: If prediction are not exist - return null or exit
			# need some notification or log info for such case
			if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
				print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
				print  "UPLOAD IS NOT FINISHED!!!!!\n";
				return 0;
			}
			$results_model{errors_caca} = $errors;

			$results_model{id} = $results_manager->exist_by_parameters(%results_model);
			if ($results_model{id} ne '' && $results_model{id} != 0) {
			    $results_manager->update_results(%results_model);
			} else {
			    $results_model{id} = $results_manager->add(%results_model);
			}
			#$results_manager->ToString("\n", %results_model);
		    }
		}
		if($line =~ /^(\S+):\s+(\S+)\s+\/\s+(\S+)\s+mean\/standard_dev\s+.*/) {
		    my $model_name = $1;
		    my $mean = $2;
		    my $standard_dev = $3;

		    if ($mean > 0 or $standard_dev > 0) {
			my $results_manager = new ResultsManager();
			my %results_model = $results_manager->get_new_model();
			%results_model = $self->parce_filename($model_name, %results_model);
			$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

			#TODO: If prediction are not exist - return null or exit
			# need some notification or log info for such case
			if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
				print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
				print  "UPLOAD IS NOT FINISHED!!!!!\n";
				return 0;
			}

			$results_model{mean} = $mean;
			$results_model{standard_dev} = $standard_dev;

			$results_model{id} = $results_manager->exist_by_parameters(%results_model);
			if ($results_model{id} ne '' && $results_model{id} != 0) {
			    $results_manager->update_results(%results_model);
			} else {
			    $results_model{id} = $results_manager->add(%results_model);
			}
			#$results_manager->ToString("\n", %results_model);
		    }
		}
	    }
		close(FILE);
	} else {
		print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}
	return $result;
}

sub upload_prosa {
        my ($self, $file_name, $file_dir) = @_;
        my $result = 0;
        my $file  = sprintf("%s/%s", $file_dir, $file_name);
	if (open(FILE,$file)) {
	   while(defined(my $line = <FILE>)){
		if($line =~ m/^molecule\s+/){next;}
		if($line =~ m/^[^TR]/){next;} # name of target should start with T or R first letter
		if($line =~ m/^(\S+)\s+(\S+)\s+([-]{0,}[0-9]+\.{0,}[0-9]+)\s+/){
		   my $model_name = $1;
		   my $score_z_comb = $3;
		   my $results_manager = new ResultsManager();
		   my %results_model = $results_manager->get_new_model();
		   %results_model = $self->parce_filename($model_name, %results_model);

		   $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
		   if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0){
			print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
                        print  "UPLOAD IS NOT FINISHED!!!!!\n";
                        return 0;
		   }
		   $results_model{prs_z_comb} = $score_z_comb;
		   $results_model{id} = $results_manager->exist_by_parameters(%results_model);

		   if ($results_model{id} ne '' && $results_model{id} != 0) {
                            $results_manager->update_results(%results_model);
                   } else {
#                            $results_model{id} = $results_manager->add(%results_model);
                   }

		}
	   }
	   close(FILE);
	}else{
		print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}
	return $result;
}

sub upload_molprobity {

        my ($self, $file_name, $file_dir) = @_;
        my $result = 0;
        my $file  = sprintf("%s/%s", $file_dir, $file_name);
        if (open(FILE,$file)) {
           while(defined(my $line = <FILE>)){
                if($line =~ m/^#/){next;} # comment lines
                if($line =~ m/^[^HOTRNSFAXLnsfaxl]/){next;} # name of target should start with T or R first letter
		my @array = split(/:/,$line);
		if($array[0] =~ m/^[HOTRNSFAXLnsfaxl][0-9]{4}(s[1-9]){0,1}(-D\d+){0,1}TS[0-9]{3}_[1-5].*\.pdb$/){
			my $model_name = $array[0];
			$model_name =~ s/\.pdb$//; # remove extension
			my $results_manager = new ResultsManager();
			my $mp_clash = ( !defined($array[8]) || $array[8] eq '' ) ? '' : $array[8];
			my $mp_rot_out = (!defined($array[17]) || !defined($array[18]) || $array[18] == 0 || $array[18] eq '' || $array[17] eq '' ) ? '': 100*$array[17]/$array[18];
			my $mp_ram_out = ( !defined($array[22]) || !defined($array[19]) || $array[22] == 0 || $array[22] eq '' || $array[19] eq '' ) ? '' : 100*$array[19]/$array[22];
			my $mp_ram_fv = (!defined($array[22]) || !defined($array[21]) || $array[22] == 0 || $array[22] eq '' || $array[21] eq '' ) ? '' : 100*$array[21]/$array[22];
			my $mp_score = (!defined($array[31]) || $array[31] eq '' ) ? '': $array[31];
			my %results_model = $results_manager->get_new_model();
			%results_model = $self->parce_filename($model_name, %results_model);

			$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
			if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0){
				print  "ERROR!!!: Can not assotiate file prediction with DB \n $line \n";
				print  "UPLOAD IS NOT FINISHED!!!!!\n";
				next;  # return 0;
			}
			$results_model{mp_clash} = $mp_clash;
			$results_model{mp_rot_out} = $mp_rot_out;
			$results_model{mp_ram_out} = $mp_ram_out;
			$results_model{mp_ram_fv} = $mp_ram_fv;
			$results_model{mp_score} = $mp_score;

			$results_model{id} = $results_manager->exist_by_parameters(%results_model);

			if ($results_model{id} ne '' && $results_model{id} != 0) {
                            $results_manager->update_results(%results_model);
			} else {
#			    $results_model{id} = $results_manager->add(%results_model);
			}

		}
           }
           close(FILE);
        }else{
                print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
        }
        return $result;

}

# upload BK's scores
sub upload_BKscores {

        my ($self, $file_name, $file_dir) = @_;
        my $result = 0;
        my $file  = sprintf("%s/%s", $file_dir, $file_name);
        if (open(FILE,$file)) {
           while(defined(my $line = <FILE>)){
                if($line =~ m/^#/){next;} # comment lines
                if($line =~ m/^[^HOTRNSFAXLnsfaxl]/){next;} 
		if($line =~ m/^Model/){next;}
                my @array = split(/\s+/,$line);
                if($array[0] =~ m/^[HOTRNSFAXLnsfaxl][0-9]{4}(s[1-9]){0,1}([_\-]D\d+){0,1}TS[0-9]{3}_[1-5].*/){
                        my $model_name = $array[0];
                        my $results_manager = new ResultsManager();
                        my $codm = ( !defined($array[1]) || $array[1] eq '' ) ? '' : $array[1];
                        my $codm_ratio = ( !defined($array[2]) || $array[2] eq '' ) ? '' : $array[2];
                        my $dfm = ( !defined($array[3]) || $array[3] eq '' ) ? '' : $array[3];
                        my $handedness = ( !defined($array[4]) || $array[4] eq '' ) ? '' : $array[4];
                        my $handedness_ratio = (!defined($array[5]) || $array[5] eq '' ) ? '': $array[5];
                        my %results_model = $results_manager->get_new_model();
                        %results_model = $self->parce_filename($model_name, %results_model);

                        $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
                        if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0){
                                print  "ERROR!!!: Can not assotiate file prediction with DB \n $line \n";
                                print  "UPLOAD IS NOT FINISHED!!!!!\n";
                                next;  # return 0;
                        }
                        $results_model{codm} = $codm;
                        $results_model{codm_ratio} = $codm_ratio;
                        $results_model{dfm} = $dfm;
                        $results_model{handedness} = $handedness;
                        $results_model{handedness_ratio} = $handedness_ratio;

                        $results_model{id} = $results_manager->exist_by_parameters(%results_model);

                        if ($results_model{id} ne '' && $results_model{id} != 0) {
                            $results_manager->update_results(%results_model);
                        } else {
#                           $results_model{id} = $results_manager->add(%results_model);
                        }

                }
           }
           close(FILE);
        }else{
                print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
        }
        return $result;

}


# upload RDC scores
sub upload_RDCscores {

        my ($self, $file_name, $file_dir) = @_;
        my $result = 0;
        my $file  = sprintf("%s/%s", $file_dir, $file_name);
        if (open(FILE,$file)) {
           while(defined(my $line = <FILE>)){
                if($line =~ m/^#/){next;} # comment lines
                if($line =~ m/^[^HOTRNSFAXLnsfaxl]/){next;}
                my @array = split(/\s+/,$line);
                if($array[0] =~ m/^[HOTRNSFAXLnsfaxl][0-9]{4}(s[1-9]){0,1}([_\-]D\d+){0,1}TS[0-9]{3}_[1-5].*/){
                        my $model_name = $array[0];
			my $rdc = $array[1];
                        my $results_manager = new ResultsManager();
                        my %results_model = $results_manager->get_new_model();
                        %results_model = $self->parce_filename($model_name, %results_model);

                        $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
                        if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0){
                                print  "ERROR!!!: Can not assotiate file prediction with DB \n $line \n";
                                print  "UPLOAD IS NOT FINISHED!!!!!\n";
                                next;  # return 0;
                        }
			if ($file_name =~ m/rdc1$/) {
				$results_model{rdc1} = $rdc;
			} elsif ($file_name =~ m/rdc2$/) {
				$results_model{rdc2} = $rdc;
			}

                        $results_model{id} = $results_manager->exist_by_parameters(%results_model);

                        if ($results_model{id} ne '' && $results_model{id} != 0) {
                            $results_manager->update_results(%results_model);
                        } else {
#                           $results_model{id} = $results_manager->add(%results_model);
                        }

                }
           }
           close(FILE);
        }else{
                print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
        }
        return $result;

}

# upload DP scores
sub upload_DPscores {
        my ($self, $file_name, $file_dir) = @_;
        my $result = 0;
        my $file  = sprintf("%s/%s", $file_dir, $file_name);
        if (open(FILE,$file)) {
           while(defined(my $line = <FILE>)){
                if($line =~ m/^#/){next;} # comment lines
                if($line =~ m/^[^HOTRNSFAXLnsfaxl]/){next;}
                my @array = split(/\s+/,$line);
                if($array[0] =~ m/^[HOTRNSFAXLnsfaxl][0-9]{4}(s[1-9]){0,1}([_\-]D\d+){0,1}TS[0-9]{3}_[1-5].*/){
                        my $model_name = $array[0];
                        my $dp = $array[1];
                        my $results_manager = new ResultsManager();
                        my %results_model = $results_manager->get_new_model();
                        %results_model = $self->parce_filename($model_name, %results_model);

                        $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
                        if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0){
                                print  "ERROR!!!: Can not assotiate file prediction with DB \n $line \n";
                                print  "UPLOAD IS NOT FINISHED!!!!!\n";
                                next;  # return 0;
                        }
                        $results_model{dp} = $dp;

                        $results_model{id} = $results_manager->exist_by_parameters(%results_model);

                        if ($results_model{id} ne '' && $results_model{id} != 0) {
                            $results_manager->update_results(%results_model);
                        } else {
#                           $results_model{id} = $results_manager->add(%results_model);
                        }

                }
           }
           close(FILE);
        }else{
                print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
        }
        return $result;

}



sub upload_mvsm {
	my ($self, $file_name, $file_dir, $type) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);

	my $ace_rms_all_flag = 0;

	if(open(FILE, $file)) {
		while(<FILE>) {
			my $line = $_;
			########### RMS
#print "new line \n";
	#		if($line =~ /^(\S+)\t(\S+)\t(\S+)$/) {
			if($line =~ /^(\S+)\t(\S+)\t(\S+)\t(\S+)$/) {
				my $rms = $1;
				my $model_1 = $2;
				my $model_2 = $3;
				my $gdt_ts = $4;

			if ($rms < 0.5 ) {

				my $results_manager = new ResultsManager();
				my %results_model_1 = $results_manager->get_new_model();
				my %results_model_2 = $results_manager->get_new_model();

#my @names = split('-to-', $file_name);
#print "$names[0] --TO-- $names[1]\n";

				%results_model_1 = $self->parce_filename($model_1, %results_model_1);
				%results_model_2 = $self->parce_filename($model_2, %results_model_2);

				#my $predictions_1_id  = $results_manager->get_predictions_id(%results_model_1);
				#my $predictions_2_id  = $results_manager->get_predictions_id(%results_model_2);

				my $result1_id  = $results_manager->exist_by_parameters(%results_model_1);
				my $result2_id  = $results_manager->exist_by_parameters(%results_model_2);


				#TODO: If prediction are not exist - return null or exit
				# need some notification or log info for such case
				if($result1_id eq '' || $result1_id == 0 || $result2_id eq '' || $result2_id == 0 ) {
					print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
					#return 0;
					next;
				}


				# Upload RMS too mvsm_result table
				my $results_mvsm_id = $results_manager->exist_mvsm($result1_id, $result2_id);
print "MODEL: $rms -- $model_1 --- $model_2 PREDICTIONS ID: $result1_id $result2_id  --$results_mvsm_id-- \n"; ##############

				#print "\nRESULT ID: $results_model{id}\n";
				if ($results_mvsm_id ne '' && $results_mvsm_id != 0) {
					$results_manager->update_results_mvsm($result1_id, $result2_id, $rms, $gdt_ts);
					print "UPDATE!!!\n";
				} else {
					$results_mvsm_id = $results_manager->add_mvsm($result1_id, $result2_id, $rms, $gdt_ts);
					print "ADD!!!!!!\n";
				}
				$results_mvsm_id = 0;
				$results_mvsm_id = $results_manager->exist_mvsm($result2_id, $result1_id);

				#print "\nRESULT ID: $results_model{id}\n";
# )				if ($results_mvsm_id ne '' && $results_mvsm_id != 0) {
# |					$results_manager->update_results_mvsm($result2_id, $result1_id, $rms, $gdt_ts);
# |					print "UPDATE!!!\n";
#  > BM we calculate 			} else {
# |	separately		$results_mvsm_id = $results_manager->add_mvsm($result2_id, $result1_id, $rms, $gdt_ts);
# |for pairs (model1,model2)		print "ADD!!!!!!\n";
# )	and (model2,model1)			}

			}
			}
		}
		close(FILE);
	} else {
		print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}
	return $result;
}

sub update_mvsm_results {
	my ($self, $result_id) = @_;


	my $result = 0;
	my $pc01 = 0;
	my $pc05 = 0;
	my $query = sprintf("SELECT count(id) FROM casp13.results_mvsm WHERE result2_id=%s  and rms < 0.1", $result_id);
	my $sth = $self->{_database}->query($query);
	#print $query ."\n";
	if(defined($sth) && ($sth->rows() > 0)) {
		($pc01) = $sth->fetchrow_array();
	}
print $query ."\n\n";

	$query = sprintf("SELECT count(id) FROM casp13.results_mvsm WHERE result2_id=%s  and rms < 0.5", $result_id);
	$sth = $self->{_database}->query($query);
	if(defined($sth) && ($sth->rows() > 0)) {
		($pc05) = $sth->fetchrow_array();
	}
print $query ."\n\n";
	$query = sprintf("UPDATE casp13.results SET pc01=%s, pc05=%s WHERE (id = %d)", $pc01, $pc05, $result_id);
	$sth = $self->{_database}->query($query);
	if(defined($sth)) {
		$result = 1;
	}

print $query ."\n\n";
	return $result;
}

sub update_rank {
    my ($self, $target) = @_;
    my $result = 0;
    my $rank_all = 0;
    my $rank_all_to_set;
    my $rank_m1 = 0;
    my $rank_m2 = 0;
    my $rank_m3 = 0;
    my $rank_m4 = 0;
    my $rank_m5 = 0;

    my $rank_m1_to_set = 0;
    my $rank_m2_to_set = 0;
    my $rank_m3_to_set = 0;
    my $rank_m4_to_set = 0;
    my $rank_m5_to_set = 0;

    my $gdt_ts_all = 0;
    my $gdt_ts_m1 = 0;
    my $gdt_ts_m2 = 0;
    my $gdt_ts_m3 = 0;
    my $gdt_ts_m4 = 0;
    my $gdt_ts_m5 = 0;

    my $sub_query = "";
    if(defined($target) && ($target ne '')) {
	if ($target =~ /^R/){
		$sub_query .= sprintf(" and pr.target=\'%s\' ", $target);
                $sub_query .= sprintf(" and re.domain = 0 ");	
	} elsif ($target =~ /^(\S+)-D(\S+)/) {
		$sub_query .= sprintf(" and pr.target=\'%s\' ", $1);
		$sub_query .= sprintf(" and re.domain=\'%s\' ", $2);
	} else {
		$sub_query .= sprintf(" and pr.target=\'%s\' ", $target);
		$sub_query .= sprintf(" and re.domain = 0 ");
	}

    }

    my $query = sprintf("select re.id, re.gdt_ts_4, pr.model  from casp13.results re join casp13.predictions pr on re.predictions_id = pr.id
    where 1=1 %s order by re.gdt_ts_4 DESC", $sub_query);
    my $sth = $self->{_database}->query($query);
    print $query . "\n";

    if(defined($sth) && ($sth->rows() > 0)) {
	my $index = 1;
	#my @results = ();
	while(my($id, $gdt_ts, $model) = $sth->fetchrow_array()) {
	    $rank_all++;
	    if ($gdt_ts_all !=  $gdt_ts) {
		#$rank_all++;
		$rank_all_to_set = $rank_all;
		$gdt_ts_all = $gdt_ts;
	    }

	    $query = sprintf("UPDATE casp13.results SET rank_all=%s WHERE (id = %d)", $rank_all_to_set, $id);
	    my $sth_rank = $self->{_database}->query($query);
	    if(defined($sth_rank)) {
		    $result = 1;
	    }
	    my $rank_model = 0;
	    if ($model eq '1' ) {
		$rank_m1++;
		if ($gdt_ts_m1 !=  $gdt_ts) {
		    #$rank_m1++;
		    $rank_m1_to_set = $rank_m1;
		    $gdt_ts_m1 = $gdt_ts;
		}
		#$rank_model = $rank_m1;
		$rank_model = $rank_m1_to_set;
	    }
	    if ($model eq '2' ) {
		$rank_m2++;
		if ($gdt_ts_m2 !=  $gdt_ts) {
		    #$rank_m2++;
		    $rank_m2_to_set = $rank_m2;
		    $gdt_ts_m2 = $gdt_ts;
		}
		#$rank_model = $rank_m2;
		$rank_model = $rank_m2_to_set;
	    }
	    if ($model eq '3' ) {
		$rank_m3++;
		if ($gdt_ts_m3 !=  $gdt_ts) {
		    #$rank_m3++;
		    $rank_m3_to_set = $rank_m3;
		    $gdt_ts_m3 = $gdt_ts;
		}
		#$rank_model = $rank_m3;
		$rank_model = $rank_m3_to_set;

	    }
	    if ($model eq '4' ) {
		$rank_m4++;
		if ($gdt_ts_m4 !=  $gdt_ts) {
		    #$rank_m4++;
		    $rank_m4_to_set = $rank_m4;
		    $gdt_ts_m4 = $gdt_ts;
		}
		#$rank_model = $rank_m4;
		$rank_model = $rank_m4_to_set;
	    }
	    if ($model eq '5' ) {
		$rank_m5++;
		if ($gdt_ts_m5 !=  $gdt_ts) {
		    #$rank_m5++;
		    $rank_m5_to_set = $rank_m5;
		    $gdt_ts_m5 = $gdt_ts;
		}
		#$rank_model = $rank_m5;
		$rank_model = $rank_m5_to_set;
	    }

	    $query = sprintf("UPDATE casp13.results SET rank_model=%s WHERE (id = %d)", $rank_model, $id);
	    $sth_rank = $self->{_database}->query($query);
	    if(defined($sth_rank)) {
		    $result = 1;
	    }
	}
    }

    # update ranks for 1st models of server groups only
    $query = sprintf("select re.id, re.gdt_ts_4  from casp13.results re 
      join casp13.predictions pr on re.predictions_id = pr.id
      join casp13.groups gr on pr.groups_id = gr.id
      where 1=1 %s and pr.model=1 and gr.type>0
      order by re.gdt_ts_4 DESC", $sub_query);
    my $sth_s = $self->{_database}->query($query);
    my $rank_s_m1 = 0;
    my $count = 0;
    my $gdt_ts_s_m1 = 0;
    if (defined($sth_s) && ($sth_s->rows() > 0)){
	while(my($id, $gdt_ts) = $sth_s->fetchrow_array()){
		$count++;
		if($gdt_ts_s_m1 != $gdt_ts){
			$rank_s_m1 = $count;
			$gdt_ts_s_m1 = $gdt_ts;
		}
		$query = sprintf("UPDATE casp13.results SET rank_server_m1=%s WHERE (id=%d)", $rank_s_m1, $id);
		my $rank_sth_s = $self->{_database}->query($query);
		if(defined($rank_sth_s)) {
                    $result = 1;
                }
	}
    }
    return $result;
}

sub add_update_results_targets {
    my ($self, $target_full) = @_;
my $result = 0;
    return $result;
}

sub join_lga_with_ace {
	my ($self, $lga_dir, $ace_dir, $lga_ace_dir, $target) = @_;
	my $count = 0;
	my $results_manager = new ResultsManager();
	my @results = $results_manager->get_results({'target'=> $target});

	if (!(-e $lga_ace_dir)) {
		system("mkdir " . $lga_ace_dir);
	}

	for(my $r_count = 0; $r_count < scalar(@results); $r_count++) {
		my $file_name = $results_manager->build_model_name($results[$r_count]->{TARGET}, $results[$r_count]->{PFRMAT}, $results[$r_count]->{CODE}, $results[$r_count]->{MODEL}, $results[$r_count]->{PARENT}, $results[$r_count]->{DOMAIN});;

		##TODO: should be added case for domain format
		#if($results[$r_count]->{parent} eq '0') {
		#	$file_name = sprintf("%s%s%s_%s", $results[$r_count]->{TARGET}, $results[$r_count]->{PFRMAT}, $results[$r_count]->{CODE}, $results[$r_count]->{MODEL});
		#} else {
		#	$file_name = sprintf("%s%s%s_%s_%s", $results[$r_count]->{TARGET}, $results[$r_count]->{PFRMAT}, $results[$r_count]->{CODE}, $results[$r_count]->{MODEL}, $results[$r_count]->{parent});
		#}

		system(sprintf("cp %s/%s.lga %s/%s", $lga_dir, $file_name, $lga_ace_dir, $file_name));

		if(open(FILE_OUT, sprintf(">>%s/%s", $lga_ace_dir, $file_name))) {
			if(open(FILE, sprintf("%s/%s\.ace", $ace_dir, $file_name))) {
				my $start_flag = 0;
				while(<FILE>) {
					chomp;
					my $line_file = $_;

					if($line_file =~ /^#      ACE results:      \#.*/) {
						print FILE_OUT sprintf("\n");
						print FILE_OUT sprintf("##########################\n");
						print FILE_OUT sprintf("#                        #\n");
						$start_flag = 1;
					}

					if($line_file =~ /^\#                                                     \#.*/ ||
					$line_file =~ /^\#                ----------------- 11\/2000            \#.*/ ||
					$line_file =~ /^\#                         by                          \#.*/ ||
					$line_file =~ /^\#                     Adam Zemla                      \#.*/ ||
					$line_file =~ /^\#         Protein Structure Prediction Center         \#.*/ ||
					$line_file =~ /^\#      Lawrence Livermore National Laboratory, CA     \#.*/ ||
					$line_file =~ /^\*\*\* error opening file ESR.info for read \*\*\*.*/
					|| $start_flag == 0)
					{
						#continue => skip ACE header info
					} else {
						print FILE_OUT sprintf("%s\n", $line_file);
					}
				}
				close(FILE);
				print "ACE: " . $r_count . " " . $file_name . "\n";
			} else {
				print sprintf("ERROR!!! Can not open ACE file %s/%s\.ace  \n", $ace_dir , $file_name);
			}
			close(FILE_OUT);
			#system (sprintf("chmod 777 %s/%s", $lga_ace_dir, $file_name));
		} else {
			print sprintf("ERROR!!! Can not open LGA file %s/%s\.lga  \n", $lga_dir , $file_name);
		}
		system (sprintf("chmod 777 %s -R", $lga_ace_dir));
	}

	return $count;
}

sub upload_eqv_alignment {
	my ($self, $file_name, $file_dir) = @_;

	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);

	my $results_manager = new ResultsManager();
	my %results_model = $results_manager->get_new_model();

	%results_model = $self->parce_filename($file_name, %results_model);
	$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

	if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
		print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
		return 0;
	}

	my %eqv_results = ();
	my @eqv_counter = (0, 0, 0);

	if(open(FILE, $file)) {
		while(<FILE>) {
			my $line = $_;
			if($line =~ /^LGA\s+\S+\s+(\S+)\s+\S+\s+(\S+)\s+(\S+)/) {
				my $index1 = $1;
				my $index2 = $2;
				my $distance = $3;

				if(($index1 =~ /\d+/) && ($index2 =~ /\d+/) && ($distance ne '-') && ($distance ne '#')) {
					$index1 =~ /(\d+)/;
					$index1 = $1;

					$index2 =~ /(\d+)/;
					$index2 = $1;

					my $difference = $index1 - $index2;

					if ($difference == 0) {
						$eqv_results{$index2} = 3;
						$eqv_counter[0]++;
					} elsif (($difference <= 4) && ($difference >= -4)) {
						$eqv_results{$index2} = 2;
						$eqv_counter[1]++;
					} else {
						$eqv_results{$index2} = 1;
						$eqv_counter[2]++;
					}
				} else {
					if($index2 =~ /\d+/) {
						$index2 =~ /(\d+)/;
						$index2 = $1;

						$eqv_results{$index2} = 0;
					}
				}
			}
		}
		close(FILE);
	} else {
		printf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}

	$results_model{eqv_alignment} = '';
	$results_model{eqv0} = $eqv_counter[0];
	$results_model{eqv4} = $eqv_counter[0] + $eqv_counter[1];
	$results_model{eqvi} = $eqv_counter[0] + $eqv_counter[1] + $eqv_counter[2];

	my @keys = sort {$a <=> $b} keys %eqv_results;
	my $start = $keys[0];
	my $end  = $keys[$#keys];
	for (my $key = $start; $key<=$end; $key++) {
		if (defined($eqv_results{$key})){
		   $results_model{eqv_alignment} .= $eqv_results{$key} . ' ';
		} else {
		   $results_model{eqv_alignment} .= '0 '; # insert 0 if in target structure there is gap
		}
	}

#	foreach my $key (sort {$a <=> $b} keys %eqv_results) {
#		$results_model{eqv_alignment} .= $eqv_results{$key} . ' ';
#	}

	$results_model{id} = $results_manager->exist_by_parameters(%results_model);

	if ($results_model{id} ne '' && $results_model{id} != 0) {
		$results_manager->update_results(%results_model);
	} else {
		$results_model{id} = $results_manager->add(%results_model);
	}

    return $result;
}

sub upload_al_alignment {
	my ($self, $targets_dir, $target_file, $models_dir, $model_file) = @_;

	my $result = 0;

	my $results_manager = new ResultsManager();
	my %results_model = $results_manager->get_new_model();

	%results_model = $self->parce_filename($model_file, %results_model);
	$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

	if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
		print  "ERROR!!!: Can not assotiate file prediction with DB \n $model_file \n";
		return 0;
	}

	$results_model{al0} = -1;
	$results_model{al4} = -1;
	$results_model{al4x} = -1;
	$results_model{al0p} = -1;
	$results_model{al4p} = -1;
	$results_model{al4xp} = -1;
	if(open(AL_FILE, sprintf("Core/bin/al -ns %s %s %s %s |", $targets_dir, $models_dir, $target_file, $model_file))) {
		while(<AL_FILE>) {
			chomp;
			my $line = $_;
			if($line =~ /^\S+\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/) {
				$results_model{al0} = $1;
				$results_model{al4} = $2;
				$results_model{al4x} = $3;
				$results_model{al0p} = $4;
				$results_model{al4p} = $5;
				$results_model{al4xp} = $6;
			}
		}
		close(AL_FILE);
	}

	$results_model{id} = $results_manager->exist_by_parameters(%results_model);

	if ($results_model{id} ne '' && $results_model{id} != 0) {
		$results_manager->update_results(%results_model);
	} else {
		$results_model{id} = $results_manager->add(%results_model);
	}

    return $result;
}

sub upload_results_targets {
	my ($self, $target) = @_;
	my $result = 0;
	my $results_target_manager = new ResultsTargetManager();
	my %rt_model = $results_target_manager->get_new_model();
	$rt_model{NAME} = $target;
	$rt_model{TARGET} = $results_target_manager->get_target_from_full_target_name($rt_model{NAME});
	$rt_model{domains_real_index} = $results_target_manager->get_domain_from_full_target_name($rt_model{NAME});
	if ($rt_model{domains_real_index} > 0) {
		$rt_model{domains_index} = $rt_model{domains_real_index};
	}
	my $tm = new TargetsManager();
	$rt_model{targets_id} = $tm->get_id_by_name($rt_model{TARGET});
	$rt_model{is_public} = '1';

	if($target =~ m/^[HORNSFAXLnsfaxl][0-9]{4}/){
	  $rt_model{access_type} = '1'; # for refinement and assissted targets access_type = 1 by default
	} elsif($target =~ m/^-D[1-9]$/){
          $rt_model{access_type} = '1'; # for domains 1-9 access_type = 1 by default
        }else{
	  $rt_model{access_type} = '';
	}

        my $results_manager = new ResultsManager();
	$rt_model{avr_gdt_ts_20s} = $results_manager->get_avg_gdt_ts_20s($rt_model{TARGET}, $rt_model{domains_real_index});

	$rt_model{id} = $results_target_manager->exist_by_parameters(%rt_model);

	if ($rt_model{id} > 0 ) {
		print "------UPDATE \n";
		$results_target_manager->update(%rt_model);
	} else {
		print "------ADD \n";
		$results_target_manager->add(%rt_model);
	}

	$results_target_manager->ToString("\n", %rt_model);

	return $result;
}

sub upload_al_alignment_new {
	my ($self, $targets_dir, $target_file, $models_dir, $model_file) = @_;

	my $result = 0;

	my $results_manager = new ResultsManager();
	my %results_model = $results_manager->get_new_model();

	%results_model = $self->parce_filename($model_file, %results_model);
	$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

	if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
		print  "ERROR!!!: Can not assotiate file prediction with DB \n $model_file \n";
		return 0;
	}

	$results_model{al0} = -1;
	$results_model{al4} = -1;
	$results_model{al4x} = -1;
	$results_model{al0p} = -1;
	$results_model{al4p} = -1;
	$results_model{al4xp} = -1;
	#print( $targets_dir . "-" . $models_dir . "-" . $target_file . "-" . $model_file);

	## that used to be commented by Oleh. Uncommented on 16th June 2010
	#if(open(AL_FILE, sprintf("Core/bin/al -ns %s %s %s %s |", $targets_dir, $models_dir, $target_file, $model_file))) {
	#	while(<AL_FILE>) {
	#		chomp;
	#		my $line = $_;
	#
	#		if($line =~ /^\S+\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/) {
	#			$results_model{al0} = $1;
	#			$results_model{al4} = $2;
	#			$results_model{al4x} = $3;
	#			$results_model{al0p} = $4;
	#			$results_model{al4p} = $5;
	#			$results_model{al4xp} = $6;
	#		}
	#	}
	#	close(AL_FILE);
	#}

	($results_model{al0},$results_model{al4},$results_model{al4x},$results_model{al0p},$results_model{al4p},$results_model{al4xp})
	 = alignment_scores_sw($targets_dir. $target_file, $models_dir. $model_file, "" );
#	($target_file, $model_file, $chain, $alignment_file)

	$results_model{id} = $results_manager->exist_by_parameters(%results_model);

	if ($results_model{id} ne '' && $results_model{id} != 0) {
		$results_manager->update_results(%results_model);
	} else {
		$results_model{id} = $results_manager->add(%results_model);
	}

    return $result;
}

sub generate_gdt_images {
    my ($self, $target_name) = @_;
    #my $targets_manager = new TargetsManager();
    #my $target_id = $targets_manager->get_id_by_name($target_name);

    my $results_manager = new ResultsManager();
    my @gdt_data = $results_manager->get_gdt_results(0, $target_name);

    my $images_dir = sprintf("%s/%s", $LOCAL_CONFIG->{GDT_PLOTS_DIR}, $target_name);
    system(sprintf("mkdir -p %s", $images_dir)); # create images directory unless it's already exist

    my $image_manager = new ImagesManager();

    my $extra_url_parameters = '';
    my $image_file = sprintf("%s/%s.%s.png", $images_dir, $target_name, 'first'); # default image file
					#$target,    $gdt_data, $output_file_path, $view_first_only, $highlight_type, $filter_params, $map_url_params
    $image_manager->generate_gdt_image($target_name, \@gdt_data, $image_file, 1, '', '', '');
    $image_file = sprintf("%s/%s.%s.png", $images_dir, $target_name, 'all'); # default image file
    $image_manager->generate_gdt_image($target_name, \@gdt_data, $image_file, 0, '', '', '');

    #add generate GDT IMAGES for all groups

    my @groups = $results_manager->groups_list({pfrmat=>'3D', target => $target_name});

    for(my $i = 0; $i < scalar(@groups); $i++) {
	#
	##show_related
	print $target_name . ":" . $groups[$i]{CODE} . "\n";
	my %filter_params = ('GROUP' => $groups[$i]{CODE}, 'MODEL' => 1);
	my $image_file = sprintf("%s/%s.%s.%s.png", $images_dir, $target_name, $groups[$i]{CODE}, 'first'); # default image file
	#$target,    $gdt_data, $output_file_path, $view_first_only, $highlight_type, $filter_params, $map_url_params
	$image_manager->generate_gdt_image($target_name, \@gdt_data, $image_file, 1, 'show_related_small', \%filter_params, '');
	%filter_params = ('GROUP' => $groups[$i]{CODE}, 'MODEL' => 0);
	$image_file = sprintf("%s/%s.%s.%s.png", $images_dir, $target_name, $groups[$i]{CODE}, 'all'); # default image file
	print $image_file . "\n";
	$image_manager->generate_gdt_image($target_name, \@gdt_data, $image_file, 0, 'show_related_small', \%filter_params, '');
    }

    #
    #my $group_code = '';
    #    my $model_index = '';
    #    if($self->{_model} =~ /T\d{4}\S{2}(\d{3})\_(\d{1}).*/) {
    #        $group_code = $1;
    #        $model_index = $2;
    #    }
    #
    #    my %filter_params = ('GROUP' => $group_code, 'MODEL' => $model_index);
    #    $image_manager->generate_gdt_image($target_name, \@gdt_data, $image_file, ($self->{_models} eq 'first') ? 1 : 0, $self->{_filter}, \%filter_params, sprintf("target=%s&models=%s", $target_name, $self->{_models}));
    #
    #


}

sub generate_al_small_images {
    my ($self, $target_name) = @_;

    my $results_manager = new ResultsManager();

    ###ALL MODELS
    my $parameters = {'target' => $target_name, 'model'=>'', 'field' => 'al0p', 'order' => 'DESC'};
    my @results = $results_manager->get_results($parameters);
    my $results_count = scalar(@results);
    my $images_dir = sprintf("%s/%s", $LOCAL_CONFIG->{AL_PLOTS_DIR}, $target_name);
    system(sprintf("mkdir -p %s", $images_dir));
    my $image_manager = new ImagesManager();
    my $image_file = sprintf("%s/%s.all.small.png", $images_dir, $target_name);
    $image_manager->generate_al_small_image($target_name, $image_file, '', @results);
    #for all groups
    my @groups = $results_manager->groups_list({pfrmat=>'3D', target => $target_name});
    for(my $i = 0; $i < scalar(@groups); $i++) {
	my $images_dir = sprintf("%s/%s", $LOCAL_CONFIG->{AL_PLOTS_DIR}, $target_name);
	system(sprintf("mkdir -p %s", $images_dir));
	my $image_file = sprintf("%s/%s.%s.all.small.png", $images_dir, $target_name, $groups[$i]{CODE});
	$image_manager->generate_al_small_image($target_name, $image_file, $groups[$i]{CODE}, @results);
	print "IMG:" . $image_file . "\n";
    }




    #####FIRST MODEL
    $parameters = {'target' => $target_name, 'model'=>'1', 'field' => 'al0p', 'order' => 'DESC'};
    @results = $results_manager->get_results($parameters);
    $results_count = scalar(@results);

    $image_manager = new ImagesManager();
    $image_file = sprintf("%s/%s.first.small.png", $images_dir, $target_name);
    $image_manager->generate_al_small_image($target_name, $image_file,'', @results);
    #for all groups
    for(my $i = 0; $i < scalar(@groups); $i++) {
	my $images_dir = sprintf("%s/%s", $LOCAL_CONFIG->{AL_PLOTS_DIR}, $target_name);
	system(sprintf("mkdir -p %s", $images_dir));
	my $image_file = sprintf("%s/%s.%s.first.small.png", $images_dir, $target_name, $groups[$i]{CODE});
	$image_manager->generate_al_small_image($target_name, $image_file, $groups[$i]{CODE}, @results);
	print "IMG:" . $image_file . "\n";
    }






}

#my $res_up_man = new ResultsUploadManager();
#$res_up_man->generate_gdt_images("T0387");
#$res_up_man->generate_al_small_images("T0387");

######################## UPLOAD TEMPLATES

sub upload_templates {
	my ($self, $target, $file_name, $file_dir) = @_;

	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);

	my $templates_manager = new ResultsTemplatesManager();
	my %templates_model = $templates_manager->get_new_model();



	$templates_model{domain} = 0; #$2;
	if ($target =~ /^.*-D(\d+).*/) {
	    $templates_model{domain} = $1;
    	}

	$target =~ /^(.{5}(s[1-9]){0,1})(.*)/;
	$target = $1;
	print $target . "<----\n";
	### parce file_name and get info
	if($file_name=~/^(\S+).$target(\S*).pdb.res/) {
		$templates_model{TARGET} = $target;
		$templates_model{name} = $1;
    	} else {
		printf("ERROR: Can't read file name %s ", $file_name);
		print $file . "\n";
		exit(0);
	}

	$templates_model{result_file_name} = $file_name;

	if(open(FILE, $file)) {
		while(<FILE>) {
			my $line = $_;
			#              N1   N2   DIST      N    RMSD   Seq_Id      LGA_S     LGA_Q
			#SUMMARY(LGA)  246  144    5.0    113    2.70     7.96     47.095     4.037
			#CA            N1   N2   DIST      N    RMSD    GDT_TS    LGA_S3     LGA_Q
			#SUMMARY(GDT)   82   83    4.0     79    1.26    86.446    91.767     5.817
			if($line =~ /^SUMMARY\((GDT|LGA)\)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
			    $templates_model{n1} = $2;
			    $templates_model{n2} = $3;
			    $templates_model{n} = $5;
			    $templates_model{rmsd_5} = $6;
			    $templates_model{seq_id_5} = $7;
			    $templates_model{lga_s_5} = $8;
			}
		}
		close(FILE);

	} else {
		print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}

	my $target_manager = new TargetsManager();
	my $targets_id = $target_manager->get_id_by_name($templates_model{TARGET});
	my %target_info = $target_manager->info($targets_id);

	$templates_model{lga_values_5} = $self->get_LGA_distances($target_info{NUMBER_OF_AA}, $file);
	$templates_model{targets_id} = $targets_id;

	$templates_model{id} = $templates_manager->exist_by_parameters(%templates_model);

	if ($templates_model{id} ne '' && $templates_model{id} != 0) {
		$templates_manager->update(%templates_model);
	} else {
		$templates_model{id} = $templates_manager->add(%templates_model);
	}

    return $result;
}

sub get_LGA_distances {
	my ($self, $residue_count, $LGA_results_file) = @_;
	my @results = ();
	# Molecule2: number of CA atoms  174 ( 1411),  selected  174 , name T0388.pdb
	##my $residue_count = 0;
	print "residue_count: " . $residue_count . "\n";
	for(my $i = 0; $i < $residue_count; $i++) {
		push(@results, 'X');
	}
	if(open(RESULTS_FILE, $LGA_results_file)) {
	    while(<RESULTS_FILE>) {
	    chomp;
# # 		if($_ =~ /^# Molecule\d+: number of CA atoms\s+(\d+)\s+.*.pdb/) {
# # 		#if($_ =~ /^# Molecule2: number of CA atoms  (\d+) \( 1411\),  selected  174 , name T0388.pdb/) {
# # 			$residue_count = $1;
# # 			print "residue_count: " . $residue_count . "\n";
# # 			for(my $i = 0; $i < $residue_count; $i++) {
# # 				push(@results, 'X');
# # 			}
# # 		}
	    if($_ =~ /^LGA\s+\S+\s+\S+\s+\S+\s+(\d+)\s+(\S+)/ && $residue_count > 0) {
		my $index = trim($1);
		my $distance = trim($2);
		if($distance =~ /^([0-9.]+)$/) {
			$results[$index - 1] = $1;
		}
	    }
	    }
	    close(RESULTS_FILE);
	}
	my $alignment_str = '';
	for(my $i = 0; $i < scalar(@results); $i++) {
#print "alignment_str: " . $alignment_str . "\n";
#print "results[i]: " . $results[$i] . "\n";
#print "i: " . $i . "\n";
#print "residue_count: " . $residue_count ."\n";

            $alignment_str = $alignment_str . ' ' . $results[$i];
	}
	return $alignment_str;
}

sub get_LGA_distances_new {
        my ($self, $LGA_results_file) = @_;
        my $result = '';
        if(open(RESULTS_FILE, $LGA_results_file)) {
            while(<RESULTS_FILE>) {
              chomp;
              if($_ =~ /^LGA\s+\S+\s+\S+\s+\S+\s+(\d+)\s+(\S+)/ ) {
                my $res = $1;
                my $distance = $2;
                if($distance =~ /^([0-9.]+)$/) {
                        $result .= "$res:$distance ";
                }
              }
            }
            close(RESULTS_FILE);
        }
	$result =~ s/\s+$//;
        return $result;
}

sub upload_descriptors {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $domain = 0;

    if ($file_name =~ /^.*(-D\d+).*/) {
	    $domain = $1;
    }


    if(open(FILE, $file)) {
	while(<FILE>) {
	    my $line = $_;
	    if($line =~ /^(.*); (.*); (.*); (.*);.*/) {
		my $model_name = $1;
		if($domain ne 0) {
		    $model_name.=$domain;
		}

		print $model_name . "\n";

		my $results_manager = new ResultsManager();
		my %results_model = $results_manager->get_new_model();
		### parce file_name and get info
		#T0415_I_T0415TS493_3.al
		%results_model = $self->parce_filename($model_name, %results_model);
		$results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);
		#TODO: If prediction does not exist - return null or exit
		# need some notification or log info for such case
		if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
		    print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
		    #$results_manager->ToString("\n", %results_model);
		    print  "ERROR!!! DESCRIPTORS end\n";
			my $subject = sprintf("ERROR!!! DESCRIPTORS Can not assotiate file prediction with DB: %s", $file);
			my $body = sprintf("Subject: %s\n\n%s", $subject, $results_manager->ToString("\n", %results_model, 1));
			$body .= sprintf("%s\n", $model_name);
			Email::send_email("akryshtafovych\@ucdavis.edu", "akryshtafovych\@ucdavis.edu", "akryshtafovych\@ucdavis.edu", "", $subject, $body);
		    next;
		    #return 0;
		}

		my @dal_0_result = split(/\s+/, $2);
		my $dal_0_count = scalar(@dal_0_result);
		for(my $i = 0; $i < $dal_0_count; $i++) {
		    if($i==0) {
			$results_model{n_aa_0} = $dal_0_result[$i];
		    } else {
			$results_model{superposition_0} .= $dal_0_result[$i];
			if ($i != 0 && $i < $dal_0_count) {
			    $results_model{superposition_0} .= ' ';
			}
		    }
		}

		my @dal_4_result = split(/\s+/, $3);
		my $dal_4_count = scalar(@dal_4_result);
		for(my $i = 0; $i < $dal_4_count; $i++) {
		    if($i==0) {
			$results_model{n_aa_4} = $dal_4_result[$i];
		    } else {
			$results_model{superposition_4} .= $dal_4_result[$i];
			if ($i != 0 && $i < $dal_4_count) {
			    $results_model{superposition_4} .= ' ';
			}
		    }
		}

		my @dal_i_result = split(/\s+/, $4);
		my $dal_i_count = scalar(@dal_i_result);
		for(my $i = 0; $i < $dal_i_count; $i++) {
		    if($i==0) {
			$results_model{n_aa_i} = $dal_i_result[$i];
		    } else {
			$results_model{superposition_i} .= $dal_i_result[$i];
			if ($i != 0 && $i < $dal_i_count) {
			    $results_model{superposition_i} .= ' ';
			}
		    }
		}

		$results_model{id} = $results_manager->exist_by_parameters(%results_model);
		if ($results_model{id} ne '' && $results_model{id} != 0) {
		    $results_manager->update_results(%results_model);
		} else {
		    $results_model{id} = $results_manager->add(%results_model);
		}
		#TODO check new model through $results_manager->info
		#$results_manager->ToString("\n", %results_model);
	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: DESCRIPTORS: Can't open file %s/%s", $file_dir, $file_name);
    }
    return $result;
}

sub upload_descriptors_old {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    ### parce file_name and get info
    #T0415_I_T0415TS493_3.al
    my $shift_window = "";
    if($file_name=~/^(.{5})_(.{1})_(\S*).al/) {
	##$results_model{TARGET} = $1;
	$shift_window = $2;
	my $model_name = $3;
	print "Model Name: $model_name \n";
	%results_model = $self->parce_filename($model_name, %results_model);
    } else {
	printf("ERROR: Can't read file name %s ", $file_name);
	print $file . "\n";
	exit(0);
    }

    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
	print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	#$results_manager->ToString("\n", %results_model);
	print  "ERROR!!! end\n";
	exit(0);
    }

    if(open(FILE, $file)) {
	while(<FILE>) {
	    my $line = $_;
	    if($line =~ /^score:\s+(\S+).*/) {
		if($shift_window eq '0') {
		    $results_model{dal_0} = $1;
		} elsif ($shift_window eq '4') {
		    $results_model{dal_4} = $1;
		} elsif ($shift_window eq 'I') {
		    $results_model{dal_i} = $1;
		}
	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }

    $results_model{id} = $results_manager->exist_by_parameters(%results_model);

    if ($results_model{id} ne '' && $results_model{id} != 0) {
	$results_manager->update_results(%results_model);
    } else {
	$results_model{id} = $results_manager->add(%results_model);
    }

    #TODO check new model through $results_manager->info
    #$results_manager->ToString("\n", %results_model);

    return $result;
}

# upload qse score - quality self-estimate
sub upload_qse {
    my ($self, $model_name, $lga_result_dir, $model_dir) = @_;
    my %hash_m; # hash of bf's from model_file (self estimate) : key - distance, value - 1
    my %hash_t; # hash of distances from lga_sda : key - distance, value - 1
    my %dist_m; # hash of distances from model_file : key - res_no, value - distance
    my %dist_t; # hash of distances from lga_sda : key - res_no, value - distance
    my @arr_m;
    my @arr_t;

    # parse model file and calculate average
    my $model_file = $model_dir."/".$model_name;
    if (open M, "grep ATOM $model_file | grep ' CA ' |"){
       while(defined (my $l = <M>)){
	 my $chain = substr($l, 21, 1);
	 my $res_no = substr($l, 22, 4);
	 $res_no = trim($res_no);
	 $res_no .= $chain;
	 $res_no = trim($res_no);
	 my $bf = substr($l, 60, 6);
 	 $bf = trim($bf);
	 $hash_m{$bf} = 1;
	 $dist_m{$res_no} = $bf; 
	 push @arr_m, $bf;
       }
       close M;
    } else {
	warn "File $model_file couldn't be openned for reading\n";
	return undef;
    }

    if (scalar(keys %hash_m) <= 1){
	warn "The range of BF field in the model $model_file spans just one value\n";
	return undef;
    }

    # parse lga_sda result file
    my $lga_result_file = $lga_result_dir."/".$model_name.".lga";
    if (open(L, "< $lga_result_file")){
	while(defined(my $l = <L>)){
		if ($l !~ m/^LGA\s+/){next;}
		# parse line 
		#        Molecule1      Molecule2  DISTANCE    Mis    MC     All    Dist_max   GDC_mc  GDC_all  Dist_at
		# LGA    K     202      K     202    12.682 
		if ($l =~ m/^LGA\s+\S+\s+(\S+)\s+\S+\s+\S+\s+(\S+)/){
			my $res_no = $1;
			my $dist = $2;
			if ($res_no =~ m/^[0-9]+\S*$/ && $dist =~ m/^[0-9]+\.[0-9]+$/){
				$hash_t{$dist} = 1;
				push @arr_t, $dist;
				$res_no =~ s/_//g;
				$res_no = trim($res_no);
				$dist_t{$res_no} = $dist;
			}
		}
	}
    } else {
	warn "File $lga_result_file couldn't be openned for reading\n";
        return undef;
    }

    if (scalar(keys %hash_t) <= 1){
	warn "The range of BF field in the model $model_file spans just one value\n";
        return undef;
    }
#    my $avrg_dist_m = $self->getAvrgDistS(\@arr_m);
#    my $avrg_dist_t = $self->getAvrgDistS(\@arr_t);
#    my $qse = abs($avrg_dist_m - $avrg_dist_t);
    my $qse =  $self->getAvrgDifferenceDistS(\%dist_t, \%dist_m);

    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    %results_model = $self->parce_filename($model_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
            print  "ERROR!!!: Can not assotiate prediction with DB \n $model_name \n";
            return 0;
    }

    $results_model{qse} = $qse;
    $results_model{id} = $results_manager->exist_by_parameters(%results_model);

    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update_results(%results_model);
    } else {
#        $results_model{id} = $results_manager->add(%results_model);
    }
    #$results_manager->ToString("\n", %results_model);
    return 1;
}

sub getAvrgDistS{
    my ($self, $refArr) = @_;
    my @arr = @{$refArr};
    my $s = 0;
    my $D0 = 5.0;
    my $D_cutoff = 15.0;
    foreach my $d (@arr){
	if ($d > $D_cutoff){
		$s = $s + 1/(1 + ($D_cutoff/$D0)**2);
	} else {
		$s = $s + 1/(1 + ($d/$D0)**2);
	}
    }
    $s = $s/scalar(@arr);
    return sprintf("%6.4f", $D0 * sqrt(1/$s -1));
}

sub getAvrgDifferenceDistS{
    my ($self, $refHashT, $refHashM) = @_;
    my %hash_t = %{$refHashT};
    my %hash_m = %{$refHashM};
    my $diff = 0;
    my $D0 = 5.0;
    my $D_cutoff = 15.0;
    my $count = 0;
    foreach my $res_no (sort keys %hash_t){
	if (exists $hash_t{$res_no} && exists $hash_m{$res_no}){
		# S transform
		my $d_t = $hash_t{$res_no};
		my $d_m = $hash_m{$res_no};
		my $s_t; my $s_m;
		if ($d_t > $D_cutoff){
			$s_t = 1/(1 + ($D_cutoff/$D0)**2);
		} else {
			$s_t = 1/(1 + ($d_t/$D0)**2);
		}
		
		if ($d_m > $D_cutoff){
                        $s_m = 1/(1 + ($D_cutoff/$D0)**2);
                } else {
                        $s_m = 1/(1 + ($d_m/$D0)**2);
                }
		
		$diff += abs($s_t - $s_m);
		$count++;
	}
    }
    if ($count == 0){
	return undef;
    } else {
	# calculate average
	$diff = $diff/$count;
	# rescale and revert the range : 100 - the best case; 0 - the worst
	return sprintf("%7.5f", 100.0*(1 - $diff));
    }
}


sub upload_dali {
    my ($self, $model_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s/index.html", $file_dir, $model_name);
    my $error  = sprintf("%s/%s/error2", $file_dir, $model_name);
    my $results_manager = new ResultsManager();
    my %results_model = $results_manager->get_new_model();
    ### parce file_name and get info
    #T0415_I_T0415TS493_3.al
    print "Model Name: $model_name \n";
    %results_model = $self->parce_filename($model_name, %results_model);
    $results_model{predictions_id} = $results_manager->get_predictions_id(%results_model);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($results_model{predictions_id} eq '' || $results_model{predictions_id} == 0 ) {
	print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	#$results_manager->ToString("\n", %results_model);
	print  "DALI Uplod filed!!! end\n\n\n\n\n\n\nDALI Uplod filed!!!\n\n";
#	exit(0);
	return $result;
    }

    $results_model{dali_z_score} = -999;


    if(open(FILE, $error)) {
	while(<FILE>) {
	    my $line = $_;
	    if($line =~ /^STOP  END -- Normal termination  statement executed.*/) {
		$results_model{dali_z_score} = 0;
	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s/error.html", $file_dir, $model_name);
    }


    if(open(FILE, $file)) {
	my $perc; my $no_res;
	while(<FILE>) {
	    my $line = $_;
	    if ($line =~ m/^<LI>No significant similarities were detected/){
		$results_model{dali_z_score} = 0;
		$results_model{dali_align_residues} = 0;
		$results_model{dali_rmsd} = -1.0;
		$results_model{dali_n_align} = 0;
	    }

#print $line . "\n";
		             #<TD>1</TD><TD>mol2</TD><TD>27.6</TD><TD>168</TD><TD>1.8</TD><TD>100</TD><TD><A HREF="aln.html#alignment-1">click here</A></TD><TD><A
	    if($line =~ /^<TD>1<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD><A HREF=.*/) {
		$results_model{dali_z_score} = $2;
		$results_model{dali_align_residues} = $3;
		$results_model{dali_rmsd} = $4;
		$perc = $5;
		#print $line . "\n";
	    }
	    if ($line =~ m/^mol1:\s+(\S+)\s+/){
                        $no_res = $1;
                        last;
                }
	}
	close(FILE);
	if (defined($results_model{dali_align_residues}) && defined($no_res) && $no_res != 0 && defined($perc)){
                $results_model{dali_n_align} = sprintf("%.4f", $perc*($results_model{dali_align_residues})/$no_res);
	}


    } else {
	print sprintf("ERROR: Can't open file %s/%s/index.html", $file_dir, $model_name);
    }
    # dali raw score is parsed from mol1.dccp file
    $file = sprintf("%s/%s/mol1.dccp", $file_dir, $model_name);
    if(open(FILE, $file)) {
	# parse first line
	# DCCP   1    296.8 2.7  63     6.8          95      1                mol2  mol1
	my $line = <FILE>;
	if ($line =~ m/^\s*DCCP\s+\S+\s+(\S+)/){
		my $dali_raw = $1;
		if ($dali_raw =~ m/^([0-9]+\.[0-9])/){
			$results_model{dali_raw} = $1;
		}
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s/mol1.dccp", $file_dir, $model_name);
    }

    $results_model{id} = $results_manager->exist_by_parameters(%results_model);

    if ($results_model{id} ne '' && $results_model{id} != 0) {
	$results_manager->update_results(%results_model);
    } else {
	$results_model{id} = $results_manager->add(%results_model);
    }
    #TODO check new model through $results_manager->info
    #$results_manager->ToString("\n", %results_model);
    return $result;
}


sub upload_refinement_results {
	my ($self, $file_name, $file_dir, $type, $table_name) = @_;
	my $result = 0;
	my $file  = sprintf("%s/%s", $file_dir, $file_name);
	my $rr_manager = new ResultsRefinementManager();
	my %rr_model = $rr_manager->get_new_model();
	%rr_model = $self->parce_filename($file_name, %rr_model);

	$rr_model{predictions_id} = $rr_manager->get_predictions_id(%rr_model);

	#TODO: If prediction are not exist - return null or exit
	# need some notification or log info for such case
	if($rr_model{predictions_id} eq '' || $rr_model{predictions_id} == 0 ) {
	    print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	    return 0;
	}

	if(open(FILE, $file)) {
	    while(<FILE>) {
		my $line = $_;
		#CA            N1   N2   DIST      N    RMSD    GDT_TS    LGA_S3     LGA_Q
		#SUMMARY(GDT)   82   83    4.0     79    1.26    86.446    91.767     5.817
		if($line =~ /^SUMMARY\(GDT\)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		    $rr_model{rmsd_4} = $5;
		    $rr_model{gdt_ts_4} = $6;
		}
		# RMSD_GDC results:       CA      MC common percent     ALL common percent   GDC_mc  GDC_all   GDC_at
		#SUMMARY(RMSD_GDC):     7.844          7.751                  9.166           23.843   20.993   10.109
		if($line =~ /^SUMMARY\(RMSD_GDC\):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/){
		   $rr_model{lga_4_tr} = $6;
		}
		#Std_ASGN_ATOMS RMSD:  15.447  Standard rmsd on all 287 assigned CA atoms
		if($line =~ /^Std_ASGN_ATOMS RMSD:\s+(\S+)\s+.*/) {
		    $rr_model{rmsd_all} = $1;
		}

		if($line =~ /^GDT PERCENT_AT\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		    $rr_model{gdt_ha_4} = (($1 + $2 + $4 + $8)/4);

		}
	    }
	    close(FILE);
	} else {
	    print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
	}
	########### ALIGNMENT alignment_4

	my $target_manager = new TargetsManager();
	my $targets_id = $target_manager->get_id_by_name($rr_model{TARGET});
	my %target_info = $target_manager->info($targets_id);
	$rr_model{alignment_4} = $self->get_LGA_distances($target_info{NUMBER_OF_AA}, $file);

	$rr_model{id} = $rr_manager->exist_by_parameters(%rr_model);

	if ($rr_model{id} ne '' && $rr_model{id} != 0) {
	    $rr_manager->update(%rr_model);
	} else {
	    $rr_model{id} = $rr_manager->add(%rr_model);
	}
	#$rr_manager->ToString("\n", %rr_model);
	my $alignment = $self->get_LGA_distances_new($file);
	if (defined($alignment)){
		$rr_manager->add_alignment($rr_model{id}, "lga_sda", $alignment);
	}

    return $result;
}

sub upload_refinement_targets_dali_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s/index.html", $file_dir, $file_name);
    my $error = sprintf("%s/%s/error2", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }


        if ($domain eq 0 ) {
        #       print "\n error \n";
        #       exit(0);
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;

    $model{dali_z_score} = -999;


    if(open(FILE, $error)) {
        while(<FILE>) {
            my $line = $_;
            if($line =~ /^STOP  END -- Normal termination  statement executed.*/) {
                $model{dali_z_score} = 0;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s/error.html", $file_dir, $file_name);
    }


    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
#print $line . "\n";
                             #<TD>1</TD><TD>mol2</TD><TD>27.6</TD><TD>168</TD><TD>1.8</TD><TD>100</TD><TD><A HREF="aln.html#alignment-1">click here</A></TD><TD><A
            if($line =~ /^<TD>1<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD>(\S+)<\/TD><TD><A HREF=.*/) {
                $model{dali_z_score} = $2;
                $model{dali_align_residues} = $3;
                $model{dali_rmsd} = $4;
                #print $line . "\n";
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s/index.html", $file_dir, $file_name);
    }
    # dali raw score is parsed from mol1.dccp file
    $file = sprintf("%s/%s/mol1.dccp", $file_dir, $file_name);
    if(open(FILE, $file)) {
        # parse first line
        # DCCP   1    296.8 2.7  63     6.8          95      1                mol2  mol1
        my $line = <FILE>;
        if ($line =~ m/^\s*DCCP\s+\S+\s+(\S+)/){
                my $dali_raw = $1;
                if ($dali_raw =~ m/^([0-9]+\.[0-9])/){
                        $model{dali_raw} = $1;
                }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s/mol1.dccp", $file_dir, $file_name);
    }

    my $target_manager = new TargetsManager();

    my $targets_id = $target_manager->get_id_by_name($model{TARGET});

    $model{targets_id} = $targets_id;

    $model{id} = $rt_manager->exist_by_parameters(%model);

    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }

    return $result;
}


sub upload_refinement_targets_mammoth_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }


        if ($domain eq 0 ) {
        #       print "\n error \n";
        #       exit(0);
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #Z-score=      14.855727        -ln(E)=      14.330478
            if($line =~ /^Z-score=\s+(\S+)\s+-ln\(E\)=\s+(\S+).*/) {
                $model{z_score_m} = $1;
                $model{ln_e_m} = $2;
            }
        }
	close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }

    my $target_manager = new TargetsManager();

    my $targets_id = $target_manager->get_id_by_name($model{TARGET});

    $model{targets_id} = $targets_id;

    $model{id} = $rt_manager->exist_by_parameters(%model);

    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }

    return $result;

}

sub upload_refinement_targets_lddt_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #Global LDDT score: 0.4495
            if($line =~ /^Global\s+LDDT\s+score:\s+(\S+).*/) {
                $model{lddt} = $1;
		last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    my $alignment = $self->parse_lddt_alignment($file);
    if (defined($alignment) && $alignment ne '') {
       $rt_manager->add_alignment($model{id}, 'lddt', $alignment);
    }

    return $result;
}

sub upload_refinement_lddt_results {
    my ($self, $file_name, $file_dir) = @_;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rr_manager = new ResultsRefinementManager();
    my %rr_model = $rr_manager->get_new_model();
    %rr_model = $self->parce_filename($file_name, %rr_model);
    $rr_model{predictions_id} = $rr_manager->get_predictions_id(%rr_model);
    my $result = 0;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #Global LDDT score: 0.4495
            if($line =~ /^Global\s+LDDT\s+score:\s+(\S+).*/) {
                $rr_model{lddt} = $1;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    $rr_model{id} = $rr_manager->exist_by_parameters(%rr_model);
    if ($rr_model{id} ne '' && $rr_model{id} != 0) {
        $rr_manager->update(%rr_model);
    } else {
        $rr_model{id} = $rr_manager->add(%rr_model);
    }
    my $alignment = $self->parse_lddt_alignment($file);
    if (defined($alignment) && $alignment ne '') {
       $rr_manager->add_alignment($rr_model{id}, 'lddt', $alignment);
    }
    return $result;
}



sub upload_refinement_targets_cad_score_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #AA 0.4495
            if($line =~ /^AA\s+(\S+).*/) {
                $model{cad_aa} = $1;
            }
	    if($line =~ /^SS\s+(\S+).*/) {
                $model{cad_ss} = $1;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_rpf_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
	    chomp $line;
            #0.4495
            if($line =~ /^([0-9\-]\S+)/) {
                $model{rpf} = $1;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_qcs_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
	    #scores_for_model        99.5411278772   97.7723652941   93.5882401754   96.4832470606   97.8590624055   78.3019458099   93.9243314371   89.5217810602
            if($line =~ /^scores_for_model/) {
                my @tokens = split(/\s+/, $line);
                $model{qcs} = $tokens[8];
                $model{conts} = $tokens[6];
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}


sub upload_refinement_targets_sov_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
	    #SOV_NORMALIZED: 100.00
            if($line =~ /^SOV_NORMALIZED:\s+(\S+)/) {
                $model{sov} = $1;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}


sub upload_refinement_targets_ce_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
	    # Z-score 6.58 Afp-num 6 Identity 92.67% Similarity 93.72%
                if ($line =~ m/^Z-score\s+(\S+)/){
                        $model{ce} = $1;
                        last;
                }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_tm_score_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
            if($line =~ /^TM-score\s*=\s+(\S+)/) {
                $model{tm_score} = $1;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_tm_align_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
	    if($line =~ /^TM-score=\s+(\S+)\s+\(if normalized by length of Chain_1\)/) {
                $model{tm_align} = $1;
		last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}


sub upload_refinement_targets_flexe_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
	    #/local/CASP13/MODELS//TR828/TR828TS342_4 4.10 16.45 9.32
            if($line =~ /^\S+\s+\S+\s+(\S+)\s+\S+/) {
                $model{flexe} = $1;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_codm_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
            #local/CASP13/TARGETS//templates/TR217.pdb.txt  0.9759  1.0
            if($line =~ /^\S+\s+(\S+)/) {
                $model{codm} = $1;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_dfm_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
            #local/CASP13/TARGETS//templates/TR217.pdb.txt  0.9759  1.0
            if($line =~ /^\S+\s+(\S+)/) {
                $model{dfm} = $1;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_handed_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            chomp $line;
            #local/CASP13/TARGETS//templates/TR217.pdb.txt  0.9759
            if($line =~ /^\S+\s+(\S+)/) {
                $model{handedness} = $1;
                last;
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_molprobity_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            if($line =~ m/^#/){next;} # comment lines
	    if($line =~ m/^\s*$/){next;} # empty line
	    my @array = split(/:/,$line);
#	    my $mp_clash = ( !defined($array[7]) || $array[7] eq '' ) ? '' : $array[7];
#	    my $mp_rot_out = (!defined($array[19]) || !defined($array[20]) || $array[20] == 0 || $array[20] eq '' || $array[19] eq '' ) ? '': 100*$array[19]/$array[20];
#	    my $mp_ram_out = ( !defined($array[24]) || !defined($array[21]) || $array[24] == 0 || $array[24] eq '' || $array[21] eq '' ) ? '' : 100*$array[21]/$array[24];
#	    my $mp_ram_fv = (!defined($array[24]) || !defined($array[23]) || $array[24] == 0 || $array[24] eq '' || $array[23] eq '' ) ? '' : 100*$array[23]/$array[24];
#	    my $mp_score = (!defined($array[27]) || $array[27] eq '' ) ? '': $array[27];

            my $mp_clash = ( !defined($array[8]) || $array[8] eq '' ) ? '' : $array[8];
            my $mp_rot_out = (!defined($array[17]) || !defined($array[18]) || $array[18] == 0 || $array[18] eq '' || $array[17] eq '' ) ? '': 100*$array[17]/$array[18];
            my $mp_ram_out = ( !defined($array[22]) || !defined($array[19]) || $array[22] == 0 || $array[22] eq '' || $array[19] eq '' ) ? '' : 100*$array[19]/$array[22];
            my $mp_ram_fv = (!defined($array[22]) || !defined($array[21]) || $array[22] == 0 || $array[22] eq '' || $array[21] eq '' ) ? '' : 100*$array[21]/$array[22];
            my $mp_score = (!defined($array[31]) || $array[31] eq '' ) ? '': $array[31];

         
            $model{mp_clash} = $mp_clash;
	    $model{mp_rot_out} = $mp_rot_out;
	    $model{mp_ram_out} = $mp_ram_out;
	    $model{mp_ram_fv} = $mp_ram_fv;
	    $model{mp_score} = $mp_score;
 	    last;          
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    return $result;
}

sub upload_refinement_targets_sg_py_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $sphere_index = 6;
    my $results_manager = new ResultsTargetRefinementManager();
    my %results_model = $results_manager->get_new_model();
    #%results_model = $self->parce_filename($file_name, %results_model);
    my $domain = 0;
    if ($target =~ /^(R0957s2)-D(\d+)/) {
        $target = $1;
        $domain = $2;
    }
    $target =~ s/\.\S+$//;
    $results_model{TARGET} = $target;
    $results_model{domain} = $domain;
    my $alignment = "";
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #162   ASP;0.0|1.0;0.04559941360083554|1.0;...
            if($line =~ /^\d+\s+[A-Z]{3};/) {
                my @tokens = split(/;/, $line);
                if ($tokens[$sphere_index] =~ m/([0-9]{1,}\.{0,1}[0-9]{1,})\|([0-9]{1,}\.{0,1}[0-9]{1,})/){
                   my $cur_rmsd = $1;
                   my $fr = $2; # fraction of atoms, the rmsd was calculated at 
                   if ($fr == 0){next;}
                   if ($tokens[0] =~ m/^(\d+)/){
                        my $res = $1;
                        $alignment .= sprintf("%d:%.3f ", $res, $cur_rmsd/$fr);
                   }
                }
            }
            if ($line =~ m/Global\s+score:\s+(\S+)/){
                my $score = $1;
                $results_model{sg_py} = sprintf("%8.5f", 100.0*$score);
            }
        }
        close(FILE);
    } else {
        print sprintf("ERROR: Can't open file %s/%s", $file_dir, $file_name);
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($results_model{TARGET});
    $results_model{targets_id} = $targets_id;
    $results_model{id} = $results_manager->exist_by_parameters(%results_model);
    if ($results_model{id} ne '' && $results_model{id} != 0) {
        $results_manager->update(%results_model);
    } else {
        $results_model{id} = $results_manager->add(%results_model);
    }
    if (defined($alignment) && $alignment ne ''){
        $results_manager->add_alignment($results_model{id}, "sg_py", $alignment);
    }

    return $result;
}


sub upload_refinement_targets_sg_lvr_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);
    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
        my $domain = 0;
        if ($target =~ /^(R0957s2)-D(\d+)/) {
                $target = $1;
                $domain = $2;
        }
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;
    my $sphere_index = 6;
    my $rmsd_cutoff1 = 2.0;
    my $rmsd_cutoff2 = 4.0;
    my $count_sphere = 0;
    my $count_sphere_cutoff1 = 0;
    my $count_sphere_cutoff2 = 0;
    my $alignment = "";
    if(open(FILE, $file)) {
        while(<FILE>) {
            my $line = $_;
            #162   ASP;0.0|1.0;0.04559941360083554|1.0;...
            if($line =~ /^\d+\s+[A-Z]{3};/) {
                $count_sphere++;
                my @tokens = split(/;/, $line);
                if ($tokens[$sphere_index] =~ m/([0-9]{1,}\.{0,1}[0-9]{1,})\|([0-9]{1,}\.{0,1}[0-9]{1,})/){
                   my $cur_rmsd = $1;
		   my $fr = $2;
		   if ($fr == 0){next;}
                   if ( $cur_rmsd/$fr <= $rmsd_cutoff1) {
                        $count_sphere_cutoff1++;
                   }
		   if ( $cur_rmsd/$fr <= $rmsd_cutoff2) {
                        $count_sphere_cutoff2++;
                   }
		   if ($tokens[0] =~ m/^(\d+)/){
			my $res = $1;
			$alignment .= sprintf("%d:%.3f ", $res, $cur_rmsd/$fr);
		   }
		}
            }
        }
        close(FILE);
	$alignment =~ s/\s+$//;
        if ($count_sphere > 0){
          $model{sg_lvr_6_2} = sprintf("%8.5f", 100.0 * (0.5*($count_sphere_cutoff1 + $count_sphere_cutoff2)/$count_sphere));
        }
    } else {
        print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
        return 0;
    }
    my $target_manager = new TargetsManager();
    my $targets_id = $target_manager->get_id_by_name($model{TARGET});
    $model{targets_id} = $targets_id;
    $model{id} = $rt_manager->exist_by_parameters(%model);
    if ($model{id} ne '' && $model{id} != 0) {
        $rt_manager->update(%model);
    } else {
        $model{id} = $rt_manager->add(%model);
    }
    if (defined($alignment) && $alignment ne ''){
	$rt_manager->add_alignment($model{id}, "sg_lvr", $alignment); 
    }
    return $result;
}



sub upload_refinement_targets_results {
    my ($self, $target, $file_dir) = @_;
    my $result = 0;
    my $file_name = sprintf("%s", $target);
#	my $lga_4_tr_file = sprintf("/local/CASP13/RESULTS/LGA/4A_TR/DATA/%s/%s", substr($target,0,5), $target);
#	printf("/local/CASP13/RESULTS/LGA/4A_TR/DATA/%s/%s",  substr($target,0,5), $target);
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $rt_manager = new ResultsTargetRefinementManager();
    my %model = $rt_manager->get_new_model();
	my $domain = 0;
	if ($target =~ /^(R0957s2)-D(\d+)/) {
		$target = $1;
		$domain = $2;
	}


	if ($domain eq 0 ) {
	#	print "\n error \n";
	#	exit(0);
	}
    $target =~ s/\.\S+$//;
    $model{TARGET} = $target;
    $model{domain} = $domain;

    if(open(FILE, $file)) {
	while(<FILE>) {
	    my $line = $_;
	    #CA            N1   N2   DIST      N    RMSD    GDT_TS    LGA_S3     LGA_Q
	    #SUMMARY(GDT)   82   83    4.0     79    1.26    86.446    91.767     5.817
	    if($line =~ /^SUMMARY\(GDT\)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		$model{rmsd_4} = $5;
		$model{gdt_ts_4} = $6;
	    }

                # RMSD_GDC results:       CA      MC common percent     ALL common percent   GDC_mc  GDC_all   GDC_at
                #SUMMARY(RMSD_GDC):     7.844          7.751                  9.166           23.843   20.993   10.109
            if($line =~ /^SUMMARY\(RMSD_GDC\):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/){
		   $model{ace_rms_ca} = $1;
		   $model{ace_rms_all} = $3;
                   $model{lga_4_tr} = $6;
            }

	    if($line =~ /^GDT PERCENT_AT\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		$model{gdt_ha_4} = (($1 + $2 + $4 + $8)/4);

	    }
	    #Std_ASGN_ATOMS RMSD:  15.447  Standard rmsd on all 287 assigned CA atoms
	    if($line =~ /^Std_ASGN_ATOMS RMSD:\s+(\S+)\s+.*/) {
		$model{rmsd_all} = $1;
	    }
	}
	close(FILE);

#	if(open(FILE_TR, $lga_4_tr_file)) {
#	  while(<FILE_TR>) {
#    	if($_=~ /^SUMMARY\(RMSD_GDC\):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
#				$model{lga_4_tr} = $6;
#		}
#	}
#	}
#	close(FILE_TR);

    } else {
	print sprintf("ERROR: Can't open file %s/%s\n", $file_dir, $file_name);
	return 0;
    }


    my $target_manager = new TargetsManager();

    my $targets_id = $target_manager->get_id_by_name($model{TARGET});

    my %target_info = $target_manager->info($targets_id);

    $model{alignment_4} = $self->get_LGA_distances($target_info{NUMBER_OF_AA}, $file);
    $model{targets_id} = $targets_id;

    $model{id} = $rt_manager->exist_by_parameters(%model);

    if ($model{id} ne '' && $model{id} != 0) {
	$rt_manager->update(%model);
    } else {
	$model{id} = $rt_manager->add(%model);
    }
    my $alignment = $self->get_LGA_distances_new($file);
    if (defined($alignment)){
         $rt_manager->add_alignment($model{id}, "lga_sda", $alignment);
    }  

    return $result;
}

sub upload_qa_predictions {
# Seems obsolete

    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $qa_analysis_manager = new QAAnalysisManager();
    my %model_qa_a = $qa_analysis_manager->get_new_model();
    %model_qa_a = $self->parce_filename($file_name, %model_qa_a);

    my $results_manager = new ResultsManager();
    $model_qa_a{predictions_id} = $results_manager->get_predictions_id(%model_qa_a);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($model_qa_a{predictions_id} eq '' || $model_qa_a{predictions_id} == 0 ) {
	print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	return 0;
    }

    $model_qa_a{id} = $qa_analysis_manager->exist_by_parameters(%model_qa_a);
    if ($model_qa_a{id} ne '' && $model_qa_a{id} != 0) {
	$qa_analysis_manager->update(%model_qa_a);
    } else {
	$model_qa_a{id} = $qa_analysis_manager->add(%model_qa_a);
    }
    #$qa_analysis_manager->ToString("\n", %model_qa_a);

    my @gdt_array = ();
    my @mqas_score_array = ();
    #my @mean_array = ();
    #my @deviation_array = ();
    my $model_count = 0;


    if(open(FILE, $file)) {
	my $flag = 0;
	my @results_array = ();
	my $store_distances = "";
	while(<FILE>) {
	    my $line = $_;
	    my $TARGET = $model_qa_a{TARGET};
	    if($line =~ /^END.*/) {
		#return 1;
	    } elsif($line =~ /^($TARGET\S+)\s+(\S+)\s+(.*)/) {
		$flag = 1;
		@results_array = ();
		$store_distances = "";
		my $file_prediction_name = $1;
		my $qa_results_manager = new QAResultsManager();
		my %model_qa_r = $qa_results_manager->get_new_model();
		$model_qa_r{qa_analysis_id} = $model_qa_a{id};
		$model_qa_r{distances} = $3;
		$store_distances = $3;
		$model_qa_r{mqas_score} = $2;
		#if($2 !~ /^(\d+)/) {
		#    print "\nERROR!!!! $line\n";
		#    exit(0);
		#} else {
		#    $model_qa_r{mqas_score} = $1;
		#}

		%model_qa_r = $self->parce_filename($file_prediction_name, %model_qa_r);
		$model_qa_r{predictions_id} = $results_manager->get_predictions_id(%model_qa_r);

		if($model_qa_r{predictions_id} eq '' || $model_qa_r{predictions_id} == 0 ) {
		    print  "ERROR!!!: Can not assotiate name prediction with DB \n $file \n";
		} else {
		    my @results = $qa_results_manager->get_results_info(%model_qa_r);
		    for(my $r_count = 0; $r_count < scalar(@results); $r_count++) {
			if (($results[$r_count]->{PARENT} > 0 && $results[$r_count]->{n1_4} > 20) || ($results[$r_count]->{PARENT} < 1)) {


			#print "COUNT: " . scalar(@results) . "\n";
			$model_qa_r{results_id} = $results[$r_count]->{RESULTS_ID};
			#$model_qa_r{PARENT} = $results[$r_count]->{PARENT};


		    ###my %distances = $self->get_distances($model_qa_r{distances}, $results[$r_count]->{distances});
		    ###$model_qa_r{res_count} = $distances{COUNT};


		    ###$model_qa_r{differences} = $distances{difference_str};
		###    if($distances{COUNT} > 0) {
		###	print "\n PEARSON scalar " . scalar(@{$distances{difference}}) . " \n";
		###	my @pearson_correlations = pearson_correlation(\@{$distances{lga_distance}}, \@{$distances{qa_distance}});
		###	$model_qa_r{pearson} = $pearson_correlations[0];
		###	$model_qa_r{fisher_zprime} = $pearson_correlations[1];
		###
		###
		###	print "MEAN scalar " . scalar(@{$distances{difference}}) . " \n";
		###	$model_qa_r{mean} = mean(\@{$distances{difference}});
		###	$model_qa_r{deviation} = std_dev(\@{$distances{difference}});
		###
		###	push(@mean_array, $model_qa_r{mean});
		###	push(@deviation_array, $model_qa_r{deviation});
		###
		###	print "PEARSON " . $model_qa_r{pearson}. "\n";
		###
		###    }


		    ###print "\nCOUNT: " . $distances{COUNT} ."\n";

		#######    print "\n DIFFERENCE: \n";
		#######    for(my $i = 0; $i < $distances{COUNT}; $i++) {
		#######	print $distances{difference}[$i] . ",";
		#######    }
		#######    print "\n QA: \n";
		#######    for(my $i = 0; $i < $distances{COUNT}; $i++) {
		#######	print $distances{qa_distance}[$i] . ",";
		#######    }
		#######    print "\n LGA: \n";
		#######    for(my $i = 0; $i < $distances{COUNT}; $i++) {
		#######	print $distances{lga_distance}[$i] . ",";
		#######    }

			$model_qa_r{id} = $qa_results_manager->exist_by_parameters(%model_qa_r);
			if ($model_qa_r{id} ne '' && $model_qa_r{id} != 0) {
			    $qa_results_manager->update(%model_qa_r);
			} else {
			    $model_qa_r{id} = $qa_results_manager->add(%model_qa_r);
			}
			$model_qa_r{id} = $qa_results_manager->exist_by_parameters(%model_qa_r);
			push(@mqas_score_array, $model_qa_r{mqas_score});
			push(@gdt_array, $results[$r_count]->{gdt_ts_4});

			$model_count ++;

			push(@results_array, $model_qa_r{id});

			###PRINT
			##$qa_results_manager->ToString("\n", %model_qa_r);
			##print "FILE: " . $file . "\n";
			#CLEAN
			$model_qa_r{results_id} = 0;
			$model_qa_r{id} =0;

			####if ($model_qa_r{PARENT} > 0) {print "PARENT !!!\n"; exit(0)}

			}
		    }

		}
#		$model_qa_a{rmsd_4} = $6;
#		$model_qa_a{gdt_ts_4} = $8;

	    } elsif($flag && $line =~ /^(.*)/) {
		my $qa_results_manager = new QAResultsManager();
		my %model_qa_r = $qa_results_manager->get_new_model();
		$store_distances = trim($store_distances) . " " . $1;
		$model_qa_r{distances} = $store_distances;
		for(my $r_count = 0; $r_count < scalar(@results_array); $r_count++) {
		    $model_qa_r{id} = $results_array[$r_count];
		    $qa_results_manager->update(%model_qa_r);
		}

	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s \n", $file_dir, $file_name);
	return 0;
    }


    if(scalar(@mqas_score_array>0) && scalar(@gdt_array>0)) {
###
	my @pearson_correlations = pearson_correlation(\@mqas_score_array, \@gdt_array);
	$model_qa_a{pearson} = $pearson_correlations[0];
	$model_qa_a{fisher_zprime} = $pearson_correlations[1];
	$model_qa_a{spearman} = spearman_correlation(\@mqas_score_array, \@gdt_array);
###
###	my @tptest_a = tptest(\@mqas_score_array, \@gdt_array);
###	$model_qa_a{t_value} = $tptest_a[0];
###	$model_qa_a{t_probability} = $tptest_a[1];
###	$model_qa_a{df} = $tptest_a[2];
###
###	my @ftest = ftest(\@mqas_score_array, \@gdt_array);
###	$model_qa_a{f_value} = $ftest[0];
###	$model_qa_a{f_probability} = $ftest[1];
###
###    }
###
###    if(scalar(@mean_array)>0){
###	$model_qa_a{mean} = mean(\@mean_array);
###    }
###    if(scalar(@deviation_array)>0){
###	$model_qa_a{deviation} = mean(\@deviation_array);
    }


    $model_qa_a{model_count} = $model_count;

    if ($model_qa_a{id} ne '' && $model_qa_a{id} != 0) {
	$qa_analysis_manager->update(%model_qa_a);
    } else {
	$model_qa_a{id} = $qa_analysis_manager->add(%model_qa_a);
    }

    $qa_analysis_manager->ToString("\n", %model_qa_a);
   #exit(0);

    return $result;
}



sub upload_qa_load_to_DB {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $qa_analysis_manager = new QAAnalysisManager();
    my %model_qa_a = $qa_analysis_manager->get_new_model();
    %model_qa_a = $self->parce_filename($file_name, %model_qa_a);

    my $results_manager = new ResultsManager();
    $model_qa_a{predictions_id} = $results_manager->get_predictions_id(%model_qa_a);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($model_qa_a{predictions_id} eq '' || $model_qa_a{predictions_id} == 0 ) {
	print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	return 0;
    }

    $model_qa_a{id} = $qa_analysis_manager->exist_by_parameters(%model_qa_a);
    if ($model_qa_a{id} ne '' && $model_qa_a{id} != 0) {
	#
	#NOTHING TO UPDATE
	#
	#$qa_analysis_manager->update(%model_qa_a);
    } else {
	$model_qa_a{id} = $qa_analysis_manager->add(%model_qa_a);
    }

    my $model_count = 0;

    if(open(FILE, $file)) {
	my $flag = 0;
	my @results_array = ();
	my $store_distances = "";
	while(<FILE>) {
	    my $line = $_;
	    my $TARGET = $model_qa_a{TARGET};
	    if($line =~ /^END.*/) {
		#return 1;
	    } elsif($line =~ /^($TARGET\S+)\s+(\S+)\s+(.*)/) {
		$flag = 1;
		@results_array = ();
		$store_distances = "";
		my $file_prediction_name = $1;
		my $qa_results_manager = new QAResultsManager();
		my %model_qa_r = $qa_results_manager->get_new_model();
		$model_qa_r{qa_analysis_id} = $model_qa_a{id};

		if(defined($3) && $3 ne "") {
		    $model_qa_r{distances} = $3;
		} else {
		    $model_qa_r{distances} = "X";
		}

		$store_distances = $3;
		$model_qa_r{mqas_score} = $2;

		$model_qa_r{differences} = "N/A";
		$model_qa_r{pearson} = 0;
		$model_qa_r{fisher_zprime} = 0;
		$model_qa_r{mean} = 0;
		$model_qa_r{deviation} = 0;
		$model_qa_r{res_count} = 0;

		#if($2 !~ /^(\d+)/) {
		#    print "\nERROR!!!! $line\n";
		#    exit(0);
		#} else {
		#    $model_qa_r{mqas_score} = $1;
		#}
		%model_qa_r = $self->parce_filename($file_prediction_name, %model_qa_r);
		$model_qa_r{predictions_id} = $results_manager->get_predictions_id(%model_qa_r);

		if($model_qa_r{predictions_id} eq '' || $model_qa_r{predictions_id} == 0 ) {
		    print  "ERROR!!!: Can not assotiate name prediction with DB \n $file \n";
		} else {
		    my @results = $qa_results_manager->get_results_info(%model_qa_r);
		    for(my $r_count = 0; $r_count < scalar(@results); $r_count++) {
			if (($results[$r_count]->{PARENT} > 0 && $results[$r_count]->{n1_4} > 20) || ($results[$r_count]->{PARENT} < 1)) {


			#print "COUNT: " . scalar(@results) . "\n";
			$model_qa_r{results_id} = $results[$r_count]->{RESULTS_ID};
			$model_qa_r{ts_predictions_id} = $results[$r_count]->{TS_PREDICTIONS_ID};
			#$model_qa_r{PARENT} = $results[$r_count]->{PARENT};

			$model_qa_r{id} = $qa_results_manager->exist_by_parameters(%model_qa_r);
			if ($model_qa_r{id} ne '' && $model_qa_r{id} != 0) {
			    $qa_results_manager->update(%model_qa_r);
			} else {
			    $model_qa_r{id} = $qa_results_manager->add(%model_qa_r);
			    $model_qa_r{id} = $qa_results_manager->exist_by_parameters(%model_qa_r);
			}

			#$qa_analysis_manager->ToString("\n", %model_qa_r);

			push(@results_array, $model_qa_r{id});
			$model_count++;

			#print "UPLOAD $TARGET $file_name RE: " . $model_qa_r{id} . " " . $r_count . " \n";

			#CLEAN
			##if($model_qa_r{id} eq 1124679) {
			##    exit();
			##}
			$model_qa_r{results_id} = 0;
			$model_qa_r{id} =0;

			####if ($model_qa_r{PARENT} > 0) {print "PARENT !!!\n"; exit(0)}

			}
		    }

		}

	    } elsif($flag && $line =~ /^(.*)/) {
		my $qa_results_manager = new QAResultsManager();
		my %model_qa_r = $qa_results_manager->get_new_model();
		$store_distances = trim($store_distances) . " " . $1;
		$model_qa_r{distances} = $store_distances;
		for(my $r_count = 0; $r_count < scalar(@results_array); $r_count++) {
		    $model_qa_r{id} = $results_array[$r_count];
		    $qa_results_manager->update(%model_qa_r);
		}

	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s \n", $file_dir, $file_name);
	return 0;
    }

    $model_qa_a{model_count} = $model_count;


    if ($model_qa_a{id} ne '' && $model_qa_a{id} != 0) {
	$qa_analysis_manager->update(%model_qa_a);
    } else {
	$model_qa_a{id} = $qa_analysis_manager->add(%model_qa_a);
    }

    $qa_analysis_manager->ToString("\n", %model_qa_a);
   #exit(0);

    return $result;
}



##********************************Good analysis for Q1 and part QA2
sub upload_qa_analysis {
    my ($self, $target, $model_n) = @_;
    my $result = 0;

    my $qa_analysis_manager = new QAAnalysisManager();
    #my %model_qa_a = $qa_analysis_manager->get_new_model();
    my @qa_analysis = $qa_analysis_manager->get_rows({target=>$target, model=>$model_n});
	
    #LOOP for QA
    for(my $a_count = 0; $a_count < scalar(@qa_analysis); $a_count++) {
	my @mean_array =();
	my @deviation_array =();
	my @mqas_score_array =();
	my @gdt_array = ();

	my %model_qa_a = $qa_analysis_manager->get_new_model();
	$model_qa_a{id} = $qa_analysis[$a_count]->{ID};

	my $qa_results_manager = new QAResultsManager();
	my @qa_results = $qa_results_manager->get_rows({ 'qa' => $model_qa_a{id} }, 1);

	$model_qa_a{model_count} = scalar(@qa_results);

	#LOOP for RESULTS
	for(my $r_count = 0; $r_count < $model_qa_a{model_count}; $r_count++) {

# AK: Add check for frames - for calculations of QA1 CC for the QA model 
# skip those TS where there were several frames
# Note. length(MODEL_NAME)>12 in case frames are present
# Caused problems in CASP13 with subunits, e.g. T0973s1
# Uncommented
	    #if (length($qa_results[$r_count]->{MODEL_NAME}) > 12){ next; };

	    my %model_qa_res = $qa_results_manager->get_new_model();
	    $model_qa_res{id} = $qa_results[$r_count]->{ID};

	    #print " $target QA: ". $model_qa_a{id}. " " . $a_count . " RE: " . $model_qa_res{id} . " " . $r_count . " \n";
	    # QA 1 values
	    my %distances = $self->get_distances($qa_results[$r_count]->{distances}, $qa_results[$r_count]->{results_distances} );
	    $model_qa_res{res_count} = $distances{COUNT};
	    $model_qa_res{differences} = $distances{difference_str};

# AK: QA2 - number of numerical distances in QA2 prediction 
 	    #print "*** $distances{COUNT} *** \n";
 	    #print "!!!- @{$distances{qa_distance}} -!!! \n";

	    if($distances{COUNT} > 0) {
		my @pearson_correlations = pearson_correlation(\@{$distances{lga_distance}}, \@{$distances{qa_distance}});
# AK: This is QA2 pearson. WHy is it here?

		$model_qa_res{pearson} = $pearson_correlations[0];
		$model_qa_res{fisher_zprime} = $pearson_correlations[1];
		$model_qa_res{mean} = mean(\@{$distances{difference}});
		$model_qa_res{deviation} = std_dev(\@{$distances{difference}});
		push(@mean_array, $model_qa_res{mean});
		push(@deviation_array, $model_qa_res{deviation});
		#print "PEARSON " . $model_qa_res{pearson}. "\n";
	    } else {
		$model_qa_res{pearson} = 0;
		$model_qa_res{fisher_zprime} = 0;
		$model_qa_res{mean} = 0;
		$model_qa_res{deviation} = 0;
		push(@mean_array, 0);
		push(@deviation_array, 0);
	    }

	    # QA RESULTS VALUES FOR REARSON
# print "A888- $qa_results[$r_count]->{MODEL_NAME} \n";

	    push(@mqas_score_array, $qa_results[$r_count]->{mqas_score});
	    push(@gdt_array, $qa_results[$r_count]->{gdt_ts_4});
	    #if($model_qa_res{res_count} > 0) {
	    $qa_results_manager->update(%model_qa_res);
	    #}

	}

	#QA values
	if(scalar(@mqas_score_array)>0 && scalar(@gdt_array)>0) {
	    my @pearson_correlations = pearson_correlation(\@mqas_score_array, \@gdt_array);
# QA1 pearson
	    $model_qa_a{pearson} = $pearson_correlations[0];
	    $model_qa_a{fisher_zprime} = $pearson_correlations[1];
	    $model_qa_a{spearman} = spearman_correlation(\@mqas_score_array, \@gdt_array);

	    ##my @tptest_a = tptest(\@mqas_score_array, \@gdt_array);
	    ##$model_qa_a{t_value} = $tptest_a[0];
	    ##$model_qa_a{t_probability} = $tptest_a[1];
	    ##$model_qa_a{df} = $tptest_a[2];
	    ##
	    ##my @ftest = ftest(\@mqas_score_array, \@gdt_array);
	    ##$model_qa_a{f_value} = $ftest[0];
	    ##$model_qa_a{f_probability} = $ftest[1];
	} else {
	     $model_qa_a{pearson} = 0;
	    $model_qa_a{fisher_zprime} = 0;
	    $model_qa_a{spearman} = 0;
	}

	if(scalar(@mean_array)>0){
	    $model_qa_a{mean} = mean(\@mean_array);
	} else {
	     $model_qa_a{mean} = 0;
	}
	if(scalar(@deviation_array)>0){
	    $model_qa_a{deviation} = mean(\@deviation_array);
	} else {
	    $model_qa_a{deviation} = 0;
	}

	$qa_analysis_manager->update(%model_qa_a);
	$qa_analysis_manager->ToString("\n", %model_qa_a);

    }

    #FINAL DATA IS Z SCORE
    $self->upload_qa_analysis_z_score($target,$model_n);

    ###exit(0);

    return $result;
}



###****************************************AK: GOOD Z-Score (used in sub upload_qa_analysis)
sub upload_qa_analysis_z_score {
    my ($self, $target, $model_n) = @_;
    my $result = 0;

    my $qa_analysis_manager = new QAAnalysisManager();
    my @qa_analysis = $qa_analysis_manager->get_rows({target=>$target, model=>$model_n}, 1);
    my $qa_analysis_count = scalar(@qa_analysis);
    my @pearson_array =();
    my @fisher_zprime_array =();
    
    #print "START Z: " . scalar(@qa_analysis) . "\n";
    #LOOP for QA
    for(my $a_count = 0; $a_count < $qa_analysis_count; $a_count++) {
	#if(($qa_analysis[$a_count]->{MODEL_NUMBER} eq 1) && ($qa_analysis[$a_count]->{pearson} ne 0)) {
	if($qa_analysis[$a_count]->{MODEL_NUMBER} eq $model_n) {
	    push(@pearson_array, $qa_analysis[$a_count]->{pearson});
	    push(@fisher_zprime_array, $qa_analysis[$a_count]->{fisher_zprime});
	}
    }

    my @pearson_z_score_array = z_score(\@pearson_array);
    my $pearson_z_score_array_count = scalar(@pearson_z_score_array);
  
# AK: This is QA1 pearson  ---- print "5E5E5E @pearson_array \n";
# AK: This is QA1 z-score  ---- print "7E7E7E @pearson_z_score_array \n";

    my @fisher_zprime_z_score_array = z_score(\@fisher_zprime_array);

    if ($pearson_z_score_array_count != $qa_analysis_count){
	print "!!!PROBLEM WITH ARRAY LENGTHS: $target, $qa_analysis_count, $pearson_z_score_array_count\n";
	exit(0);
    }

    for (my $a_count = 0; $a_count < $qa_analysis_count; $a_count++) {
	#print "$target Z-Score!!!\n";
	my %model_qa_a = $qa_analysis_manager->get_new_model();
	$model_qa_a{id} = $qa_analysis[$a_count]->{ID};
	if($qa_analysis[$a_count]->{MODEL_NUMBER} eq $model_n) {
	    $model_qa_a{pearson_z_score} = $pearson_z_score_array[$a_count];
	    $model_qa_a{fisher_zprime_z_score} = $fisher_zprime_z_score_array[$a_count];
	} else {
	    $model_qa_a{pearson_z_score} = 0;
	    $model_qa_a{fisher_zprime_z_score} = 0;
	}

	$qa_analysis_manager->ToString("\n", %model_qa_a);
	$qa_analysis_manager->update(%model_qa_a);

    }

#	print "PEARSON \n";
#    	for (my $count = 0; $count < scalar(@pearson_array); $count++) {
#		print $pearson_array[$count] . "," ;
#    	}
#    	print "\n";
	###exit(0);

    return $result;
}




##analyse Q1 by GROUPS
## If used - needs update to look separately on model1 and model2.

sub qa_groups_analysis {
    my ($self, $to_file) = @_;
    my $result = 0;

    my $qa_analysis_manager = new QAAnalysisManager();
    #my %model_qa_a = $qa_analysis_manager->get_new_model();

    my @qa_groups = $qa_analysis_manager->get_groups({pfrmat=>'QA'});

    my @pearson_array = ();
    my @fisher_zprime_array = ();
    my @sperman_array = ();

    #LOOP for QA
    for(my $g_count = 0; $g_count < scalar(@qa_groups); $g_count++) {

	my @mqas_score_array =();
	my @gdt_array = ();

	my $qa_results_manager = new QAResultsManager();
	#my %model_qa_a = $qa_analysis_manager->get_new_model();
	#$model_qa_a{id} = $qa_analysis[$a_count]->{ID};

	my @qa_results = $qa_results_manager->get_rows({'groups_id' => $qa_groups[$g_count]->{ID}, 'qa_model'=> 1, 'limit'=> 200000}, 1);

	#LOOP for RESULTS
	for(my $r_count = 0; $r_count < scalar(@qa_results); $r_count++) {

	    #my %model_qa_res = $qa_results_manager->get_new_model();
	    #$model_qa_res{id} = $qa_results[$r_count]->{ID};
	    print "GROUP: ". $qa_groups[$g_count]->{ID} . " " . $qa_groups[$g_count]->{CODE} . " count: " . $g_count . " RE: " . $qa_results[$r_count]->{ID} . " " . $r_count . " \n";

	    # QA RESULTS VALUES FOR REARSON
	    push(@mqas_score_array, $qa_results[$r_count]->{mqas_score});
	    push(@gdt_array, $qa_results[$r_count]->{gdt_ts_4});

	}

	#GROUPS values
	if(scalar(@mqas_score_array>0) && scalar(@gdt_array>0)) {

	    my @pearson_correlations = pearson_correlation(\@mqas_score_array, \@gdt_array);

	    push(@pearson_array, $pearson_correlations[0]);
	    push(@fisher_zprime_array, $pearson_correlations[1]);
	    push(@sperman_array, spearman_correlation(\@mqas_score_array, \@gdt_array));

	} else {
	    push(@pearson_array, 0);
	    push(@fisher_zprime_array, 0);
	}

    }

    my @pearson_z_score_array = z_score(\@pearson_array);
    my @fisher_zprime_z_score_array = z_score(\@fisher_zprime_array);
    my @sperman_array_z_score_array = z_score(\@sperman_array);


    open(FILE ,"> $to_file");

    print FILE sprintf("GR_ID, CODE, Pearson, Pearson Z-Score, Fisher Zprime, FisherZ Z-Scoer, Sperman, Sperman Z-Score  \n");

    for(my $g_count = 0; $g_count < scalar(@qa_groups); $g_count++) {
	print FILE sprintf("%s, %s, %s, %s, %s, %s, %s, %s \n",
	$qa_groups[$g_count]->{ID}, $qa_groups[$g_count]->{CODE}, $pearson_array[$g_count], $pearson_z_score_array[$g_count],
	$fisher_zprime_array[$g_count], $fisher_zprime_z_score_array[$g_count], $sperman_array[$g_count], $sperman_array_z_score_array[$g_count]);
    }

    close(FILE);


    ###exit(0);

    return $result;
}



##Good analysis of Q1 and part QA2
## model_n switches MODEL number

sub upload_qa2_pearson_analysis {
    my ($self, $target, $model_n) = @_;
    my $result = 0;

    my $qa_analysis_manager = new QAAnalysisManager();
    #my %model_qa_a = $qa_analysis_manager->get_new_model();

    my @qa_analysis = $qa_analysis_manager->get_rows({target=>$target, model=>$model_n});

    my @qa2_mean_pearson_array =();
    my @qa2_mean_fisher_zprime_array =();


    #LOOP for QA
    my @index=(0);	

# AK: Index needed to skip empty QA2 predictions below
    for(my $a_count = 0; $a_count < scalar(@qa_analysis); $a_count++) {
	my @qa2_pearson_array =();
	my @qa2_fisher_zprime_array =();

	####
	my @qa2_mean_res_array =();
	my @qa2_deviation_res_array =();


	my $qa_results_manager = new QAResultsManager();

	my @qa_results = $qa_results_manager->get_rows({ 'qa' => $qa_analysis[$a_count]->{ID} }, 1);

	#LOOP for TS RESULTS
	my $check_all0=0;
	for(my $r_count = 0; $r_count < scalar(@qa_results); $r_count++) {

# AK: Add check for frames - skip those TS where there were several frames
# Note. length(MODEL_NAME)>12 in case frames are present
# See why commented above for QA1
	    #if (length($qa_results[$r_count]->{MODEL_NAME}) > 12){ next; };

	    my %model_qa_res = $qa_results_manager->get_new_model();

# AK: Populating array with Pearson's r between predicted and actual distances for every TS prediction 
# AK: If some model's cc=0, this value is also pushed to the array
            push(@qa2_pearson_array, $qa_results[$r_count]->{pearson});
	    $check_all0+=$qa_results[$r_count]->{pearson};
	    push(@qa2_fisher_zprime_array, $qa_results[$r_count]->{fisher_zprime});
	    push(@qa2_mean_res_array, $qa_results[$r_count]->{mean});
	    push(@qa2_deviation_res_array, $qa_results[$r_count]->{deviation});

#	    print "$target QA: ". $qa_analysis[$a_count]->{ID} . " " . $a_count . " RE: " . $qa_results[$r_count]->{ID} . " " . $r_count . " \n";
	    # QA 1 values

	    #if($model_qa_res{res_count} > 0) {
	    ##$qa_results_manager->update(%model_qa_res);
	    #}

	}
#print "-- $check_all0, @qa2_pearson_array\n";

	my %model_qa_a = $qa_analysis_manager->get_new_model();
	$model_qa_a{id} = $qa_analysis[$a_count]->{ID};
	$model_qa_a{mean} = mean(\@qa2_mean_res_array);
	$model_qa_a{deviation} = mean(\@qa2_deviation_res_array);
	#
	$qa_analysis_manager->update(%model_qa_a);

# AK: Check if proper models are assigned z-scores when 0-only QA2 predictions are skipped
        if ($check_all0){
		push(@qa2_mean_pearson_array, mean(\@qa2_pearson_array));
		push(@qa2_mean_fisher_zprime_array, mean(\@qa2_fisher_zprime_array));
		$index[$a_count]=$#qa2_mean_pearson_array;
	} else {
		$index[$a_count]=999;
# AK: This should be high enough number, bigger than the max number of QA groups submitting predictions on target
	}
    }

    my @qa2_pearson_z_score_array = z_score(\@qa2_mean_pearson_array);
# print "TYTYTY @qa2_mean_pearson_array \n @qa2_pearson_z_score_array\n";

    my @qa2_fisher_zprime_z_score_array = z_score(\@qa2_mean_fisher_zprime_array);

# AK: Set QA2 cc and z-scores of empty QA2 predictions to 0 
    $qa2_mean_pearson_array[999]=$qa2_mean_fisher_zprime_array[999]=$qa2_pearson_z_score_array[999]=$qa2_fisher_zprime_z_score_array[999]=0;	


    for(my $a_count = 0; $a_count < scalar(@qa_analysis); $a_count++) {
	my %model_qa_a = $qa_analysis_manager->get_new_model();
	$model_qa_a{id} = $qa_analysis[$a_count]->{ID};

#	$model_qa_a{qa2_pearson} = $qa2_mean_pearson_array[$a_count];
#	$model_qa_a{qa2_fisher_zprime} = $qa2_mean_fisher_zprime_array[$a_count];
#	$model_qa_a{qa2_pearson_z_score} = $qa2_pearson_z_score_array[$a_count];
#	$model_qa_a{qa2_fisher_zprime_z_score} = $qa2_fisher_zprime_z_score_array[$a_count];

# Change QA number with indexes introduced above
	$model_qa_a{qa2_pearson} = $qa2_mean_pearson_array[$index[$a_count]];
	$model_qa_a{qa2_fisher_zprime} = $qa2_mean_fisher_zprime_array[$index[$a_count]];
	$model_qa_a{qa2_pearson_z_score} = $qa2_pearson_z_score_array[$index[$a_count]];
	$model_qa_a{qa2_fisher_zprime_z_score} = $qa2_fisher_zprime_z_score_array[$index[$a_count]];
	$qa_analysis_manager->update(%model_qa_a);
	$qa_analysis_manager->ToString("\n", %model_qa_a);
    }

    ###exit(0);

    return $result;
}



##Good analyse Q1 and part QA2
## swich MODEL 1 or MODEL ALL or nothing

sub upload_qa2_z_scores {
    my ($self, $target) = @_;
    my $result = 0;

    my $qa_analysis_manager = new QAAnalysisManager();
    #my %model_qa_a = $qa_analysis_manager->get_new_model();

    my @qa_analysis = $qa_analysis_manager->get_rows({target=>$target, 'is_qa2_only' => 1, model => 1}, 1);


    #my @pearson_array =();
    #my @fisher_zprime_array =();

    my @qa2_mean_pearson_array =();
    my @qa2_mean_fisher_zprime_array =();


    #LOOP for QA
    for(my $a_count = 0; $a_count < scalar(@qa_analysis); $a_count++) {

	push(@qa2_mean_pearson_array, $qa_analysis[$a_count]->{qa2_pearson});
	push(@qa2_mean_fisher_zprime_array, $qa_analysis[$a_count]->{qa2_fisher_zprime});

    }

    my @qa2_pearson_z_score_array = z_score(\@qa2_mean_pearson_array);
#print "WEWEWE @qa2_mean_pearson_array \n @qa2_pearson_z_score_array\n";
    my @qa2_fisher_zprime_z_score_array = z_score(\@qa2_mean_fisher_zprime_array);

    for(my $a_count = 0; $a_count < scalar(@qa_analysis); $a_count++) {
	my %model_qa_a = $qa_analysis_manager->get_new_model();
	$model_qa_a{id} = $qa_analysis[$a_count]->{ID};
	###$model_qa_a{qa2_pearson} = $qa2_mean_pearson_array[$a_count];
	###$model_qa_a{qa2_fisher_zprime} = $qa2_mean_fisher_zprime_array[$a_count];
	$model_qa_a{qa2_pearson_z_score} = $qa2_pearson_z_score_array[$a_count];
	$model_qa_a{qa2_fisher_zprime_z_score} = $qa2_fisher_zprime_z_score_array[$a_count];
	#
	#push(@qa2_mean_pearson_array, $model_qa_a{qa2_pearson});
	#push(@qa2_mean_fisher_zprime_array, $model_qa_a{qa2_fisher_zprime});
	$qa_analysis_manager->update(%model_qa_a);
	$qa_analysis_manager->ToString("\n", %model_qa_a);
    }

    ###exit(0);

    return $result;
}


sub upload_qa_analysis_z_score_pearson {
    my ($self, $target) = @_;
    my $result = 0;


    my $qa_analysis_manager = new QAAnalysisManager();
    #my %model_qa_a = $qa_analysis_manager->get_new_model();

    my @qa_analysis = $qa_analysis_manager->get_rows({target=>$target});


    my @pearson_array =();
    my @fisher_zprime_array =();


    #LOOP for QA
    for(my $a_count = 0; $a_count < scalar(@qa_analysis); $a_count++) {
	##	print $distances{difference}[$i] . ",";
	##    }

	my @mean_array =();
	my @deviation_array =();
	my @mqas_score_array =();
	my @gdt_array = ();


	my $qa_results_manager = new QAResultsManager();
	#my %model_qa_a = $qa_analysis_manager->get_new_model();
        my %model_qa_a = $qa_analysis_manager->get_new_model();
	$model_qa_a{id} = $qa_analysis[$a_count]->{ID};

	my @qa_results = $qa_results_manager->get_rows({ 'qa' => $model_qa_a{id} });

	$model_qa_a{model_count} = scalar(@qa_results);


	#LOOP for RESULTS
	for(my $r_count = 0; $r_count < $model_qa_a{model_count}; $r_count++) {

	    my %model_qa_res = $qa_results_manager->get_new_model();
	    $model_qa_res{id} = $qa_results[$r_count]->{ID};

#	    print "TARGET $target QA: ". $model_qa_a{id}. " " . $a_count . " RE: " . $model_qa_res{id} . " " . $r_count . " \n";

	    push(@mqas_score_array, $qa_results[$r_count]->{mqas_score});
	    push(@gdt_array, $qa_results[$r_count]->{gdt_ts_4});
	}

	#QA values

	if(scalar(@mqas_score_array>0) && scalar(@gdt_array>0)) {

	    my @pearson_correlations = pearson_correlation(\@mqas_score_array, \@gdt_array);
	    $model_qa_a{pearson} = $pearson_correlations[0];
	    $model_qa_a{fisher_zprime} = $pearson_correlations[1];
	    $model_qa_a{spearman} = spearman_correlation(\@mqas_score_array, \@gdt_array);

	    ##my @tptest_a = tptest(\@mqas_score_array, \@gdt_array);
	    ##$model_qa_a{t_value} = $tptest_a[0];
	    ##$model_qa_a{t_probability} = $tptest_a[1];
	    ##$model_qa_a{df} = $tptest_a[2];
	    ##
	    ##my @ftest = ftest(\@mqas_score_array, \@gdt_array);
	    ##$model_qa_a{f_value} = $ftest[0];
	    ##$model_qa_a{f_probability} = $ftest[1];
	}

	if(scalar(@mean_array)>0){
	    $model_qa_a{mean} = mean(\@mean_array);
	}
	if(scalar(@deviation_array)>0){
	    $model_qa_a{deviation} = mean(\@deviation_array);
	}

	push(@pearson_array, $model_qa_a{pearson});
	push(@fisher_zprime_array, $model_qa_a{fisher_zprime});


	$qa_analysis_manager->update(%model_qa_a);
	$qa_analysis_manager->ToString("\n", %model_qa_a);

    }

    my @pearson_z_score_array = z_score(\@pearson_array);
    my @fisher_zprime_z_score_array = z_score(\@fisher_zprime_array);

    for (my $a_count = 0; $a_count < scalar(@qa_analysis); $a_count++) {
    ##	print $distances{difference}[$i] . ",";
#	print "$target Z-Score!!!\n";
	my %model_qa_a = $qa_analysis_manager->get_new_model();
	$model_qa_a{id} = $qa_analysis[$a_count]->{ID};
	$model_qa_a{pearson_z_score} = $pearson_z_score_array[$a_count];
	$model_qa_a{fisher_zprime_z_score} = $fisher_zprime_z_score_array[$a_count];
	$qa_analysis_manager->ToString("\n", %model_qa_a);
	$qa_analysis_manager->update(%model_qa_a);

    }

#print "\n\nZ_SCORE!::::: " . scalar(@pearson_z_score_array);

    ###exit(0);

    return $result;
}

sub upload_qa {
    my ($self, $file_name, $file_dir) = @_;
    my $result = 0;
    my $file  = sprintf("%s/%s", $file_dir, $file_name);

    my $qa_analysis_manager = new QAAnalysisManager();
    my %model_qa_a = $qa_analysis_manager->get_new_model();
    %model_qa_a = $self->parce_filename($file_name, %model_qa_a);

    my $results_manager = new ResultsManager();
    $model_qa_a{predictions_id} = $results_manager->get_predictions_id(%model_qa_a);

    #TODO: If prediction are not exist - return null or exit
    # need some notification or log info for such case
    if($model_qa_a{predictions_id} eq '' || $model_qa_a{predictions_id} == 0 ) {
	print  "ERROR!!!: Can not assotiate file prediction with DB \n $file \n";
	return 0;
    }

    $model_qa_a{id} = $qa_analysis_manager->exist_by_parameters(%model_qa_a);
    if ($model_qa_a{id} ne '' && $model_qa_a{id} != 0) {
	$qa_analysis_manager->update(%model_qa_a);
    } else {
	$model_qa_a{id} = $qa_analysis_manager->add(%model_qa_a);
    }
    #$qa_analysis_manager->ToString("\n", %model_qa_a);

    my @gdt_array = ();
    my @mqas_score_array = ();
    my @mean_array = ();
    my @deviation_array = ();
    my $model_count = 0;



    if(open(FILE, $file)) {
	my $flag = 0;
	my @results_array = ();
	my $store_distances = "";
	while(<FILE>) {
	    my $line = $_;
	    my $TARGET = $model_qa_a{TARGET};
	    if($line =~ /^END.*/) {
		#return 1;
	    } elsif($line =~ /^($TARGET\S+)\s+(\S+)\s+(.*)/) {
		$flag = 1;
		@results_array = ();
		my $file_prediction_name = $1;
		my $qa_results_manager = new QAResultsManager();
		my %model_qa_r = $qa_results_manager->get_new_model();
		$model_qa_r{qa_analysis_id} = $model_qa_a{id};
		$model_qa_r{distances} = $3;
		$store_distances = $3;
		$model_qa_r{mqas_score} = $2;
		#if($2 !~ /^(\d+)/) {
		#    print "\nERROR!!!! $line\n";
		#    exit(0);
		#} else {
		#    $model_qa_r{mqas_score} = $1;
		#}

		%model_qa_r = $self->parce_filename($file_prediction_name, %model_qa_r);
		$model_qa_r{predictions_id} = $results_manager->get_predictions_id(%model_qa_r);

		if($model_qa_r{predictions_id} eq '' || $model_qa_r{predictions_id} == 0 ) {
		    print  "ERROR!!!: Can not assotiate name prediction with DB \n $file \n";
		} else {
		    my @results = $qa_results_manager->get_results_info(%model_qa_r);
		    for(my $r_count = 0; $r_count < scalar(@results); $r_count++) {
			#print "COUNT: " . scalar(@results) . "\n";
			$model_qa_r{results_id} = $results[$r_count]->{RESULTS_ID};
			$model_qa_r{PARENT} = $results[$r_count]->{PARENT};


		    my %distances = $self->get_distances($model_qa_r{distances}, $results[$r_count]->{distances});

		    $model_qa_r{res_count} = $distances{COUNT};
		    $model_qa_r{differences} = $distances{difference_str};
		    if($distances{COUNT} > 0) {
			#print "\n PEARSON scalar " . scalar(@{$distances{difference}}) . " \n";
			my @pearson_correlations = pearson_correlation(\@{$distances{lga_distance}}, \@{$distances{qa_distance}});
			$model_qa_r{pearson} = $pearson_correlations[0];
			$model_qa_r{fisher_zprime} = $pearson_correlations[1];


			#print "MEAN scalar " . scalar(@{$distances{difference}}) . " \n";
			$model_qa_r{mean} = mean(\@{$distances{difference}});
			$model_qa_r{deviation} = std_dev(\@{$distances{difference}});

			push(@mean_array, $model_qa_r{mean});
			push(@deviation_array, $model_qa_r{deviation});

			#print "PEARSON " . $model_qa_r{pearson}. "\n";

		    }


		    #print "\nCOUNT: " . $distances{COUNT} ."\n";

		##    print "\n DIFFERENCE: \n";
		##    for(my $i = 0; $i < $distances{COUNT}; $i++) {
		##	print $distances{difference}[$i] . ",";
		##    }
		##    print "\n QA: \n";
		##    for(my $i = 0; $i < $distances{COUNT}; $i++) {
		##	print $distances{qa_distance}[$i] . ",";
		##    }
		##    print "\n LGA: \n";
		##    for(my $i = 0; $i < $distances{COUNT}; $i++) {
		##	print $distances{lga_distance}[$i] . ",";
		##    }

			$model_qa_r{id} = $qa_results_manager->exist_by_parameters(%model_qa_r);
			if ($model_qa_r{id} ne '' && $model_qa_r{id} != 0) {
			    $qa_results_manager->update(%model_qa_r);
			} else {
			    $model_qa_r{id} = $qa_results_manager->add(%model_qa_r);
			}

			push(@mqas_score_array, $model_qa_r{mqas_score});
			push(@gdt_array, $results[$r_count]->{gdt_ts_4});
			$model_count ++;

			push(@results_array, $model_qa_r{id});
			###PRINT
			##$qa_results_manager->ToString("\n", %model_qa_r);
			##print "FILE: " . $file . "\n";
			#CLEAN
			$model_qa_r{results_id} = 0;
			$model_qa_r{id} =0;
			$model_qa_r{pearson} = '';
			$model_qa_r{mean} = '';
			$model_qa_r{deviation} = '';
			$model_qa_r{differences} = '';

			####if ($model_qa_r{PARENT} > 0) {print "PARENT !!!\n"; exit(0)}
		    }
		}
#		$model_qa_a{rmsd_4} = $6;
#		$model_qa_a{gdt_ts_4} = $8;

	    } elsif($flag && $line =~ /^(.*)/) {
		my $qa_results_manager = new QAResultsManager();
		my %model_qa_r = $qa_results_manager->get_new_model();
		$store_distances = $store_distances . " " . $1;
		$model_qa_r{distances} = $store_distances;
		for(my $r_count = 0; $r_count < scalar(@results_array); $r_count++) {
		    $model_qa_r{id} = $results_array[$r_count];
		    $qa_results_manager->update(%model_qa_r);
		}

	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s \n", $file_dir, $file_name);
	return 0;
    }


    if(scalar(@mqas_score_array>0) && scalar(@gdt_array>0)) {

	my @pearson_correlations = pearson_correlation(\@mqas_score_array, \@gdt_array);
	$model_qa_a{pearson} = $pearson_correlations[0];
	$model_qa_a{fisher_zprime} = $pearson_correlations[1];
	$model_qa_a{spearman} = spearman_correlation(\@mqas_score_array, \@gdt_array);

	my @tptest_a = tptest(\@mqas_score_array, \@gdt_array);
	$model_qa_a{t_value} = $tptest_a[0];
	$model_qa_a{t_probability} = $tptest_a[1];
	$model_qa_a{df} = $tptest_a[2];

	my @ftest = ftest(\@mqas_score_array, \@gdt_array);
	$model_qa_a{f_value} = $ftest[0];
	$model_qa_a{f_probability} = $ftest[1];

    }

    if(scalar(@mean_array)>0){
	$model_qa_a{mean} = mean(\@mean_array);
    }
    if(scalar(@deviation_array)>0){
	$model_qa_a{deviation} = mean(\@deviation_array);
    }


    $model_qa_a{model_count} = $model_count;


    if ($model_qa_a{id} ne '' && $model_qa_a{id} != 0) {
	$qa_analysis_manager->update(%model_qa_a);
    } else {
	$model_qa_a{id} = $qa_analysis_manager->add(%model_qa_a);
    }

    $qa_analysis_manager->ToString("\n", %model_qa_a);
   #exit(0);

    return $result;
}

sub get_distances {
    my ($self, $qa_values, $lga_values) = @_;
    my @qa_distance = ();
my @lga_distance = ();
my $difference_str = "";
my @difference = ();
my $COUNT = 0;

# Andriy: Fixed split - it was / / and not /s+/  as it should be

    my @qa = split(/\s+/, trim($qa_values));
    my @lga = split(/\s+/, trim($lga_values));

    my $qa_count = scalar(@qa);
    my $lga_count = scalar(@lga);
    my $min_count = (($qa_count>$lga_count)?$lga_count:$qa_count);


# print "MIN COUNT:".$min_count."\n";

    for(my $i = 0; $i < $min_count; $i++) {
#	print "Outside IF: $i, $lga[$i], $qa[$i] \n";
        if(($qa[$i] =~ /^\d+/) && ($lga[$i] =~ /^\d+/)) {

# Andriy: Fixed check condition - it was without parenthersis and checking for 'X'
###
#	print "Inside IF: $i, $lga[$i], $qa[$i] \n";

### AK: Set all distances higher than 5A to 5 	    
   	    if ($lga[$i] > 5) {$lga[$i]=5;} 
   	    if ($qa[$i] > 5) {$qa[$i]=5;} 

	    my $difference_tmp = abs($qa[$i] - $lga[$i]);
	    push(@difference, $difference_tmp);
	    if($difference_str eq "") {
		$difference_str = $difference_tmp;
	    } else {
		$difference_str = sprintf("%s %s", $difference_str, $difference_tmp);
	    }
	    push(@qa_distance, $qa[$i]);
	    push(@lga_distance, $lga[$i]);
	    $COUNT++;
	}
    }
    if ($COUNT eq 0) {
	$difference_str = "N/A";
    }
    my %dist = (
	    COUNT => $COUNT,
	    difference_str => $difference_str,
	    qa_distance => [@qa_distance],
	    lga_distance => [@lga_distance],
	    difference => [@difference],
	    );

    return %dist;
}


sub upload_gdt_z_score {
    my ($self, $target_name) = @_;

    my $results_manager = new ResultsManager();

    my @results = $results_manager->get_results({'target'=> $target_name, 'model'=>'1'});
    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
	push(@gdt_array, $results[$i]->{GDT_TS_4});
	push(@al0p_array, $results[$i]->{AL0P});
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);

    my %model = $results_manager->get_new_model();

    for(my $i = 0; $i < scalar(@results); $i++) {
	$model{id} = $results[$i]->{ID};
	$model{gdt_4_z_score} = $gdt_z_score_array[$i];
	$model{al0p_5_z_score} = $al0p_z_score_array[$i];
	#$results_manager->ToString("\n", %model);
	$results_manager->update_results(%model);
    }

    return 1;
}

sub upload_gdt_z_score_parentselected {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();
    my @results = $results_manager->get_results({'target'=> $target_name, 'model'=>'1'});
    my %hash_res_id; my %hash_score;
    # loop over all moels to select models with parent <> 0
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} == 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(!defined($hash_res_id{$key})){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }elsif($hash_score{$key} < $results[$i]->{GDT_TS_4}){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }
    }
    # loop over all models with parent = 0 
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} != 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key})){next;}
        $hash_res_id{$key} = $results[$i]->{ID};
    }
    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
           push(@gdt_array, $results[$i]->{GDT_TS_4});
           push(@al0p_array, $results[$i]->{AL0P});
        }
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);
    my $j = 0;
    my %model = $results_manager->get_new_model();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
          $model{id} = $results[$i]->{ID};
          $model{gdt_4_z_score} = $gdt_z_score_array[$j];
          $model{al0p_5_z_score} = $al0p_z_score_array[$j];
          #$results_manager->ToString("\n", %model);
          $results_manager->update_results(%model);
          $j++;
        }
    }
    return 1;
}



sub upload_gdt_z_score_server_group {
    my ($self, $target_name) = @_;

    my $results_manager = new ResultsManager();

    my @results = $results_manager->get_results({'target'=> $target_name, 'model'=>'1', groups_type=> 'server'});
    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
	push(@gdt_array, $results[$i]->{GDT_TS_4});
	push(@al0p_array, $results[$i]->{AL0P});
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);

    my %model = $results_manager->get_new_model();

    for(my $i = 0; $i < scalar(@results); $i++) {
	$model{id} = $results[$i]->{ID};
	$model{gdt_4_z_score_server} = $gdt_z_score_array[$i];
	$model{al0p_5_z_score_server} = $al0p_z_score_array[$i];
	#$results_manager->ToString("\n", %model);
	$results_manager->update_results(%model);
    }
    return 1;
}


sub upload_gdt_z_score_server_group_parentselected {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();
    my @results = $results_manager->get_results({'target'=> $target_name, 'model'=>'1',groups_type=> 'server'});
    my %hash_res_id; my %hash_score;
    # loop over all moels to select models with parent <> 0
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} == 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(!defined($hash_res_id{$key})){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }elsif($hash_score{$key} < $results[$i]->{GDT_TS_4}){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }
    }
    # loop over all models with parent = 0 
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} != 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key})){next;}
        $hash_res_id{$key} = $results[$i]->{ID};
    }
    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
           push(@gdt_array, $results[$i]->{GDT_TS_4});
           push(@al0p_array, $results[$i]->{AL0P});
        }
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);
    my $j = 0;
    my %model = $results_manager->get_new_model();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
          $model{id} = $results[$i]->{ID};
          $model{gdt_4_z_score_server} = $gdt_z_score_array[$j];
          $model{al0p_5_z_score_server} = $al0p_z_score_array[$j];
          #$results_manager->ToString("\n", %model);
          $results_manager->update_results(%model);
          $j++;
        }
    }
    return 1;
}





sub upload_gdt_z_score_by_all_model {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();
    my @results = $results_manager->get_results({'target'=> $target_name});
    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();

    for(my $i = 0; $i < scalar(@results); $i++) {
	push(@gdt_array, $results[$i]->{GDT_TS_4});
	push(@al0p_array, $results[$i]->{AL0P});
    }

    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);

    my %model = $results_manager->get_new_model();
    for(my $i = 0; $i < scalar(@results); $i++) {
	$model{id} = $results[$i]->{ID};
	$model{gdt_4_z_score_all} = $gdt_z_score_array[$i];
	$model{al0p_5_z_score_all} = $al0p_z_score_array[$i];
	#$results_manager->ToString("\n", %model);
	$results_manager->update_results(%model);
    }
    return 1;
}

sub upload_gdt_z_score_by_all_model_parentselected {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();
    my @results = $results_manager->get_results({'target'=> $target_name});
    my %hash_res_id; my %hash_score;
    # loop over all moels to select models with parent <> 0
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} == 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(!defined($hash_res_id{$key})){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }elsif($hash_score{$key} < $results[$i]->{GDT_TS_4}){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }
    }
    # loop over all models with parent = 0 
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} != 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key})){next;}
        $hash_res_id{$key} = $results[$i]->{ID};
    }
    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
           push(@gdt_array, $results[$i]->{GDT_TS_4});
           push(@al0p_array, $results[$i]->{AL0P});
        }
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);
    my $j = 0;
    my %model = $results_manager->get_new_model();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
          $model{id} = $results[$i]->{ID};
          $model{gdt_4_z_score_all} = $gdt_z_score_array[$j];
          $model{al0p_5_z_score_all} = $al0p_z_score_array[$j];
          #$results_manager->ToString("\n", %model);
          $results_manager->update_results(%model);
          $j++;
        }
    }
    return 1;
}




sub upload_gdt_z_score_server_by_all_model {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();

    my @results = $results_manager->get_results({'target'=> $target_name, groups_type=> 'server'});


    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();

    for(my $i = 0; $i < scalar(@results); $i++) {
	push(@gdt_array, $results[$i]->{GDT_TS_4});
	push(@al0p_array, $results[$i]->{AL0P});
    }

    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);

    my %model = $results_manager->get_new_model();

    for(my $i = 0; $i < scalar(@results); $i++) {
	$model{id} = $results[$i]->{ID};
	$model{gdt_4_z_score_server_all} = $gdt_z_score_array[$i];
	$model{al0p_5_z_score_server_all} = $al0p_z_score_array[$i];
	#$results_manager->ToString("\n", %model);
	$results_manager->update_results(%model);
    }

    return 1;
}


sub upload_gdt_z_score_server_by_all_model_parentselected {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();
    my @results = $results_manager->get_results({'target'=> $target_name,groups_type=> 'server'});
    my %hash_res_id; my %hash_score;
    # loop over all moels to select models with parent <> 0
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} == 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(!defined($hash_res_id{$key})){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }elsif($hash_score{$key} < $results[$i]->{GDT_TS_4}){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_TS_4};
        }
    }
    # loop over all models with parent = 0 
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} != 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key})){next;}
        $hash_res_id{$key} = $results[$i]->{ID};
    }
    my @gdt_array = ();
    my @al0p_array = ();
    my @gdt_z_score_array = ();
    my @al0p_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
           push(@gdt_array, $results[$i]->{GDT_TS_4});
           push(@al0p_array, $results[$i]->{AL0P});
        }
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    @al0p_z_score_array = z_score(\@al0p_array);
    my $j = 0;
    my %model = $results_manager->get_new_model();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
          $model{id} = $results[$i]->{ID};
          $model{gdt_4_z_score_server_all} = $gdt_z_score_array[$j];
          $model{al0p_5_z_score_server_all} = $al0p_z_score_array[$j];
          #$results_manager->ToString("\n", %model);
          $results_manager->update_results(%model);
          $j++;
        }
    }
    return 1;
}






sub upload_gdt_ha_z_score_server_group {
    my ($self, $target_name) = @_;

    my $results_manager = new ResultsManager();

    my @results = $results_manager->get_results({'target'=> $target_name, 'model'=>'1', groups_type=> 'server'});
    my @gdt_ha_array = ();
    my @gdt_ha_z_score_array = ();

    for(my $i = 0; $i < scalar(@results); $i++) {
	push(@gdt_ha_array, $results[$i]->{GDT_HA_4});
    }

    @gdt_ha_z_score_array = z_score(\@gdt_ha_array);


    my %model = $results_manager->get_new_model();

    for(my $i = 0; $i < scalar(@results); $i++) {
	$model{id} = $results[$i]->{ID};
	$model{gdt_ha_4_z_score_server} = $gdt_ha_z_score_array[$i];
	#$results_manager->ToString("\n", %model);
	$results_manager->update_results(%model);
    }

    return 1;
}


sub upload_gdt_ha_z_score_server_group_parentselected {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();
    my @results = $results_manager->get_results({'target'=> $target_name,'model'=>'1','groups_type'=> 'server'});
    my %hash_res_id; my %hash_score;
    # loop over all moels to select models with parent <> 0
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} == 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(!defined($hash_res_id{$key})){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_HA_4};
        }elsif($hash_score{$key} < $results[$i]->{GDT_HA_4}){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_HA_4};
        }
    }
    # loop over all models with parent = 0 
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} != 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key})){next;}
        $hash_res_id{$key} = $results[$i]->{ID};
    }
    my @gdt_array = ();
    my @gdt_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
           push(@gdt_array, $results[$i]->{GDT_HA_4});
        }
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    my $j = 0;
    my %model = $results_manager->get_new_model();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
          $model{id} = $results[$i]->{ID};
          $model{gdt_ha_4_z_score_server} = $gdt_z_score_array[$j];
          #$results_manager->ToString("\n", %model);
          $results_manager->update_results(%model);
          $j++;
        }
    }
    return 1;
}


sub upload_gdt_ha_z_score_all_group {
    my ($self, $target_name) = @_;

    my $results_manager = new ResultsManager();

    my @results = $results_manager->get_results({'target'=> $target_name, 'model'=>'1', groups_type=> 'all'});
    my @gdt_ha_array = ();
    my @gdt_ha_z_score_array = ();

    for(my $i = 0; $i < scalar(@results); $i++) {
	push(@gdt_ha_array, $results[$i]->{GDT_HA_4});
    }

    @gdt_ha_z_score_array = z_score(\@gdt_ha_array);


    my %model = $results_manager->get_new_model();

    for(my $i = 0; $i < scalar(@results); $i++) {
	$model{id} = $results[$i]->{ID};
	$model{gdt_ha_4_z_score_all} = $gdt_ha_z_score_array[$i];
	#$results_manager->ToString("\n", %model);
	$results_manager->update_results(%model);
    }

    return 1;
}


sub upload_gdt_ha_z_score_all_group_parentselected {
    my ($self, $target_name) = @_;
    my $results_manager = new ResultsManager();
    my @results = $results_manager->get_results({'target'=> $target_name,'model'=>'1','groups_type'=> 'all'});
    my %hash_res_id; my %hash_score;
    # loop over all moels to select models with parent <> 0
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} == 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(!defined($hash_res_id{$key})){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_HA_4};
        }elsif($hash_score{$key} < $results[$i]->{GDT_HA_4}){
                $hash_res_id{$key} = $results[$i]->{ID};
                $hash_score{$key} = $results[$i]->{GDT_HA_4};
        }
    }
    # loop over all models with parent = 0 
    for(my $i = 0; $i < scalar(@results); $i++){
        if($results[$i]->{PARENT} != 0){next;}
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key})){next;}
        $hash_res_id{$key} = $results[$i]->{ID};
    }
    my @gdt_array = ();
    my @gdt_z_score_array = ();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
           push(@gdt_array, $results[$i]->{GDT_HA_4});
        }
    }
    @gdt_z_score_array = z_score(\@gdt_array);
    my $j = 0;
    my %model = $results_manager->get_new_model();
    for(my $i = 0; $i < scalar(@results); $i++) {
        my $key = $results[$i]->{PREDICTIONS_ID}."_".$results[$i]->{DOMAIN};
        if(defined($hash_res_id{$key}) && $hash_res_id{$key}==$results[$i]->{ID}){
          $model{id} = $results[$i]->{ID};
          $model{gdt_ha_4_z_score_all} = $gdt_z_score_array[$j];
          #$results_manager->ToString("\n", %model);
          $results_manager->update_results(%model);
          $j++;
        }
    }
    return 1;
}


sub upload_gdt_ts_z_score_best_models_for_all_groups {
    my ($self, $target_name) = @_;
 
    my $domain = 0;
    my $target = $target_name;
    if ($target_name =~ m/(\S+)-D([0-9]+)/){
	$target = $1;
	$domain = $2;
    }
    print "$target\t$domain\n";


    my $targets_manager = new TargetsManager();
    my $target_id = $targets_manager->get_id_by_name($target);

    print "$target_id\n";

 
    my $query = "SELECT casp13.update_stat_best_models($target_id,$domain)";
    my $sth = $self->{_database}->query($query);

    $query = "SELECT casp13.update_z_scores_best_models($target_id,$domain)";
    $sth = $self->{_database}->query($query);
    
}



sub upload_dal_z_score_server_and_group {
    my ($self, $target_name) = @_;

    my $results_manager = new ResultsManager();

    my @results = $results_manager->get_results({'target'=> $target_name, 'model'=>'1', groups_type=> 'all'});
    my @gdt_ha_array = ();
    my @gdt_ha_z_score_array = ();

    for(my $i = 0; $i < scalar(@results); $i++) {
	push(@gdt_ha_array, $results[$i]->{GDT_HA_4});
    }

    @gdt_ha_z_score_array = z_score(\@gdt_ha_array);

    my %model = $results_manager->get_new_model();

    for(my $i = 0; $i < scalar(@results); $i++) {
	$model{id} = $results[$i]->{ID};
	$model{gdt_ha_4_z_score_all} = $gdt_ha_z_score_array[$i];
	#$results_manager->ToString("\n", %model);
	$results_manager->update_results(%model);
    }

    return 1;
}



1;
