package ResultsManager;

use strict;
use warnings;

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

use lib qw(Core);

use Database;

use PDBUtils;

use Configuration;
use LocalConfiguration;
use TargetsManager;

my $results_manager = undef;

sub new {
    my ($class) = @_;
    return $results_manager if(defined($results_manager));
    my %model = (ID => '');

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

    $results_manager = bless $self, $class;
    return $results_manager;
}

sub get_new_model {
    my ($self) = @_;
    my %model = (
########################### system
	id => '',
	predictions_id =>'',
        #DOMAIN_ID => '',
        date => '',
########################## file name
        TARGET => '',
        PFRMAT => '',
        CODE => '',
        MODEL => '',
        parent =>'',
        domain =>'',
########################### results

####################### LGA 4
################# SUMMARY
	n1_4 => '',
	n2_4 => '',
	dist_4=> '',
	nres_4 => '',
	rmsd_4 => '',
	gdt_ts_4 => '',
	lga_s_4 => '',
	lga_q_4 => '',
	gdt_ca_percentage_4 => '',
	asgn_4 => '',
	np_p_4 => '',
	gdt_ha_4 => '',
	alignment_4 => '',
####################### LGA 5
################# SUMMARY
	n1_5 => '',
	n2_5 => '',
	dist_5 => '',
	nres_5 => '',
	rmsd_5 => '',
	gdt_ts_5 => '',
	lga_s_5 => '',
	lga_q_5 => '',
####################### ACE
	ace_rms_ca => '',
	ace_rms_all => '',
#########################
	eqv_alignment => '',
	al0 => '',
	al4 => '',
	al4x => '',
	al0p => '',
	al4p => '',
	al4xp => '',
	eqv0 => '',
	eqv4 => '',
	eqvi => '',
	INDEX => 0,
########################### ERRORS CACA
	errors_caca => '',
	mean => '',
	standard_dev => '',
########################### MAMMOTH
	z_score_m => '',
	ln_e_m => '',
########################### DESCRIPTORS
	'n_aa_0' => '',
	'n_aa_4' => '',
	'n_aa_i' => '',
	'superposition_0' => '',
	'superposition_4' => '',
	'superposition_i' => '',
	'dal_0' => '',
	'dal_4' => '',
	'dal_i' => '',
########################### DALI
	'dali_z_score' => '',
	'dali_align_residues' => '',
	'dali_rmsd' => '',
########################### OTHER
	'gdt_4_z_score' => '',
	'al0p_5_z_score' => '',

	'gdt_4_z_score_server' => '',
	'al0p_5_z_score_server' => '',

	'gdt_4_z_score_all' => '',
	'al0p_5_z_score_all' => '',

	'gdt_4_z_score_server_all' => '',
	'al0p_5_z_score_server_all' => '',

	'gdt_ha_4_z_score_server' => '',

	lga_4_tr =>'',

    );
############ LGA SUMMARY RESULTS EXAMPLE
## #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
#                 [3]                [6]    [7]      [8]         [9]      [10]
#                  n1_x               nres_x rmsd_x   seq_id    lga_s_x   lga_q_x

    return %model;
}

sub is_results_table_column {
my ($self, $colunm_name) = @_;
my $result = 0;
if(	$colunm_name eq 'id' ||
	$colunm_name eq 'predictions_id' ||
	#$colunm_name eq 'domains_id' ||
	$colunm_name eq 'date' ||
	########################## file name
	#$colunm_name eq 'target' ||
	$colunm_name eq 'parent' ||
	$colunm_name eq 'domain' ||
	########################### results
	####################### LGA 4
	################# SUMMARY
	$colunm_name eq 'n1_4' ||
	$colunm_name eq 'n2_4' ||
	$colunm_name eq 'dist_4' ||
	$colunm_name eq 'nres_4' ||
	$colunm_name eq 'rmsd_4' ||
	$colunm_name eq 'gdt_ts_4' ||
	$colunm_name eq 'lga_s_4' ||
	$colunm_name eq 'lga_q_4' ||
	$colunm_name eq 'gdt_ca_percentage_4' ||
	$colunm_name eq 'alignment_4' ||
	####################### LGA 5
	################# SUMMARY
	$colunm_name eq 'n1_5' ||
	$colunm_name eq 'n2_5' ||
	$colunm_name eq 'dist_5' ||
	$colunm_name eq 'nres_5' ||
	$colunm_name eq 'rmsd_5' ||
	$colunm_name eq 'gdt_ts_5' ||
	$colunm_name eq 'lga_s_5' ||
	$colunm_name eq 'lga_q_5' ||
	$colunm_name eq 'asgn_4' ||
	$colunm_name eq 'np_p_4' ||
	$colunm_name eq 'gdt_ha_4' ||
	########################### ACE
	$colunm_name eq 'ace_rms_ca' ||
	$colunm_name eq 'ace_rms_all' ||
	$colunm_name eq 'eqv_alignment' ||
	$colunm_name eq 'al0' ||
	$colunm_name eq 'al4' ||
	$colunm_name eq 'al4x' ||
	$colunm_name eq 'al0p' ||
	$colunm_name eq 'al4p' ||
	$colunm_name eq 'al4xp' ||
	$colunm_name eq 'eqv0' ||
	$colunm_name eq 'eqv4' ||
	$colunm_name eq 'eqvi' ||
	########################### Errors CACA
	$colunm_name eq 'errors_caca' ||
	$colunm_name eq 'mean' ||
	$colunm_name eq 'standard_dev' ||
	########################### MAMMOTH
	$colunm_name eq 'z_score_m' ||
	$colunm_name eq 'ln_e_m'    ||
	########################### DESCRIPTORS
	$colunm_name eq 'n_aa_0' ||
	$colunm_name eq 'n_aa_4' ||
	$colunm_name eq 'n_aa_i' ||
	$colunm_name eq 'superposition_0' ||
	$colunm_name eq 'superposition_4' ||
	$colunm_name eq 'superposition_i' ||
	$colunm_name eq 'dal_0' ||
	$colunm_name eq 'dal_4' ||
	$colunm_name eq 'dal_i' ||
########################### DALI
	$colunm_name eq 'dali_z_score' ||
	$colunm_name eq 'dali_align_residues' ||
	$colunm_name eq 'dali_rmsd' ||
########################### OTHER
	$colunm_name eq 'gdt_4_z_score' ||
	$colunm_name eq 'al0p_5_z_score' ||
	$colunm_name eq 'gdt_4_z_score_server' ||
	$colunm_name eq 'al0p_5_z_score_server' ||

	$colunm_name eq 'gdt_4_z_score_all' ||
	$colunm_name eq 'al0p_5_z_score_all' ||
	$colunm_name eq 'gdt_4_z_score_server_all' ||
	$colunm_name eq 'al0p_5_z_score_server_all' ||
	$colunm_name eq 'gdt_ha_4_z_score_server' ||
	$colunm_name eq 'lga_4_tr'

  ) {
	$result = 1;
	}
return $result;
}

