#!/usr/bin/perl
use strict;
use warnings;

use Digest::MD5 qw(md5 md5_hex md5_base64);
use MIME::Parser;
use MIME::Entity;
use MIME::Body;
use Getopt::Long;
use Switch;


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

use LocalConfiguration;

use ImagesManager;
use ResultsManager;
use ResultsUploadManager;
use RRResultsUploadManager;
use RRCResultsUploadManager;

use Logger;

my $SCRIPTNAME = 'upload_results.pl';

#my $logger = new Logger();

my $directory = "";
my @FILES_LIST = ();
my $count_files = 0;
my $casp_version = uc($LOCAL_CONFIG->{CASP_VERSION});
my $RESULT_DIR = "/local/$casp_version/RESULTS/";

my $results_manager = new ResultsManager();
my $resultsupload_manager = new ResultsUploadManager();
my $rrresultsupload_manager = new RRResultsUploadManager();
my $rrc_manager = new RRCResultsUploadManager();
my $target_names = "";
my $actions;
my $TARGET = GetOptions(
	"targets=s" => \$target_names,
	"actions=s" => \$actions,
);

sub upload_mvsm_results {
    ############################################################################################ MVSM
    ############## MVSM RESULTS
    $directory = $RESULT_DIR . "/MVSM/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
	        @FILES_LIST = <FILE_list_of_results>;
                close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
    	    $count_files ++;
	    $line =~ /$directory\/(.*)/;
	    my $file_name = $1;
    	    $resultsupload_manager->upload_mvsm($file_name, $directory);
	    print "File #" . $count_files . "\n";
    }
    ############ MVSM Count upload
    my $parameters = {'target' => $TARGET};
    my @results = $results_manager->get_results($parameters);

    for(my $count = 0; $count < scalar(@results); $count++) {

	print $results[$count]->{ID} . "\n";

        $resultsupload_manager->update_mvsm_results($results[$count]->{ID});

    }
}

sub upload_mvsm_serv_results {
    ############################################################################################ MVSM
    ############## MVSM RESULTS
    $directory = $RESULT_DIR . "/MVSM_SERV/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
                @FILES_LIST = <FILE_list_of_results>;
                close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
            $count_files ++;
            $line =~ /$directory\/(.*)/;
            my $file_name = $1;
            $resultsupload_manager->upload_mvsm_serv($file_name, $directory);
            print "File #" . $count_files . "\n";
    }
}


sub upload_ace_results {
    ############################################################################################ ACE
    ############## ACE RESULTS
    $directory = $RESULT_DIR . "/ACE/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
    	$count_files ++;
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_ace($file_name, $directory);
	print "File #" . $count_files . "\n";
    }
}

sub join_ace_and_lga {
    ############################################################################################ JOIN LGA and ACE
    ############# JOIN LGA 4 A results with ACE
    my $lga_results_dir = $RESULT_DIR . "/LGA/SDA/DATA/".$TARGET;
    my $ace_results_dir = $RESULT_DIR . "/ACE/".$TARGET;
    my $lga_ace_results_dir = $RESULT_DIR . "/LGA_ACE/".$TARGET;
    $resultsupload_manager->join_lga_with_ace($lga_results_dir, $ace_results_dir, $lga_ace_results_dir, $TARGET);
    ############ JOIN end
}

sub upload_rank {
    ############################################################################################ UPLOAD RANKS
    #### run this script when all results is uploaded
    $resultsupload_manager->update_rank($TARGET);
}

sub generate_images {
    my $protein_pdb = '/data/CASP13/TARGETS/'.$TARGET.'.pdb';
    my $output_small_str_image_png = '/data/CASP13/PLOTS/STR/'.$TARGET.'.small.png'; #structure image
    my $images_manager = new ImagesManager();

    ############################################################################################ IMMAGES (small) for result targets page
    #### GENERATE STRUCTURE IMAGE
    $images_manager->protein_image($protein_pdb, $output_small_str_image_png, 74, 74);
    #### GENERATE GDT IMAGE
    $resultsupload_manager->generate_gdt_images($TARGET);
    #### GENERATE AL IMAGES
    $resultsupload_manager->generate_al_small_images($TARGET);
}

