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})(.{2})(.{3})_(.{1})";
my $FILE_NAME_FORMAT_PARENT = "^(.{5})(.{2})(.{3})_(.{1})_(.{1})";
my $FILE_NAME_FORMAT_PARENT_DOMAIN = "^(.{5})(.{2})(.{3})_(.{1})_(.{1})-D(.{1})";
my $FILE_NAME_FORMAT_DOMAIN =        "^(.{5})(.{2})(.{3})_(.{1})-D(.{1})";


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;

}


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(\S+)\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;
				}
			}
			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;
    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+).*/) {
		$results_model{z_score_m} = $1;
		$results_model{ln_e_m} = $2;
		$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{z_score_m} = 0;
	$results_model{ln_e_m} = 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_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_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+)$/) {
				my $rms = $1;
				my $model_1 = $2;
				my $model_2 = $3;

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


				# 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);
					print "UPDATE!!!\n";
				} else {
					$results_mvsm_id = $results_manager->add_mvsm($result1_id, $result2_id, $rms);
					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);
					print "UPDATE!!!\n";
				} else {
					$results_mvsm_id = $results_manager->add_mvsm($result2_id, $result1_id, $rms);
					print "ADD!!!!!!\n";
				}

			}
			}
		}
		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 casp9.results_mvsm WHERE result1_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 casp9.results_mvsm WHERE result1_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 casp9.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 =~ /^(\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 casp9.results re join casp9.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 casp9.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 casp9.results SET rank_model=%s WHERE (id = %d)", $rank_model, $id);
	    $sth_rank = $self->{_database}->query($query);
	    if(defined($sth_rank)) {
		    $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];

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

	$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})(.*)/;
	$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(\S+)\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 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;
}

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)) {
	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=.*/) {
		$results_model{dali_z_score} = $2;
		$results_model{dali_align_residues} = $3;
		$results_model{dali_rmsd} = $4;
		#print $line . "\n";
	    }
	}
	close(FILE);
    } else {
	print sprintf("ERROR: Can't open file %s/%s/index.html", $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(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		    $rr_model{rmsd_4} = $6;
		    $rr_model{gdt_ts_4} = $7;
		}

		#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);

    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/CASP9/RESULTS/LGA/4A_TR/DATA/%s/%s", substr($target,0,5), $target);
	printf("/local/CASP9/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 =~ /^(\S+)-D(\S+)/) {
		$target = $1;
		$domain = $2;
	}


	if ($domain eq 0 ) {
	#	print "\n error \n";
	#	exit(0);
	}

    $model{TARGET} = substr($target,0,5);
    $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(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+).*/) {
		$model{rmsd_4} = $6;
		$model{gdt_ts_4} = $7;
	    }
	    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);
    }

    return $result;
}

sub upload_qa_predictions {
    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{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 analyse Q1 and part QA2
sub upload_qa_analysis {
    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, model=>1});


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


    #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 $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({ '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
	    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);

    ###exit(0);

    return $result;
}



###GOOD Z-Score
sub upload_qa_analysis_z_score {
    my ($self, $target) = @_;
    my $result = 0;

    my $qa_analysis_manager = new QAAnalysisManager();
    my @qa_analysis = $qa_analysis_manager->get_rows({target=>$target, model=>1}, 1);
    my @pearson_array =();
    my @fisher_zprime_array =();
    print "START: " . scalar(@qa_analysis) . "\n";
    #LOOP for QA
    for(my $a_count = 0; $a_count < scalar(@qa_analysis); $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 1) {
	    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);
# 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 (scalar(@qa_analysis) ne scalar(@pearson_z_score_array)){
	print "!!!ERROR WITH COUNT OF ARRAYS \n PEARSON Z-SCORE - ...";
	exit(0);
    }

    for (my $a_count = 0; $a_count < scalar(@qa_analysis); $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 1) {
	    $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 "PERSON \n";
#    	for (my $count = 0; $count < scalar(@pearson_array); $count++) {
#		print $pearson_array[$count] . "," ;
#    	}
#    	print "\n";
	###exit(0);

    return $result;
}




##analyse Q1 by GROUPS
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 analyse Q1 and part QA2
## swich MODEL 1 or MODEL ALL or nothing

sub upload_qa2_pearson_analysis {
    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 =();

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

###
#    print "=== $qa_values, $lga_values \n";	

# 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_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_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_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_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_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_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;