sub exist {
    my ($self, $id) = @_;
    my $result = 0;

    my $query = sprintf("SELECT COUNT(id) FROM casp9.results WHERE (id = %d)", $id);
    my $sth = $self->{_database}->query($query);

    if(defined($sth) && ($sth->rows() > 0)) {
        my ($count) = $sth->fetchrow_array();
        $result = ($count == 1) ? 1 : 0;
    }
    return $result;
}

sub exist_by_parameters {
    my ($self, %model) = @_;
    my $result = 0;
    my $query = sprintf("SELECT re.id FROM casp9.results re JOIN casp9.predictions pr ON  (re.predictions_id = pr.id)
	JOIN casp9.groups gr ON (pr.groups_id = gr.id)
	WHERE pr.target=\'%s\' and pr.pfrmat=\'%s\' and  pr.model=%d and gr.code=%d and re.parent=%d and re.domain=%d",
      	$model{TARGET}, $model{PFRMAT}, $model{MODEL}, $model{CODE}, ($model{parent} eq '')?0:$model{parent}, ($model{domain} eq '')?0:$model{domain});
    my $sth = $self->{_database}->query($query);
    #print $query ."\n";

    if(defined($sth) && ($sth->rows() > 0)) {
        my ($id) = $sth->fetchrow_array();
	$result = $id;
    }

    return $result;
}

sub exist_mvsm {
    my ($self, $id_1, $id_2) = @_;
    my $result = 0;
    my $query = sprintf("SELECT id FROM casp9.results_mvsm WHERE (result1_id=\'%s\' and result2_id=\'%s\')",$id_1, $id_2);
    my $sth = $self->{_database}->query($query);
    #print $query ."\n";

    if(defined($sth) && ($sth->rows() > 0)) {
        my ($id) = $sth->fetchrow_array();
	$result = $id;
    }

    return $result;
}

sub is_uploading {
    my ($self, $target_name) = @_;
    my $result = 0;
    my $query = sprintf("SELECT gr.id FROM casp9.results re JOIN casp9.predictions pr ON  (re.predictions_id = pr.id)
	JOIN casp9.targets gr ON (pr.target_name = gr.name) WHERE pr.target=\'%s\' ",
      	$target_name);
    my $sth = $self->{_database}->query($query);
    #print $query ."\n";

    if(defined($sth) && ($sth->rows() > 0)) {
        my ($id) = $sth->fetchrow_array();
	$result = $id;
    }

    return $result;
}

sub get_predictions_id {
    my ($self, %model) = @_;
    my $result = '';
    my $query = sprintf("SELECT pr.id FROM casp9.predictions pr JOIN casp9.groups gr ON (pr.groups_id = gr.id)
	WHERE pr.target=\'%s\' and pr.pfrmat=\'%s\' and  pr.model=%d and gr.code=%d",
      	$model{TARGET}, $model{PFRMAT}, $model{MODEL}, $model{CODE});
    my $sth = $self->{_database}->query($query);

    if(defined($sth) && ($sth->rows() > 0)) {
        my ($id) = $sth->fetchrow_array();
        $result = $id;
    }
    return $result;
}

sub update_results {
    my ($self, %model) = @_;

    my $result = 0;
    my $set_query = '';

    while ( my ($key, $value) = each(%model) ) {
	if($key eq 'id' || $value eq '' || !defined($value)) {
		#print "NE---$key---------->$value<----------\n";
	}else{
		#list of columns which not updated
		if($self->is_results_table_column($key) == 1) {
			$set_query .= sprintf(" %s = \'%s\', ", $key, $value);
		}
	}
    }

    return $result if(! $self->exist( $model{id}));
    my $query = sprintf("UPDATE casp9.results SET %s id=id WHERE (id = %d)", $set_query,  $model{id});
	print "------------------------UPDATE: $model{id} \n";
	print $query . "\n";

    my $sth = $self->{_database}->query($query);

    if(defined($sth)) {
        $result = 1;
    }

    return $result;
}

sub add {
    my ($self, %model) = @_;
    my $result = 0;

    my $column_names = '';
    my $column_values = '';
    my $values_count = 0;

    while ( my ($key, $value) = each(%model) ) {
	if($key eq 'id' || $key eq 'date' || $value eq '' || !defined($value)) {
		#print "NE---$key---------->$value<----------\n";
	}else{
		if($self->is_results_table_column($key)==1) {
			$column_names .= sprintf(" %s%s ",($values_count == 0)?'':',', $key);
			$column_values .= sprintf(" %s\'%s\' ",($values_count == 0)?'':',', $value);;
			$values_count++;
		}
	}
    }

    my $query = sprintf("INSERT INTO casp9.results ( %s ) VALUES ( %s )", $column_names, $column_values);

	my $tmp = $query;

    my $sth = $self->{_database}->query($query);
    if(defined($sth)) {
        my $query = sprintf("SELECT MAX(id) FROM casp9.results");
        my $sth = $self->{_database}->query($query);
        # add logger
        ($result) = $sth->fetchrow_array();
    }
	print "---------------------ADD: $result";
	if ($result == 0) {
	print "\n" . $tmp . "\n";
	}

    return $result;
}

sub delete {
    my ($self, $id) = @_;
    my $result = 0;
    return $result if(! $self->exist($id));
    my $query = sprintf("DELETE FROM casp9.results WHERE (id = %d)", $id);
    my $sth = $self->{_database}->query($query);
    if(defined($sth)) {
        $result = defined($sth) ? 1 : 0;
    }
    return $result;
}