sub upload_z_scores {
    ############# UPLOAD Z-Score
    # TODO set Z-score for all target to 0
#    $resultsupload_manager->upload_gdt_z_score($TARGET);
    $resultsupload_manager->upload_gdt_z_score_parentselected($TARGET);
    
    # SERVER
#    $resultsupload_manager->upload_gdt_z_score_server_group($TARGET);
    $resultsupload_manager->upload_gdt_z_score_server_group_parentselected($TARGET);
    # ALL GROUPS
    ### BY ALL MODELS
#    $resultsupload_manager->upload_gdt_z_score_by_all_model($TARGET);
    $resultsupload_manager->upload_gdt_z_score_by_all_model_parentselected($TARGET);
    # SERVER
#    $resultsupload_manager->upload_gdt_z_score_server_by_all_model($TARGET);
    $resultsupload_manager->upload_gdt_z_score_server_by_all_model_parentselected($TARGET);

#    $resultsupload_manager->upload_gdt_ha_z_score_server_group($TARGET);
    $resultsupload_manager->upload_gdt_ha_z_score_server_group_parentselected($TARGET);
#    $resultsupload_manager->upload_gdt_ha_z_score_all_group($TARGET);
    $resultsupload_manager->upload_gdt_ha_z_score_all_group_parentselected($TARGET);
    # z_score for gdt_ts_4 for the best model per group (best of 5 submited) ALL GROUPS (SERVER AND HUMAN)
    $resultsupload_manager->upload_gdt_ts_z_score_best_models_for_all_groups($TARGET);
}

sub upload_caca_results {
    ############################################################################################ CACA ERRORS
    ############# UPLOAD CACA - errors
    $resultsupload_manager->upload_caca(sprintf("%s.CAerr",$TARGET), $RESULT_DIR . "/CACA");
}

sub upload_prosa_results {
    ############# UPLOAD PROSA score
    $resultsupload_manager->upload_prosa(sprintf("%s.prosa",$TARGET), $RESULT_DIR . "/PROSA_ALL");
}

sub upload_molprobity_results {
    ############# UPLOAD PROSA score
    $resultsupload_manager->upload_molprobity(sprintf("%s.molprb",$TARGET), $RESULT_DIR . "/MOLPROBITY_ALL");
}


sub upload_BKscores_results {
    ############# UPLOAD BK score
    $resultsupload_manager->upload_BKscores(sprintf("%s.bk.csv",$TARGET), $RESULT_DIR . "/BK");
}

sub upload_RDCscores_results {
    ############# UPLOAD RDC score
    $resultsupload_manager->upload_RDCscores(sprintf("%s.rdc1",$TARGET), $RESULT_DIR . "/RDC");
    $resultsupload_manager->upload_RDCscores(sprintf("%s.rdc2",$TARGET), $RESULT_DIR . "/RDC");
}

sub upload_DPscores_results {
    ############# UPLOAD DP score
    $resultsupload_manager->upload_DPscores(sprintf("%s.dp",$TARGET), $RESULT_DIR . "/DP");
}

# Grishin Contact score used in ZTen
sub upload_contsintra_results {
    ############# UPLOAD PROSA score
    $directory = $RESULT_DIR . "/GrContS/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_contsintra($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}


############################################################################################ LGA
sub upload_lga4_results {
    ##############4A LGA PREDICTIONS
    $directory = $RESULT_DIR . "/LGA/SDA/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
    	$count_files ++;
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_lga($file_name, $directory, 4);
	print "File #" . $count_files . "\n";
    }
}

############################################################################################ LGA TR
# obsolete method: use upload_refinement_results instead;
=head
sub upload_lga4_tr_results {
    ##############4A LGA PREDICTIONS
    $directory = $RESULT_DIR . "/LGA/SDA/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
    	$count_files ++;
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_lga_tr($file_name, $directory, 4);
	#print "File #" . $count_files . "\n";
    }
}
=cut

sub upload_gdt_sc {
    ##############4A LGA PREDICTIONS
    $directory = $RESULT_DIR . "/LGA/SDA/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
    	$count_files ++;
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_gdt_sc($file_name, $directory, 4);
	#print "File #" . $count_files . "\n";
    }
}


sub upload_lga5_results {
    ##############5A LGA PREDICTIONS
    $directory = $RESULT_DIR . "/LGA/SIA/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
        @FILES_LIST = <FILE_list_of_results>;
        close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
    	$count_files ++;
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_lga($file_name, $directory, 5);
	print "File #" . $count_files . "\n";
    }
    ############################################################################################ UPLOAD AL from LGA5
    my $targets_dir = '/local/CASP13/TARGETS/';
    my $lga_rotated_dir = $RESULT_DIR . '/LGA/SIA/ROTATED';
    my $lga_rotated_target_dir = sprintf("%s/%s/", $lga_rotated_dir, $TARGET);
    my @models_rotated = ();
    if(open(MODELS, sprintf("ls -1 %s |", $lga_rotated_target_dir))) {
        while(<MODELS>) {
	    chomp;
            push(@models_rotated, $_);
        }
        close(MODELS);
    }
    my $models_count_rotated = scalar(@models_rotated);
    for(my $i = 0; $i < $models_count_rotated; $i++) {
        $resultsupload_manager->upload_al_alignment_new($targets_dir, sprintf("%s.pdb", $TARGET), $lga_rotated_target_dir, $models_rotated[$i]);
    }

    ############################################################################################ UPLOAD EQ from LGA5
    my $lga_alignment_dir = $RESULT_DIR . '/LGA/SIA/ALIGNMENT';
    #my $target = 'T0387';
    my $lga_alignment_target_dir = sprintf("%s/%s/", $lga_alignment_dir, $TARGET);
    my @models_alignment = ();
    if(open(MODELS, sprintf("ls -1 %s |", $lga_alignment_target_dir))) {
        while(<MODELS>) {
            chomp;
            push(@models_alignment, $_);
        }
        close(MODELS);
    }
    my $models_count_alignment = scalar(@models_alignment);
    for(my $i = 0; $i < $models_count_alignment; $i++) {
        $resultsupload_manager->upload_eqv_alignment($models_alignment[$i], $lga_alignment_target_dir);
    }
}

sub upload_mammoth_results {
    ############################################################################################ MAMMOTH
    ############## MAMMOTH UPLOAD
    $directory = $RESULT_DIR . "/MAMMOTH/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
    	$count_files ++;
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_mammoth($file_name, $directory);
	print "File #" . $count_files . "\n";
    }
}

sub upload_lddt_results {
    ############################################################################################ MAMMOTH
    ############## lDDT UPLOAD
    $directory = $RESULT_DIR . "/lDDT/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_lddt($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_cad_score_results {
    ############## CAD score UPLOAD
    $directory = $RESULT_DIR . "/CADscore/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_cad_score($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_rpf_results {
    ############## RPF score UPLOAD
    $directory = $RESULT_DIR . "/rpf/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.rpf |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_rpf($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_GrishinScores_results{
    ########## SOV score upload
    upload_SOV_results();
    ########## QCS upload
    upload_QCS_results();
    ########## CE upload
    upload_CE_results();
}