sub get_results {
    my ($self, $params) = @_;
    my $field = $params->{field};
    my $order = $params->{order};
    #my $view_targets = $params->{view_targets};
    #my $view = $params->{view};
    #print "Content-Type: text/html; charset=ISO-8859-1\n\n";
    #foreach my $parameter (keys %{$params}) {
    #	print $parameter . " => " . $params->{$parameter}. "<br>";
    #}
    $field = (!defined($field) || ($field eq '')) ? 're.gdt_ts_4' : $field;
    $order = (!defined($order) || ($order eq '')) ? 'DESC' : $order;

    #### DO MULTIPLE SORTING
    my $count_to_replace = 0;
	while ($field =~ s/\;/ $order,/ || $count_to_replace >20){
	$count_to_replace ++;
    }
    ####
    my $domain = 0;
    my $sub_query = "";
    if(defined($params->{target}) && ($params->{target} ne '')) {

	if ($params->{target} =~ /^(\S+)-D(\S+)/) {
	    $sub_query .= sprintf(" and pr.target=\'%s\' ", $1);
	    $domain = $2;
	} else {
	    $sub_query .= sprintf(" and pr.target=\'%s\' ", $params->{target});
	    #$sub_query .= sprintf(" and re.domain=\'%s\' ", $domain);
	}

	## domain defenition
	if(defined($params->{domain}) && ($params->{domain} ne '') ) {
	    $sub_query .= sprintf(" and re.domain=\'%s\' ", $params->{domain});
	} else{
	    $sub_query .= sprintf(" and re.domain=\'%s\' ", $domain);
	}
    }



    if(defined($params->{groups_id}) && ($params->{groups_id} ne '')) {
	$sub_query .= sprintf(" and pr.groups_id=\'%s\' ", $params->{groups_id});
    }

    my $multi_sort = "";
    if(defined($params->{multi_sort}) && ($params->{multi_sort} ne '')) {
	$multi_sort = $params->{multi_sort};
	#### DO MULTIPLE SORTING
	my $count_to_replace = 0;
	    while ($multi_sort =~ s/\;/ $order,/ || $count_to_replace >20){
	    $count_to_replace ++;
	}
	$field = "";
	$order = "";
    }

    if(defined($params->{groups_type}) && ($params->{groups_type} ne '')) {
	if($params->{groups_type} eq 'server') {
	    $sub_query .= sprintf(" and gr.type>0 ");
	} elsif ($params->{groups_type} eq 'human') {
	    $sub_query .= sprintf(" and gr.type=0 ");
	}
    }


    if(defined($params->{targets_list}) && ($params->{targets_list} ne '')) {


	my @targets = split(/,/, $params->{targets_list});
	$sub_query .= sprintf(" and (");

	for(my $i = 0; $i < scalar(@targets); $i++) {
	    my @target = split(/-/, $targets[$i]);

	    if ($i>0) {$sub_query .= " or ";}
	    $sub_query .= sprintf(" (tr.id=%s and re.domain=%s) ", $target[0], $target[1]);
	}

	$sub_query .= sprintf(") ");


    }

    if(defined($params->{groups_list}) && ($params->{groups_list} ne '')) {
	$sub_query .= sprintf(" and gr.id IN (%s) ", $params->{groups_list});
    }


    if(defined($params->{where}) && ($params->{where} ne '')) {
	$sub_query .= sprintf(" %s ", $params->{where});
    }

    if(defined($params->{results_id}) && ($params->{results_id} ne '')) {
	$sub_query .= sprintf(" and re.id=%s ", $params->{results_id});
    }



    if(defined($params->{model}) && ($params->{model} ne '') && ($params->{model} ne 'all')) {
	$sub_query .= sprintf(" and pr.model=\'%s\' ", $params->{model});
    }

    my @results = ();

    my $query = sprintf("SELECT (pr.target || pr.pfrmat || to_char(gr.code,'FM000') || '_' || pr.model) as model_name, gr.id, pr.target, pr.pfrmat, gr.code, gr.name, pr.model, re.id, re.predictions_id, re.parent, re.domain, re.date, re.n1_5, re.n2_5, re.gdt_ts_4, re.rmsd_5, re.pc01, re.pc05, re.lga_s_5, re.ace_rms_ca, re.ace_rms_all, eqv0, eqv4, eqvi, eqv_alignment, al0, al4, al4x, al0p, al4p, al4xp, re.asgn_4, re.np_p_4, re.n1_4, re.n2_4, tr.id, re.rank_all, re.rank_model, re.gdt_ha_4, re.z_score_m, re.ln_e_m, re.errors_caca, re.mean, re.standard_dev,
	re.n_aa_0, re.n_aa_4, re.n_aa_i, re.superposition_0, re.superposition_4, re.superposition_i, re.dal_0, re.dal_4, re.dal_i,
	re.dali_z_score, re.dali_align_residues, re.dali_rmsd, re.gdt_4_z_score, re.al0p_5_z_score, re.gdt_4_z_score_server, re.al0p_5_z_score_server,
	gr.type, re.gdt_4_z_score_all, re.al0p_5_z_score_all, re.gdt_4_z_score_server_all, re.al0p_5_z_score_server_all, re.gdt_ha_4_z_score_server, re.lga_4_tr
	FROM casp9.results re
	JOIN casp9.predictions pr ON  (re.predictions_id = pr.id) JOIN casp9.targets tr ON  (pr.target = tr.name)
	JOIN casp9.groups gr ON (pr.groups_id = gr.id)

    WHERE 1=1 %s and n1_4>19  ORDER BY %s %s %s LIMIT 1200", $sub_query, $field, $order, $multi_sort);
    #WHERE 1=1 and n1_4>19 %s ORDER BY %s %s %s LIMIT 27000", $sub_query, $field, $order, $multi_sort);

    my $sth = $self->{_database}->query($query);
	#print "<br>sort: " . $multi_sort . "<br>";
    #print $query. "\n";
    #exit(0);


    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($model_name, $group_id, $target, $pfrmat, $code, $group_name, $model, $id, $predictions_id, $parent, $domain, $date, $n1_5, $n2_5, $gdt_ts_4, $rmsd_5, $pc01, $pc05, $lga_s_5, $ace_rms_ca, $ace_rms_all, $eqv0, $eqv4, $eqvi, $eqv_alignment, $al0, $al4, $al4x, $al0p, $al4p, $al4xp, $asgn_4, $np_p_4, $n1_4, $n2_4, $target_id, $rank_all, $rank_model, $gdt_ha_4, $z_score_m, $ln_e_m, $errors_caca, $mean, $standard_dev, $n_aa_0, $n_aa_4, $n_aa_i, $superposition_0, $superposition_4,
		 $superposition_i, $dal_0, $dal_4, $dal_i, $dali_z_score, $dali_align_residues, $dali_rmsd, $gdt_4_z_score, $al0p_5_z_score, $gdt_4_z_score_server, $al0p_5_z_score_server, $group_type,
		 $gdt_4_z_score_all, $al0p_5_z_score_all, $gdt_4_z_score_server_all, $al0p_5_z_score_server_all, $gdt_ha_4_z_score_server,$lga_4_tr) = $sth->fetchrow_array()) {
			push(@results, {
				INDEX => $index,
				MODEL_NAME => $model_name,
				GROUP_ID => $group_id,
				TARGET => $target,
				PFRMAT => $pfrmat,
				CODE => sprintf("%03d",$code),
				GROUP_NAME => $group_name,
				MODEL => $model,
				ID => $id,
				PREDICTIONS_ID => $predictions_id,
				PARENT => $parent,
				DOMAIN => $domain,
				DATE => substr($date, 0, 10),
				N1_5 => $n1_5,
				N2_5 => $n2_5,
				GDT_TS_4 => sprintf("%.2f", $gdt_ts_4),
				RMSD_5 => sprintf("%.2f", $rmsd_5),
				PC01 => $pc01,
				PC05 => $pc05,
				LGA_S_5 => $lga_s_5,
				ACE_RMS_CA => $ace_rms_ca,
				ACE_RMS_ALL => $ace_rms_all,
				AL0 => $al0,
				AL4 => $al4,
				AL4X => $al4x,
				AL0P => sprintf("%.2f", $al0p),
				AL4P => sprintf("%.2f", $al4p),
				AL4XP => sprintf("%.2f", $al4xp),
				EQV0 => $eqv0,
				EQV4 => $eqv4,
				EQVi => $eqvi,
				EQV0P => sprintf("%.2f", ($n2_5 == 0) ? 0 : ($eqv0 / $n2_5) * 100),
				EQV4P => sprintf("%.2f", ($n2_5 == 0) ? 0 : ($eqv4 / $n2_5) * 100),
				EQViP => sprintf("%.2f", ($n2_5 == 0) ? 0 : ($eqvi / $n2_5) * 100),
				EQV_ALIGNMENT => $eqv_alignment,
				ASGN_4 => $asgn_4,
				NP_P_4 => sprintf("%.2f", $np_p_4),
				N1_4 => $n1_4,
				N2_4 => $n2_4,
				TARGET_ID => $target_id,
				RANK_ALL => $rank_all,
				RANK_MODEL => $rank_model,
				GDT_HA_4 => sprintf("%.2f", $gdt_ha_4),
				Z_SCORE_M => sprintf("%.2f", $z_score_m),
				LN_E_M => sprintf("%.2f", $ln_e_m),
				ERRORS_CACA => $errors_caca,
				MEAN => $mean,
				STANDARD_DEV => $standard_dev,
				N_AA_0 => $n_aa_0,
				N_AA_4 => $n_aa_4,
				N_AA_I => $n_aa_i,
				SUPERPOSITION_0 => $superposition_0,
				SUPERPOSITION_4 => $superposition_4,
				SUPERPOSITION_I => $superposition_i,
				DAL_0 => sprintf("%.2f",$dal_0),
				DAL_4 => sprintf("%.2f",$dal_4),
				DAL_I => sprintf("%.2f",$dal_i),

				DAL_0_SCORE => sprintf("%.2f",   ($n2_4 == 0 && $n2_4 ne '') ? 0 : (($n_aa_0/$n2_4)*100)),
				DAL_4_SCORE => sprintf("%.2f",   ($n2_4 == 0 && $n2_4 ne '') ? 0 : (($n_aa_4/$n2_4)*100)),
				DAL_I_SCORE => sprintf("%.2f",   ($n2_4 == 0 && $n2_4 ne '') ? 0 : (($n_aa_i/$n2_4)*100)),

				MODEL_NAME => $self->build_model_name($target, $pfrmat, $code, $model, $parent, $domain),
				FULL_TARGET => $self->build_full_target_name($target, $domain),
				DALI_ZSCORE => $dali_z_score,
				DALI_ALIGN_RESIDUES => $dali_align_residues,
				DALI_RMSD => $dali_rmsd,
				GDT_Z_SCORE => sprintf("%.2f",$gdt_4_z_score),
				AL0P_Z_SCORE => sprintf("%.2f",$al0p_5_z_score),
				GDT_Z_SCORE_SERVER => sprintf("%.2f",$gdt_4_z_score_server),
				AL0P_Z_SCORE_SERVER => sprintf("%.2f",$al0p_5_z_score_server),
				GROUP_TYPE => $group_type,

				GDT_Z_SCORE_ALL => sprintf("%.2f",$gdt_4_z_score_all),
				AL0P_Z_SCORE_ALL => sprintf("%.2f",$al0p_5_z_score_all),
				GDT_Z_SCORE_SERVER_ALL => sprintf("%.2f",$gdt_4_z_score_server_all),
				AL0P_Z_SCORE_SERVER_ALL => sprintf("%.2f",$al0p_5_z_score_server_all),
				gdt_ha_4_z_score_server => sprintf("%.2f",$gdt_ha_4_z_score_server),
				gdt_sc => sprintf("%.2f",$lga_4_tr)

				}
			);



			$index++;
        }
    }
    return @results;
}

sub get_mvsm_results {
	my ($self, $params) = @_;
	my $field = $params->{field};
	my $order = $params->{order};
	$field = (!defined($field) || ($field eq '')) ? 're.id' : $field;
	$order = (!defined($order) || ($order eq '')) ? 'ASC' : $order;

	#### DO MULTIPLE SORTING
	my $count_to_replace = 0;
	while ($field =~ s/, / $order,/ || $count_to_replace >20){
	$count_to_replace ++;
	}
	####

#print "Content-Type: text/html; charset=ISO-8859-1\n\n";

	my $sub_query = "";
	if(defined($params->{result_id}) && ($params->{result_id} ne '') && $params->{result_id} != 0) {
		$sub_query .= sprintf(" and re_m.result1_id=\'%s\' ", $params->{result_id});
	} else {
		return 0;
	}

	my @results = ();
	my $index = 1;
################# first row the should be result which we are clustering
	my $query = sprintf("SELECT pr.target, pr.pfrmat, gr.code, pr.model, re.id, re.predictions_id, re.parent, re.domain, re.gdt_ts_4, re.pc01, re.pc05, re.lga_s_5, re.ace_rms_ca, re.ace_rms_all, pr.date FROM casp9.results re
	JOIN casp9.predictions pr ON  (re.predictions_id = pr.id)
	JOIN casp9.groups gr ON (pr.groups_id = gr.id)
	WHERE 1=1 and re.id=%s ", $params->{result_id});

	my $sth = $self->{_database}->query($query);

	if(defined($sth) && ($sth->rows() > 0)) {
		while(my($target, $pfrmat, $code, $model, $id, $predictions_id, $parent, $domain, $gdt_ts_4, $pc01, $pc05, $lga_s_5, $ace_rms_ca, $ace_rms_all, $date) = $sth->fetchrow_array()) {
			push(@results,
				{INDEX => $index,
				TARGET => $target,
				PFRMAT => $pfrmat,
				CODE => sprintf("%03d",$code),
				MODEL => $model,
				id => $id,
				predictions_id => $predictions_id,
				parent => $parent,
				domain => $domain,
				date => substr($date, 0, 10),
				gdt_ts_4 => $gdt_ts_4,
				pc01 => $pc01,
				pc05 => $pc05,
				lga_s_5 => $lga_s_5,
				ace_rms_ca => $ace_rms_ca,
				ace_rms_all => $ace_rms_all,
				mvsm_rms => 0,
				bacground => '#0FFF00',
				date => (defined($date) ? (( substr($date, 0, 10) . "  " . substr($date, 11, 8) )) : '-'),
				MODEL_NAME => $self->build_model_name($target, $pfrmat, $code, $model, $parent, $domain),
				FULL_TARGET => $self->build_full_target_name($target, $domain)
				});
			$index++;
		}
	}

#################

	$query = sprintf("SELECT pr.target, pr.pfrmat, gr.code, pr.model, re.id, re.predictions_id, re.parent, re.domain, re.gdt_ts_4, re.pc01, re.pc05, re.lga_s_5, re.ace_rms_ca, re.ace_rms_all, re_m.rms, pr.date, re.n1_4, re.n1_5 FROM casp9.results re
	JOIN casp9.predictions pr ON  (re.predictions_id = pr.id)
	JOIN casp9.groups gr ON (pr.groups_id = gr.id)
	JOIN casp9.results_mvsm re_m ON (re_m.result2_id = re.id )
	WHERE 1=1 and re_m.rms < %s  %s ORDER BY %s %s ", $params->{pc}, $sub_query, $field, $order);

	$sth = $self->{_database}->query($query);


	if(defined($sth) && ($sth->rows() > 0)) {

		while(my($target, $pfrmat, $code, $model, $id, $predictions_id, $parent, $domain, $gdt_ts_4, $pc01, $pc05, $lga_s_5, $ace_rms_ca, $ace_rms_all, $mvsm_rms, $date) = $sth->fetchrow_array()) {
			push(@results,
				{INDEX => $index,
				TARGET => $target,
				PFRMAT => $pfrmat,
				CODE => sprintf("%03d",$code),
				MODEL => $model,
				id => $id,
				predictions_id => $predictions_id,
				parent => $parent,
				domain => $domain,
				date => substr($date, 0, 10),
				gdt_ts_4 => $gdt_ts_4,
				pc01 => $pc01,
				pc05 => $pc05,
				lga_s_5 => $lga_s_5,
				ace_rms_ca => $ace_rms_ca,
				ace_rms_all => $ace_rms_all,
				mvsm_rms => $mvsm_rms,
				bacground => '#ffffff',
				date => (defined($date) ? (( substr($date, 0, 10) . "  " . substr($date, 11, 8) )) : '-'),
				MODEL_NAME => $self->build_model_name($target, $pfrmat, $code, $model, $parent, $domain),
				FULL_TARGET => $self->build_full_target_name($target, $domain)
				});
			$index++;
		}
	}
	return @results;
}

sub get_targets_results {
    my ($self, $params) = @_;
    my $field = $params->{field};
    my $order = $params->{order};
    $field = (!defined($field) || ($field eq '')) ? 'tr.name' : $field;
    $order = (!defined($order) || ($order eq '')) ? 'ASC' : $order;

    $field = 'tr.name';
    $order = 'ASC';


    #### DO MULTIPLE SORTING
    my $count_to_replace = 0;
    while ($field =~ s/, / $order,/ || $count_to_replace >20){
    $count_to_replace ++;
    }
    ####
    #print "Content-Type: text/html; charset=ISO-8859-1\n\n";
    my $sub_query = "";
    #TODO to REMOVE!!! if(defined($params->{result_id}) && ($params->{result_id} ne '') && $params->{result_id} != 0) {
    #	$sub_query .= sprintf(" and re_m.result1_id=\'%s\' ", $params->{result_id});
    #} else {
    #	return 0;
    #}

    my @results = ();
    my $index = 1;
    ###### SQL: JOIN ALL DATA
    #select rt.targets_id, rt.domains_index, dm.index, * from casp9.results_targets rt
    #JOIN casp9.targets tr ON (rt.targets_id = tr.id)
    #JOIN casp9.submitted_sequences sb ON (tr.submitted_sequences_id = sb.id)
    #LEFT OUTER JOIN casp9.domains dm on
    #(dm.targets_id = rt.targets_id and dm.index = rt.domains_index)
    ######

    my $query = sprintf("select tr.id, tr.name, rt.domains_real_index from casp9.results_targets rt
    JOIN casp9.targets tr ON (rt.targets_id = tr.id)
    LEFT OUTER JOIN casp9.domains dm ON (dm.targets_id = rt.targets_id and dm.index = rt.domains_index)
    WHERE rt.is_public=1 %s ORDER BY %s %s ", $sub_query, $field, $order);

#print $query;
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	while(my($target_id, $target, $domains_real_index) = $sth->fetchrow_array()) {
	    push(@results,
		{INDEX => $index,
		TARGET_ID =>$target_id,
		DOMAIN => $domains_real_index,
		TARGET => $target,
		NAME => sprintf("%s%s", $target,(($domains_real_index eq '0')?'':('_D'.$domains_real_index)))
		});
	    $index++;
	}
    }
    #################
    return @results;
}

sub info {
    my ($self, $id) = @_;
    %{$self->{_model}} = $self->get_new_model();
    return () if(! $self->exist($id));

    my $query = sprintf("SELECT re.id, re.predictions_id, re.domain, re.date, re.parent, pr.target, pr.model, pr.pfrmat, g.code FROM casp9.results re JOIN casp9.predictions pr ON (pr.id = re.predictions_id) JOIN casp9.groups g ON (pr.groups_id = g.id) WHERE (re.id = %d)", $id);
    my $sth = $self->{_database}->query($query);

    if(defined($sth) && ($sth->rows() > 0)) {
		(
		${$self->{_model}}{ID},
		${$self->{_model}}{PREDICTION_ID},
		${$self->{_model}}{DOMAIN},
		${$self->{_model}}{DATE},
		${$self->{_model}}{PARENT},
		${$self->{_model}}{TARGET},
		${$self->{_model}}{MODEL},
		${$self->{_model}}{PFRMAT},
		${$self->{_model}}{CODE},
		) = $sth->fetchrow_array();

        ${$self->{_model}}{DATE} = substr(${$self->{_model}}{DATE}, 0, 10);
    }

    return %{$self->{_model}};
}

sub model_name {
    my ($self, $id) = @_;

    my %info = $self->info($id);

	my $result = $self->build_model_name($info{TARGET}, $info{PFRMAT}, $info{CODE}, $info{MODEL}, $info{PARENT}, $info{DOMAIN});

    return $result;
}

sub build_model_name {
    my ($self, $target_name, $pfrmat, $group_code, $index, $parent, $domain_index) = @_;

    my $result = '';

    $result = sprintf("%s%s%03d_%d%s%s", $target_name, $pfrmat, $group_code, $index, (($parent > 0) ? sprintf("\_%d", $parent) : ''), (($domain_index > 0) ? sprintf("-D%d", $domain_index) : ''));

    return $result;
}

sub update_results_mvsm {
    my ($self, $id, $id_1, $id_2, $rms) = @_;
    my $result = 0;

    return $result if($id);
    my $query = sprintf("UPDATE casp9.results_mvsm SET result1_id=%s, result2_id=%s, rms=%s WHERE (id = %d)", $id_1, $id_2, $rms, $id);
    my $sth = $self->{_database}->query($query);

    if(defined($sth)) {
        $result = 1;
    }
    print "----- UPDATE $id - $id_1 - $id_2 - $rms";
    return $result;
}

sub add_mvsm {
    my ($self, $id_1, $id_2, $rms) = @_;
    my $result = 0;

    my $query = sprintf("INSERT INTO casp9.results_mvsm ( result1_id, result2_id, rms ) VALUES ( %s, %s, %s)", $id_1, $id_2, $rms);

    my $sth = $self->{_database}->query($query);
    if(defined($sth)) {
        my $query = sprintf("SELECT MAX(id) FROM casp9.results_mvsm");
        my $sth = $self->{_database}->query($query);
        # add logger
        ($result) = $sth->fetchrow_array();
    }
    print "----- ADD: $result - $id_1 - $id_2 - $rms";
    return $result;
}

sub get_gdt_results {
    my ($self, $target_id, $full_target_name) = @_;

    my @results = ();

	# stupid detour because table predictions doesn't have targets_id field for some reason!
	# comment: yeah stupied reason!!! and where is domain definition???
	my $targets_manager = new TargetsManager();
	my $name = $targets_manager->name($target_id);


    #print "Content-Type: text/html; charset=ISO-8859-1\n\n";

    my $target_name = $self->get_target_from_full_target_name($full_target_name);
    #added domain definition
    my $domain = $self->get_domain_from_full_target_name($full_target_name);

    my $query = sprintf("SELECT pr.target, pr.pfrmat, gr.code, gr.id, pr.model, re.id, re.predictions_id, re.parent, re.domain, re.gdt_ca_percentage_4 FROM casp9.results re
	    JOIN casp9.predictions pr ON (re.predictions_id = pr.id) JOIN casp9.groups gr ON (pr.groups_id = gr.id) WHERE pr.target='%s' and re.domain=%d ORDER BY pr.pfrmat ASC, gr.code ASC, pr.model DESC", $target_name, $domain);

    #print $query;

    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($target, $pfrmat, $code, $groups_id, $model, $id, $predictions_id, $parent, $domain, $gdt_ca_percentage_4) = $sth->fetchrow_array()) {
	    push(@results, {
		INDEX => $index,
		TARGET => $target,
		PFRMAT => $pfrmat,
		CODE => sprintf("%03d", $code),
		GROUP_ID => $groups_id,
		MODEL => $model,
		PARENT => $parent,
		DOMAIN => $domain,
		GDT_CA_PERCENTAGE_4 => $gdt_ca_percentage_4}
	    );
	    $index++;
        }
    }

    return @results;
}

sub groups_per_target {
	my ($self, $target_id, $full_target_name) = @_;

    my @results = ();

    my $target_name = "";

    if ($target_id != 0) {
	# stupid detour because table predictions doesn't have targets_id field for some reason!
	# comment: yeah stupied reason!!! and where is domain definition???
	my $targets_manager = new TargetsManager();
	my $name = $targets_manager->name($target_id);
    } else {
	$target_name = $self->get_target_from_full_target_name($full_target_name);
    }

    my $query = sprintf("SELECT DISTINCT(p.groups_id), g.type, g.name, g.code FROM casp9.predictions p JOIN casp9.groups g ON (p.groups_id = g.id) WHERE ((p.pfrmat='TS') OR (p.pfrmat='AL')) AND (p.target='%s') ORDER BY g.name ASC", $target_name);
    #print "<br>". $query;
    my $sth = $self->{_database}->query($query);

    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($groups_id, $type, $name, $code) = $sth->fetchrow_array()) {
			push(@results, {
				INDEX => $index,
				GROUP_ID => $groups_id,
				TYPE => $type,
				CODE => sprintf("%03d", $code),
				NAME => $name}
			);
			$index++;
        }
    }

    return @results;
}