sub upload_SOV_results{
    $directory = $RESULT_DIR . "/SOV/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.sov |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_sov($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_TMScore_results{
    $directory = $RESULT_DIR . "/TMscore/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.tm |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_tm_score($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_TMalign_results{
    $directory = $RESULT_DIR . "/TMalign/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.tm |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_tm_align($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_QCS_results{
    $directory = $RESULT_DIR . "/QCS/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.qcs |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_qcs($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}


sub upload_CE_results{
    $directory = $RESULT_DIR . "/CE/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.ce |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_ce($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}


sub upload_FlexE_results{
    $directory = $RESULT_DIR . "/FlexE/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.flexe |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_flexe($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_rf_results{
    $directory = $RESULT_DIR . "/RF/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.rf |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_rf($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_qse_results{
    $directory = $RESULT_DIR . "/LGA/SDA/DATA/$TARGET";
    my $model_dir = "/local/$casp_version/MODELS/$TARGET/";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.lga |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)\.lga/;
        my $file_name = $1;
        $resultsupload_manager->upload_qse($file_name, $directory, $model_dir);
        print "File #" . $count_files . "\n";
    }
}



sub upload_sg_lvr_results {
    ############## CAD score UPLOAD
    $directory = $RESULT_DIR . "/LVR/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/*.csv |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_sg_lvr($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_sg_py_results {
    ############## SGpy score UPLOAD
    $directory = $RESULT_DIR . "/SGpy/$TARGET";
    @FILES_LIST = ();
    opendir D , $directory;
    while(defined(my $f = readdir(D))){
	if ($f =~ m/\.csv$/){
	  push @FILES_LIST, $f;
	}
    }
    close D;
    $count_files = 0;
    foreach my $file_name (sort @FILES_LIST) {
        $count_files ++;
        $resultsupload_manager->upload_sg_py($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_rms_ca_results {
    $directory = $RESULT_DIR . "/LGA/SDA/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
        @FILES_LIST = <FILE_list_of_results>;
        close (FILE_list_of_results);
    }
    my $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_lga_rms_ca($file_name, $directory, 4);
    }
}

sub upload_refinement_lga_sda_results() {
    ################################################################### RESULTS FOR REFINEMEN TARGETS
    # upload results for model released to be refined v.s. target
    $directory = $RESULT_DIR . "/LGA/TR_SDA/DATA/$TARGET";
	$resultsupload_manager->upload_refinement_targets_results("$TARGET.pdb.txt.lga", $directory);

    # upload results of predictions
    $directory = $RESULT_DIR . "/LGA/SDA/DATA/$TARGET";
    @FILES_LIST = ();
    if(open(FILE_list_of_results, "/bin/ls -1 " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
    }
    my $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_refinement_results($file_name, $directory, 4);
        #print "File #" . $count_files . "\n";
    }

}

sub upload_refinement_mammoth_results() {
     $directory = $RESULT_DIR . "/MAMMOTH/TR/$TARGET";
        $resultsupload_manager->upload_refinement_targets_mammoth_results("$TARGET.pdb.txt.mammoth", $directory);
}

sub upload_refinement_dali_results() {
     $directory = $RESULT_DIR . "/DaliLite/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_dali_results("$TARGET.pdb.txt", $directory);
}

sub upload_refinement_lddt_results() {
     $directory = $RESULT_DIR . "/lDDT/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_lddt_results("$TARGET.pdb.txt.lddt", $directory);
     # upload results for predictions
     $directory = $RESULT_DIR . "/lDDT/$TARGET";
     @FILES_LIST = ();
     if (opendir(D, $directory)){ 
	while(defined(my $f = readdir(D))){
	   if ($f =~ m/^R/){
		push @FILES_LIST, $f;
	   }
	}
	closedir(D);
	@FILES_LIST = sort @FILES_LIST;
	foreach my $f (@FILES_LIST){
	   $resultsupload_manager->upload_refinement_lddt_results($f, $directory);
	}
     }
}

sub upload_refinement_cad_score_results() {
     $directory = $RESULT_DIR . "/CADscore/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_cad_score_results("$TARGET.pdb.txt.cad", $directory);
}

sub upload_refinement_sg_lvr_results() {
     $directory = $RESULT_DIR . "/LVR/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_sg_lvr_results("$TARGET.pdb.txt.csv", $directory);
     # upload results for predictions
     $directory = $RESULT_DIR . "/LVR/$TARGET";
     @FILES_LIST = ();
     if (opendir(D, $directory)){
        while(defined(my $f = readdir(D))){
           if ($f =~ m/^R/){
                push @FILES_LIST, $f;
           }
        }
        closedir(D);
        @FILES_LIST = sort @FILES_LIST;
        foreach my $f (@FILES_LIST){
           $resultsupload_manager->upload_refinement_sg_lvr_results($f, $directory);
        }
     }

}

sub upload_refinement_sg_py_results() {
     $directory = $RESULT_DIR . "/SGpy/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_sg_py_results("$TARGET.pdb.txt.csv", $directory);
     # upload results for predictions
     $directory = $RESULT_DIR . "/SGpy/$TARGET";
     @FILES_LIST = ();
     if (opendir(D, $directory)){
        while(defined(my $f = readdir(D))){
           if ($f =~ m/^R/){
                push @FILES_LIST, $f;
           }
        }
        closedir(D);
        @FILES_LIST = sort @FILES_LIST;
        foreach my $f (@FILES_LIST){
           $resultsupload_manager->upload_refinement_sg_py_results($f, $directory);
        }
     }

}


sub upload_refinement_molprobity_results() {
     $directory = $RESULT_DIR . "/MOLPROBITY_ALL/TR/";
         $resultsupload_manager->upload_refinement_targets_molprobity_results("$TARGET.molprb", $directory);
}


sub upload_refinement_targets_rpf_results(){
    $directory = $RESULT_DIR . "/rpf/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_rpf_results("$TARGET.pdb.txt.rpf", $directory);
}

sub upload_refinement_targets_qcs_results(){
    $directory = $RESULT_DIR . "/QCS/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_qcs_results("$TARGET.pdb.txt.qcs", $directory);
}


sub upload_refinement_targets_sov_results(){
    $directory = $RESULT_DIR . "/SOV/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_sov_results("$TARGET.pdb.txt.sov", $directory);
}

sub upload_refinement_targets_ce_results(){
	$directory = $RESULT_DIR . "/CE/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_ce_results("$TARGET.pdb.txt.ce", $directory);
}

sub upload_refinement_targets_tm_score_results(){
        $directory = $RESULT_DIR . "/TMscore/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_tm_score_results("$TARGET.pdb.txt.tm", $directory);
}

sub upload_refinement_targets_tm_align_results(){
        $directory = $RESULT_DIR . "/TMalign/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_tm_align_results("$TARGET.pdb.txt.tm", $directory);
}

sub upload_refinement_targets_flexe_results(){
	$directory = $RESULT_DIR . "/FlexE/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_flexe_results("$TARGET.pdb.txt.flexe", $directory);
}

sub upload_refinement_targets_codm_results(){
        $directory = $RESULT_DIR . "/BK/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_codm_results("$TARGET.pdb.txt.codm", $directory);
}

sub upload_refinement_targets_dfm_results(){
        $directory = $RESULT_DIR . "/BK/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_dfm_results("$TARGET.pdb.txt.dfm", $directory);
}

sub upload_refinement_targets_handed_results(){
        $directory = $RESULT_DIR . "/BK/TR/$TARGET";
         $resultsupload_manager->upload_refinement_targets_handed_results("$TARGET.pdb.txt.hand", $directory);
}

sub upload_dali_results() {
############## DALI
$directory = "$RESULT_DIR/DaliLite/$TARGET";
@FILES_LIST = ();

print "/bin/ls " . $directory. " | \n\n";



if(open(FILE_list_of_results, "/bin/ls " . $directory. " |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
}
$count_files = 0;


foreach my $line (@FILES_LIST) {



    	$count_files ++;
	$line =~ /$directory\/(.*)/;
	#my $result_name = $1;
	$line =~ s/\n//;
	my $result_name = $line;
	#print "-" . $result_name . "-\n";
	#print $line . "   in array  \n";
	$resultsupload_manager->upload_dali($result_name, $directory, 4);
	print "File #" . $count_files . "\n";
}

}


sub upload_rr_conts_results() {
$directory = "$RESULT_DIR/RR_CONTS/$TARGET";
@FILES_LIST = ();

if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
    @FILES_LIST = <FILE_list_of_results>;
    close (FILE_list_of_results);
}
foreach my $file(@FILES_LIST){
	$rrresultsupload_manager->upload($file, '');
}

# insert z-scores after all predictions for target have been downloaded
my $targ_name;
my $dom_index;
if($TARGET =~ m/^(T[0-9]{4,4}(s[1-9]){0,1})/){
   $targ_name = $1;
   $dom_index = 0;
}
if($TARGET =~ m/^(T[0-9]{4,4}(s[1-9]){0,1})[-_]D([1-9]+)/){
   $targ_name = $1;
   $dom_index = $3;
}
if(!defined($targ_name) || !defined($dom_index)){
}else{
    $rrresultsupload_manager->upload_zscore_for_target_domain($targ_name,$dom_index);
}


}

# upload new residue-residue contacts results (Andriy's implementation)
sub upload_rrc_results() {
    $directory = "$RESULT_DIR/RRC_CONTS/$TARGET";
    my @files_scores;
    my @files_rrces;
    my @files_lengths;
    my @files_prs;
    my @files_auc;
    my @files_rrces_ext;
    if (opendir D, $directory){
	while(defined(my $f = readdir(D))){
	   if ($f =~ m/scores$/){
		push @files_scores, $f;
	   } elsif ($f =~ m/rrces$/){
		push @files_rrces, $f;
	   } elsif ($f =~ m/listlength$/){
		push @files_lengths, $f;
	   } elsif ($f =~ m/spr$/){
                push @files_prs, $f;
           } elsif ($f =~ m/auc$/){
                push @files_auc, $f;
           } elsif ($f =~ m/rrces_ext$/){
                push @files_rrces_ext, $f;
           }
	}
	closedir(D);
	@files_scores = sort @files_scores;
	@files_rrces = sort @files_rrces;
	@files_lengths = sort @files_lengths;
	@files_prs = sort @files_prs;
    }
    foreach my $f (@files_scores) {
#	$rrc_manager->upload_results($f, $directory);
    }
    foreach my $f (@files_rrces){
#        $rrc_manager->upload_results_rrces($f, $directory);
    }
    foreach my $f (@files_lengths){
	$rrc_manager->uploadModelListLength($f, $directory);
    }
    foreach my $f (@files_prs){
#        $rrc_manager->upload_AUC_PR_coords($f, $directory);
    }
    foreach my $f (@files_auc){
#        $rrc_manager->upload_AUC_PR_java($f, $directory);
    }
    foreach my $f (@files_rrces_ext){
#        $rrc_manager->upload_results_rrces_ext($f, $directory);
    }

}

# obsolete since CASP13
sub calcGrishinZscores {
#    system("/local/Projects/Perl/casp13/src/scripts/evaluation_scripts/Grishin_scores.pl  --target $TARGET");    
    # gen table for Lisa 
#    sleep(30);
#    system("/local/Projects/Perl/casp13/src/scripts/createLisaTables.pl $TARGET");
}

sub run {
	my ($target_name) = @_;
	$TARGET = $target_name;

	printf "\n\n===== target: %8s =========\n", $TARGET;

	for my $action (split(',', $actions)) {
		printf "\n\n===== target: %8s action: %s =========\n", $TARGET, $action;
		if ((substr($TARGET, 0, 1) eq 'R' || substr($TARGET, 0, 1) eq 'R') ){
			switch ($action) {
			# upload results to database like it was in CASP9
			  case 'lga_sda' {upload_refinement_lga_sda_results();}
			  case 'mammoth' {upload_refinement_mammoth_results();}
			  case 'dali' {upload_refinement_dali_results();}
			  case 'lddt' {upload_refinement_lddt_results();}
			  case 'cad_score' {upload_refinement_cad_score_results();}
			  case 'sg_lvr' {upload_refinement_sg_lvr_results();}
			  case 'sg_py' {upload_refinement_sg_py_results();}
			  case 'molprobity' {upload_refinement_molprobity_results();}
			  case 'rpf' {upload_refinement_targets_rpf_results();}
			  case 'qcs' {upload_refinement_targets_qcs_results();}
			  case 'sov' {upload_refinement_targets_sov_results();}
			  case 'ce' {upload_refinement_targets_ce_results();}
			  case 'TMscore' {upload_refinement_targets_tm_score_results();}
			  case 'TMalign' {upload_refinement_targets_tm_align_results();}
			  case 'flexe' {upload_refinement_targets_flexe_results();}
			  case 'codm' {upload_refinement_targets_codm_results();}
			  case 'dfm' {upload_refinement_targets_dfm_results();}
			  case 'handed' {upload_refinement_targets_handed_results();}
			  case 'bk_scores' {
					upload_refinement_targets_codm_results();
					upload_refinement_targets_dfm_results();
					upload_refinement_targets_handed_results();
				}
			  case 'grishin' {
					upload_refinement_targets_qcs_results();
					upload_refinement_targets_sov_results();
					upload_refinement_targets_ce_results();
				}
			}
		}
		switch ($action) {
#BM		case 'rms_ca' { upload_rms_ca_results() } # this option is implemented in 'lga_sda' case
		case 'lga_sda' { upload_lga4_results(); } # upload_rms_ca_results(); upload_gdt_sc(); }
		case 'lga_sia' { upload_lga5_results(); }
#BM		case 'ace' { upload_ace_results(); }
#BM		case 'join_ace_and_lga' { join_ace_and_lga(); }
		case 'caca' { upload_caca_results(); }
		case 'mvsm' { upload_mvsm_results(); }
		case 'rank' { upload_rank(); }
		case 'mammoth' { upload_mammoth_results(); }
		case 'images' { generate_images(); }
		case 'z_scores' { upload_z_scores(); }
		case 'dali' { upload_dali_results(); }
#BM		case 'lga_4a_tr' { upload_gdt_sc();} # this option  is implemented in 'lga_sda' case
		case 'targets' { $resultsupload_manager->upload_results_targets($TARGET); }
		case 'rr_conts' {upload_rr_conts_results();}
		case 'rrc'  {upload_rrc_results();}
		case 'mvsm_serv' {upload_mvsm_serv_results();}
		case 'prosa' { upload_prosa_results(); }
		case 'molprobity' {upload_molprobity_results();}
		case 'lddt' {upload_lddt_results();}
		case 'cad_score' {upload_cad_score_results();}
		case 'sg_lvr' {upload_sg_lvr_results();}
		case 'sg_py' {upload_sg_py_results();}
		case 'rpf' {upload_rpf_results();}
		case 'grishin' {
			upload_GrishinScores_results(); 
			#calcGrishinZscores();
		}
		case 'bk_scores' {upload_BKscores_results();}
		case 'rdc' {upload_RDCscores_results();}
		case 'dp' {upload_DPscores_results();}
		case 'TMscore' {upload_TMScore_results();}
		case 'TMalign' {upload_TMalign_results();}
		case 'contsintra' {upload_contsintra_results();}
		case 'flexe' {upload_FlexE_results();}
		case 'rf' {upload_rf_results();}
		case 'qse' {upload_qse_results();}
		case 'sov' {upload_SOV_results();}
		case 'ce' {upload_CE_results();}
		}
	}

}

for my $target (split(',', $target_names)) {
	run($target);
}

exit(0);
1;