sub groups_list {
    my ($self, $params) = @_;
    my @results = ();
    my $sub_query = "";

    my $field = $params->{field};
    my $order = $params->{order};
    $field = (!defined($field) || ($field eq '')) ? 'gr.name' : $field;
    $order = (!defined($order) || ($order eq '')) ? 'ASC' : $order;


    if(defined($params->{target_id}) && ($params->{target_id} ne '') ) {
	my $targets_manager = new TargetsManager();
	my $name = $targets_manager->name($params->{target_id});
	$sub_query .= sprintf(" and pr.target = \'%s\' ", $name);
    }

    if(defined($params->{target}) && ($params->{target} ne '') ) {
	my $target_name = $self->get_target_from_full_target_name($params->{target});
	$sub_query .= sprintf(" and pr.target = \'%s\' ", $target_name);
    }

    if(defined($params->{where}) && ($params->{where} ne '') ) {
	$sub_query .= sprintf(" %s ", $params->{where});
    }

    if(defined($params->{groups_id}) && ($params->{groups_id} ne '') ) {
	$sub_query .= sprintf(" and gr.id =%s ", $params->{groups_id});
    }



    if(defined($params->{pfrmat}) && ($params->{pfrmat} ne '') ) {
	if($params->{pfrmat} eq "3D") {
	    $sub_query .= sprintf(" and (pr.pfrmat = \'TS\' or pr.pfrmat = \'AL\') ");
	} else {
	    $sub_query .= sprintf(" and pr.pfrmat = \'%s\' ", $params->{pfrmat});
	}
    }


    my $query = sprintf("SELECT DISTINCT(pr.groups_id), gr.type, gr.name, gr.code FROM casp9.predictions pr JOIN casp9.groups gr ON (pr.groups_id = gr.id) WHERE 1=1 %s ORDER BY %s %s ", $sub_query, $field, $order);
    #print "<br>". $query;
    my $sth = $self->{_database}->query($query);

    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($groups_id, $type, $name, $code) = $sth->fetchrow_array()) {
	    push(@results, {
		    INDEX => $index,
		    GROUP_ID => $groups_id, ## I AM NOT SURE IF WE USE IT
		    ID => $groups_id,
		    TYPE => $type,
		    CODE => sprintf("%03d", $code),
		    NAME => $name}
	    );
	    $index++;
        }
    }

    return @results;
}

sub get_domain_from_full_target_name {
    my ($self, $target_name) = @_;
    my $result = 0;
    if(defined($target_name) && ($target_name ne '')) {
	if ($target_name =~ /^(\S+)-D(\S+)/) {
		$result = $2;
	}
    }
    return $result;
}

sub get_target_from_full_target_name {
    my ($self, $target_name) = @_;
    my $result = $target_name;
    if(defined($target_name) && ($target_name ne '')) {
	if ($target_name =~ /^(\S+)-D(\S+)/) {
		$result = $1;
	}
    }
    return $result;
}

sub build_full_target_name {
    my ($self, $target_name, $domain_index) = @_;
    my $result = '';
    $result = sprintf("%s%s", $target_name, (($domain_index > 0) ? sprintf("-D%d", $domain_index) : ''));
    return $result;
}

sub ToString {
    my ($self, $PS, %model, $is_return) = @_;
    # $PS -   print separator could be "\n" for text or "<br>" for HTML
    my $str = '';
    while ( my ($key, $value) = each(%model) ) {
	if(defined($is_return) && $is_return == 1) {
        	$str.= sprintf("%s => %s  %s ", $key, $value, $PS);
	} else {
		print sprintf("%s => %s  %s ", $key, $value, $PS);
	}

    }
    #TODO TO REMOVE: OLD SOURSE CODE
    #print sprintf("ID: %s $PS PREDICTION_ID: %s $PS DOMAIN_ID: %s $PS DATE: %s", $model{ID},  $model{PREDICTION_ID}, $model{DOMAIN_ID}, $model{DATE});
    #print sprintf("$PS TARGET: %s $PS PFRMAT: %s $PS CODE: %s $PS MODEL: %s $PS PARENT: %s $PS DOMAIN: %s $PS", $model{TARGET},  $model{PFRMAT}, $model{CODE}, $model{MODEL}, $model{PARENT}, $model{DOMAIN});
    return $str;
}

##########################
##########################
##########just for meeting

sub get_groups {
    my ($self, $params) = @_;
    my $field = $params->{field};
    my $order = $params->{order};
    $field = (!defined($field) || ($field eq '')) ? 'gr.code' : $field;
    $order = (!defined($order) || ($order eq '')) ? 'ASC' : $order;

    my $sub_query = "";

    if(defined($params->{is_server}) && ($params->{is_server} ne '') && $params->{is_server} eq 1) {
    	$sub_query .= sprintf(" and gr.type > 0");
    }

    my @results = ();
    my $index = 1;

    my $query = sprintf("select gr.id, gr.code, gr.name from casp9.groups gr where 1=1 %s ORDER BY %s %s ", $sub_query, $field, $order);

print $query;
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	while(my($id, $code, $name) = $sth->fetchrow_array()) {
	    push(@results,
		{INDEX => $index,
		ID =>$id,
		CODE =>sprintf('%03d', $code),
		NAME => $name
		});
	    $index++;
	}
    }
    #################
    return @results;
}

sub get_domains {
    my ($self, $params) = @_;

    my $sub_query = "";

    if(defined($params->{domain_format}) && ($params->{domain_format} ne '')) {

	if($params->{domain_format} eq "TBM") {
	    $sub_query .= sprintf(" and EXISTS(select id from casp9.domains dom where dom.index = re.domain and  dom.targets_id = tr.id and domain_classifications_id IN (1,2,4)) ");
	} elsif($params->{domain_format} eq "FM") {
	    $sub_query .= sprintf(" and EXISTS(select id from casp9.domains dom where dom.index = re.domain and  dom.targets_id = tr.id and domain_classifications_id IN (3,4)) ");
	}
    }


    if(defined($params->{is_server_only}) && ($params->{is_server_only} ne '')) {
	$sub_query .= sprintf(" and tr.is_server_only=%s", $params->{is_server_only});
    }



    my @results = ();
    my $index = 1;

    my $query = sprintf("select DISTINCT pr.target || re.domain, pr.target, re.domain
from casp9.results re
join casp9.predictions pr on (pr.id = re.predictions_id)
join casp9.groups gr on (gr.id = pr.groups_id)
join casp9.targets tr on (tr.name = pr.target)

where 1=1 and re.domain IN (1,2,3,4,5) %s

ORDER by pr.target ASC, re.domain ASC ", $sub_query);


print $query . "\n";

    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	while(my($target_domain, $target, $domain) = $sth->fetchrow_array()) {
	    push(@results,
		{INDEX => $index,
		TARGET =>$target,
		DOMAIN =>$domain
		});
	    $index++;
	}
    }
    #################
    return @results;
}

sub get_gdt_ts {
    my ($self, $params) = @_;
    my $sub_query = "";

    if(defined($params->{domain}) && ($params->{domain} ne '')) {
	$sub_query .= sprintf(" and re.domain=%s ", $params->{domain});
    }
    if(defined($params->{target}) && ($params->{target} ne '')) {
	$sub_query .= sprintf(" and pr.target='%s' ", $params->{target});
    }
    if(defined($params->{groups_id}) && ($params->{groups_id} ne '')) {
	$sub_query .= sprintf(" and gr.id=%s ", $params->{groups_id});
    }
    if(defined($params->{model}) && ($params->{model} ne '')) {
	$sub_query .= sprintf(" and pr.model=%s ", $params->{model});
    }

    my @results = ();
    my $index = 1;

    my $query = sprintf("
    select MAX(gdt_ts_4) from casp9.results re
    join casp9.predictions pr on (pr.id = re.predictions_id)
    join casp9.groups gr on (gr.id = pr.groups_id)
    where 1=1 %s and re.n1_4>19 ", $sub_query);

print $query . "\n";
my  $gdt_ts = "X";
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	#while(my($gdt) = $sth->fetchrow_array()) {
	$gdt_ts = $sth->fetchrow_array();
	#}

    }

    if(!defined($gdt_ts) || $gdt_ts eq "") {
	$gdt_ts = "X";
    }

    #################

    return $gdt_ts;
}

sub get_z_score {
    my ($self, $params) = @_;
    my $sub_query = "";

    if(defined($params->{domain}) && ($params->{domain} ne '')) {
	$sub_query .= sprintf(" and re.domain=%s ", $params->{domain});
    }
    if(defined($params->{target}) && ($params->{target} ne '')) {
	$sub_query .= sprintf(" and pr.target='%s' ", $params->{target});
    }
    if(defined($params->{groups_id}) && ($params->{groups_id} ne '')) {
	$sub_query .= sprintf(" and gr.id=%s ", $params->{groups_id});
    }

    if(defined($params->{model}) && ($params->{model} ne '')) {
	$sub_query .= sprintf(" and pr.model=%s ", $params->{model});
    }

    my $kind_of_z_score = "gdt_4_z_score";

    if(defined($params->{is_server_group}) && ($params->{is_server_group} eq '1')) {
	$kind_of_z_score = "gdt_4_z_score_server";
    }


    if(defined($params->{z_score}) && ($params->{z_score} ne '')) {
	$kind_of_z_score = $params->{z_score};
    }



    my @results = ();
    my $index = 1;

    my $query = sprintf("
    select MAX(%s) from casp9.results re
    join casp9.predictions pr on (pr.id = re.predictions_id)
    join casp9.groups gr on (gr.id = pr.groups_id)
    where 1=1 %s and re.n1_4 > 19 ", $kind_of_z_score, $sub_query);

print $query . "\n";
my  $gdt_ts = "X";
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	#while(my($gdt) = $sth->fetchrow_array()) {
	$gdt_ts = $sth->fetchrow_array();
	#}

    }

    if(!defined($gdt_ts) || $gdt_ts eq "") {
	$gdt_ts = "X";
    }

    #################

    return $gdt_ts;
}

sub get_best_gdt_ts {
    my ($self, $params) = @_;
    my $sub_query = "";

    if(defined($params->{domain}) && ($params->{domain} ne '')) {
	$sub_query .= sprintf(" and re.domain=%s ", $params->{domain});
    }
    if(defined($params->{target}) && ($params->{target} ne '')) {
	$sub_query .= sprintf(" and pr.target='%s' ", $params->{target});
    }
    if(defined($params->{groups_id}) && ($params->{groups_id} ne '')) {
	$sub_query .= sprintf(" and gr.id=%s ", $params->{groups_id});
    }

    my @results = ();
    my $index = 1;

    my $query = sprintf("
    select MAX(gdt_ts_4) from casp9.results re
    join casp9.predictions pr on (pr.id = re.predictions_id)
    join casp9.groups gr on (gr.id = pr.groups_id)
    where 1=1 %s and re.n1_4>19 ", $sub_query);

print $query . "\n";
my  $gdt_ts = "X";
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	#while(my($gdt) = $sth->fetchrow_array()) {
	$gdt_ts = $sth->fetchrow_array();
	#}

    }

    if(!defined($gdt_ts) || $gdt_ts eq "") {
	$gdt_ts = "X";
    }

    #################

    return $gdt_ts;
}

sub get_gdt_ha_counts {
    my ($self, $params) = @_;

    my $sub_query = "";

    if(defined($params->{is_server_only}) && ($params->{is_server_only} ne '')) {
	$sub_query .= sprintf(" and tr.is_server_only=%s", $params->{is_server_only});
    }

    my @results = ();
    my $index = 1;

    my $query = sprintf("
select DISTINCT pr.target || re.domain, pr.target, re.domain
from casp9.results re
join casp9.predictions pr on (pr.id = re.predictions_id)
join casp9.groups gr on (gr.id = pr.groups_id)
join casp9.targets tr on (tr.name = pr.target)

where 1=1 and re.domain IN (1,2,3,4,5) %s
", $sub_query);


print $query . "\n";

    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	while(my($target_domain, $target, $domain) = $sth->fetchrow_array()) {
	    push(@results,
		{INDEX => $index,
		TARGET =>$target,
		DOMAIN =>$domain
		});
	    $index++;
	}
    }
    #################
    return @results;
}

sub upload_results_for_target {
	my ($self, $targets, $actions) = @_;
	system ('/local/evaluation/results_upload.sh', join(',', @{$targets}), join(',', @{$actions}));
}

sub delete_results_for_target {
	my ($self, $target) = @_;
	my $where = 'predictions_id in (select id from casp9.predictions p where p.target=?)';
	if ($target =~ /^(\S+)-D(\d+)/) {
		$target = $1;
		$where .= " and casp9.results.domain=$2";
	}
	$self->{_database}->query("DELETE FROM casp9.results_alignment WHERE results_id IN (SELECT id FROM casp9.results WHERE $where)", $target);
	$self->{_database}->query("DELETE FROM casp9.results WHERE $where", $target);
}

1;
