package ResultsRefinementManager;
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 ResultsManager;
my $r_m = new ResultsManager();
use CGI qw(:all);
use BO;
our @ISA = qw(BO);
sub new {
    my ($class) = @_;
    my $self = $class->SUPER::new("casp13.refinement_results");

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


sub get_new_model {
    my ($self) = @_;
    my %model = (
########################### system
	id => '',
	predictions_id =>'',
        date => '',
########################## file name
        TARGET => '',
        PFRMAT => '',
        CODE => '',
        MODEL => '',
        parent =>'',
        domain =>0,
########################### 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 => '',
	rmsd_all => '',
	lga_4_tr => '',
	lddt => '',
	sg_lvr_6_2 => '',
	sg_py => '',
	INDEX => 0
    );
    return %model;
}

sub is_table_column {
my ($self, $colunm_name) = @_;
my $result = 0;
if(	$colunm_name eq 'id' ||
	$colunm_name eq 'predictions_id' ||
	$colunm_name eq 'date' ||
	########################## file name
	$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_ha_4' ||
	$colunm_name eq 'alignment_4' ||
	$colunm_name eq 'rmsd_all' ||
	$colunm_name eq 'lga_4_tr' ||
	$colunm_name eq 'lddt' ||
	$colunm_name eq 'sg_lvr_6_2' ||
	$colunm_name eq 'sg_py'

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

sub exist_by_parameters {
    my ($self, %model) = @_;
    my $result = 0;
    my $query = sprintf("SELECT rr.id FROM %s rr JOIN casp13.predictions pr ON  (rr.predictions_id = pr.id)
	JOIN casp13.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 rr.parent=%d and rr.domain=%d", $self->{_table},
      	$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 get_predictions_id {
    my ($self, %model) = @_;
    my $result = '';
    my $query = sprintf("SELECT pr.id FROM casp13.predictions pr JOIN casp13.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 get_rows {
    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 '')) ? 'rr.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->{id}) && ($params->{id} ne '')) {
 	$sub_query .= sprintf(" and rr.id=\'%s\' ", $params->{id});
    }

    if(defined($params->{target}) && ($params->{target} ne '')) {
	if ($params->{target} =~ /^R/ && $params->{target} !~ m/^R0957s2/) {
	   $sub_query .= sprintf(" and pr.target=\'%s\' ", $params->{target});
	} elsif ($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});
	}
    }
    ## domain defenition
    if(defined($params->{domain}) && ($params->{domain} ne '')) {
	$sub_query .= sprintf(" and rr.domain=\'%s\' ", $params->{domain});
    } else{
	$sub_query .= sprintf(" and rr.domain=\'%s\' ", $domain);
    }

    if(defined($params->{groups_id}) && ($params->{groups_id} ne '')) {
	$sub_query .= sprintf(" and pr.groups_id=\'%s\' ", $params->{groups_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 gr.id, pr.target, pr.pfrmat, gr.code, pr.model, rr.id, rr.parent, rr.domain, rr.gdt_ts_4, rr.gdt_ha_4, rr.rmsd_4, rr.alignment_4, rr.rmsd_all, rr.lga_4_tr
		FROM %s rr JOIN casp13.predictions pr ON  (rr.predictions_id = pr.id) JOIN casp13.targets tr ON  (pr.target = tr.name) JOIN casp13.groups gr ON (pr.groups_id = gr.id)
		WHERE 1=1 %s ORDER BY %s %s LIMIT 2500", $self->{_table}, $sub_query, $field, $order);
		my $sth = $self->{_database}->query($query);

    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($group_id, $target, $pfrmat, $code, $model, $id, $parent, $domain, $gdt_ts_4, $gdt_ha_4, $rmsd_4, $alignment_4, $rmsd_all, $lga_4_tr) = $sth->fetchrow_array()) {
	    push(@results, {
		INDEX => $index,
		GROUP_ID => $group_id,
		TARGET => $target,
		PFRMAT => $pfrmat,
		CODE => sprintf("%03d",$code),
		MODEL => $model,
		ID => $id,
		PARENT => $parent,
		DOMAIN => $domain,
		gdt_ts => sprintf("%.2f", $gdt_ts_4),
		gdt_ha => sprintf("%.2f", $gdt_ha_4),
		lga_4_tr => sprintf("%.2f", $lga_4_tr),
		rmsd => sprintf("%.2f", $rmsd_4),
		name => $r_m->build_model_name($target, $pfrmat, $code, $model, $parent, $domain),
		distances => $alignment_4,
		rmsd_all => $rmsd_all
		}
	    );
	    $index++;
        }
    }
    return @results;
}


sub add_alignment {
    my ($self, $results_id, $flag, $alignment) = @_;
    my $column = undef;
    if ( $flag eq "lddt" ){
        $column = "alignment_lddt";
    } elsif ($flag eq "sg_lvr"){
        $column = "alignment_sg_lvr";
    } elsif ($flag eq "sg_py"){
        $column = "alignment_sg_py";
    } elsif ($flag eq 'gdt_ts_4' || $flag eq 'lga_sda'){
	$column = "alignment_gdt";
    }
    if (!defined($column)){
        return undef; # do nothing
    }
    # check if there exists record with the given results_id
    my $id = $self->exist_alignment($results_id);
    if (!defined($id)) { # insert into
      my $query = sprintf("INSERT INTO casp13.refinement_results_alignment (refinement_results_id, %s) VALUES (%s, \'%s\')", $column, $results_id, $alignment);
      my $sth = $self->{_database}->query($query);
    } else { # update results
      my $query = sprintf("UPDATE casp13.refinement_results_alignment SET  %s=\'%s\' WHERE id=%d", $column, $alignment, $id);
      my $sth = $self->{_database}->query($query);
    }
}


sub exist_alignment {
    my ($self, $results_id) = @_;
    my $query = sprintf("SELECT id FROM casp13.refinement_results_alignment WHERE refinement_results_id=%d", $results_id);
    my $sth = $self->{_database}->query($query);
    my ($id) = $sth->fetchrow_array();
    if (!defined($id) || $id eq '' || $id <= 0) {
        return undef;
    }
    return $id;
}

sub get_alignment{
    my ($self, $param, $flag) = @_;
    unless (defined($param->{target}) && defined($param->{groups_id}) && defined($param->{model})) {return undef;}
    my $column = undef;
    if (!defined($flag)){
	return undef;
    } elsif ( $flag eq "lddt" ){
        $column = "alignment_lddt";
    } elsif ($flag eq "sg_lvr"){
        $column = "alignment_sg_lvr";
    } elsif ($flag eq "sg_py"){
        $column = "alignment_sg_py";
    } elsif ($flag eq 'gdt_ts_4' || $flag eq 'lga_sda'){
        $column = "alignment_gdt";
    } else {
	return undef;
    }
    my $domain_ = 0; 
    my $target_ = $param->{target};
    if (defined($param->{domain})) {
	$domain_ = $param->{domain};
    }
    if ($target_ =~ m/^R/ && $target_ !~ m/^R0957s2/){
	$domain_ = 0;
    } elsif ($target_ =~ m/(\S+)-D(\d+)/) {
        $target_ = $1;
        $domain_ = $2;
    }
    my $query = sprintf(
        "SELECT ra.$column FROM casp13.refinement_results_alignment ra
        JOIN casp13.refinement_results re ON re.id=ra.refinement_results_id
        JOIN casp13.predictions pr ON pr.id=re.predictions_id
        WHERE pr.target=\'%s\' AND pr.groups_id=%d AND pr.model=%d AND re.domain=%d LIMIT 1",
        $target_, $param->{groups_id}, $param->{model}, $domain_
     );
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
       my ($al) = $sth->fetchrow_array();
       return $al;
    } else {
       return undef;
    }
}

sub get_results_alignment{
    my ($self, $param, $metric) = @_;
    my $field = $param->{field};
    my $order = $param->{order};
    if ($metric eq 'gdt_ts' || $metric eq 'lga_sda'){
	$field =  'rr.gdt_ha_4';
	$order = (!defined($order) || ($order eq '')) ? 'DESC' : $order;
	my $domain_ = 0; my $target_ = $param->{target};
	if ($target_ =~ m/^R/ && $target_ !~ m/^R0957s2/){
        	$domain_ = 0;
    	} elsif ($target_ =~ m/(\S+)-D(\d+)/){
		$target_ = $1; 
		$domain_ = $2;
	}
	my $sub_query = sprintf(" AND pr.target=\'%s\' AND rr.domain=%d ", $target_, $domain_);
	if(defined($param->{model}) && ($param->{model} ne '') && ($param->{model} ne 'all')) {
        	$sub_query .= sprintf(" and pr.model=\'%s\' ", $param->{model});
	}
	my @results = ();
	my $query = sprintf("SELECT  pr.target, rr.domain, pr.pfrmat, gr.code, pr.model, rr.gdt_ha_4, ra.alignment_gdt
                FROM casp13.refinement_results rr JOIN casp13.predictions pr ON  (rr.predictions_id = pr.id) 
		JOIN casp13.groups gr ON (pr.groups_id = gr.id)
		JOIN casp13.refinement_results_alignment ra ON rr.id=ra.refinement_results_id
                WHERE 1=1 %s ORDER BY %s %s LIMIT 2500",  $sub_query, $field, $order);
        my $sth = $self->{_database}->query($query);
	if(defined($sth) && ($sth->rows() > 0)) {
          my $index = 1;
          while(my( $target, $domain, $pfrmat, $code, $model, $gdt_ha_4, $alignment) = $sth->fetchrow_array()) {
	    my @tokens = split(/\s+/, $alignment);
	    my %hash_alignment;
	    foreach my $token (@tokens){
                   if ($token =~ m/(\S+):(\S+)/){
                        $hash_alignment{$1} = $2;
                   }
            }
            push(@results, {
                INDEX => $index,
                TARGET => sprintf("%s%s", $target, ($domain == 0 ? '' : "-D$domain")),
                PFRMAT => $pfrmat,
                CODE => sprintf("%03d",$code),
                MODEL => $model,
                gdt_ha => sprintf("%.2f", $gdt_ha_4),
		HASH_ALIGNMENT => \%hash_alignment,
		name => sprintf("%s%s%03d_%d%s", $target, $pfrmat, $code, $model, ($domain == 0 ? '' : "-D$domain")),
                }
            );
            $index++;
          }
        }
        return @results;
    } elsif ($metric eq 'lddt') {
	$field = 'rr.lddt' ;
	$order = (!defined($order) || ($order eq '')) ? 'DESC' : $order;
        my $domain_ = 0; my $target_ = $param->{target};
        if ($target_ =~ m/^R/ && $target_ !~ m/^R0957s2/){
        	$domain_ = 0;
	} elsif ($target_ =~ m/(\S+)-D(\d+)/){
                $target_ = $1;
                $domain_ = $2;
        }
        my $sub_query = sprintf(" AND pr.target=\'%s\' AND rr.domain=%d ", $target_, $domain_);
	if(defined($param->{model}) && ($param->{model} ne '') && ($param->{model} ne 'all')) {
           $sub_query .= sprintf(" and pr.model=\'%s\' ", $param->{model});
        }
        my @results = ();
        my $query = sprintf("SELECT  pr.target, rr.domain, pr.pfrmat, gr.code, pr.model, rr.lddt, ra.alignment_lddt
                FROM casp13.refinement_results rr JOIN casp13.predictions pr ON  (rr.predictions_id = pr.id) 
                JOIN casp13.groups gr ON (pr.groups_id = gr.id)
                JOIN casp13.refinement_results_alignment ra ON rr.id=ra.refinement_results_id
                WHERE 1=1 %s ORDER BY %s %s LIMIT 2500",  $sub_query, $field, $order);
        my $sth = $self->{_database}->query($query);
	if(defined($sth) && ($sth->rows() > 0)) {
          my $index = 1;
          while(my( $target, $domain, $pfrmat, $code, $model, $lddt,  $alignment) = $sth->fetchrow_array()) {
            my @tokens = split(/\s+/, $alignment);
            my %hash_alignment;
            foreach my $token (@tokens){
                   if ($token =~ m/(\S+):(\S+)/){
                        $hash_alignment{$1} = $2;
                   }
            }
            push(@results, {
                INDEX => $index,
                TARGET => sprintf("%s%s", $target, ($domain == 0 ? '' : "-D$domain")),
                PFRMAT => $pfrmat,
                CODE => sprintf("%03d",$code),
                MODEL => $model,
                lddt => sprintf("%.2f", $lddt),
                HASH_ALIGNMENT => \%hash_alignment,
                name => sprintf("%s%s%03d_%d%s", $target, $pfrmat, $code, $model, ($domain == 0 ? '': "-D$domain")), 
                }
            );
            $index++;
          }
        }
        return @results;
    } elsif ($metric eq 'sg_lvr') {
	$field = 'rr.sg_lvr_6_2';
        $order = (!defined($order) || ($order eq '')) ? 'DESC' : $order;
        my $domain_ = 0; my $target_ = $param->{target};
        if ($target_ =~ m/^R/ && $target_ !~ m/^R0957s2/){
        	$domain_ = 0;
	} elsif ($target_ =~ m/(\S+)-D(\d+)/){
                $target_ = $1;
                $domain_ = $2;
        }
        my $sub_query = sprintf(" AND pr.target=\'%s\' AND rr.domain=%d ", $target_, $domain_);
        if(defined($param->{model}) && ($param->{model} ne '') && ($param->{model} ne 'all')) {
                $sub_query .= sprintf(" and pr.model=\'%s\' ", $param->{model});
        }
        my @results = ();
        my $query = sprintf("SELECT pr.target, rr.domain, pr.pfrmat, gr.code, pr.model, rr.sg_lvr_6_2, ra.alignment_sg_lvr
                FROM casp13.refinement_results rr JOIN casp13.predictions pr ON  (rr.predictions_id = pr.id) 
                JOIN casp13.groups gr ON (pr.groups_id = gr.id)
                JOIN casp13.refinement_results_alignment ra ON rr.id=ra.refinement_results_id
                WHERE 1=1 %s ORDER BY %s %s LIMIT 2500",  $sub_query, $field, $order);
        my $sth = $self->{_database}->query($query);
        if(defined($sth) && ($sth->rows() > 0)) {
          my $index = 1;
          while(my( $target, $domain, $pfrmat, $code, $model, $sg_lvr_6_2,  $alignment) = $sth->fetchrow_array()) {
            my @tokens = split(/\s+/, $alignment);
            my %hash_alignment;
            foreach my $token (@tokens){
                   if ($token =~ m/(\S+):(\S+)/){
                        $hash_alignment{$1} = $2;
                   }
            }
            push(@results, {
                INDEX => $index,
                TARGET => sprintf("%s%s", $target, ($domain == 0 ? '': "-D$domain")),
                PFRMAT => $pfrmat,
                CODE => sprintf("%03d",$code),
                MODEL => $model,
                sg_lvr_6_2 => sprintf("%.2f", $sg_lvr_6_2),
                HASH_ALIGNMENT => \%hash_alignment,
                name => sprintf("%s%s%03d_%d%s", $target, $pfrmat, $code, $model, ($domain == 0 ? '': "-D$domain")),
                }
            );
            $index++;
          }
        }
        return @results;
    } elsif ($metric eq 'sg_py') {
        $field = 'rr.sg_py';
        $order = (!defined($order) || ($order eq '')) ? 'DESC' : $order;
        my $domain_ = 0; my $target_ = $param->{target};
        if ($target_ =~ m/^R/ && $target_ !~ m/^R0957s2/){
                $domain_ = 0;
        } elsif ($target_ =~ m/(\S+)-D(\d+)/){
                $target_ = $1;
                $domain_ = $2;
        }
        my $sub_query = sprintf(" AND pr.target=\'%s\' AND rr.domain=%d ", $target_, $domain_);
        if(defined($param->{model}) && ($param->{model} ne '') && ($param->{model} ne 'all')) {
                $sub_query .= sprintf(" and pr.model=\'%s\' ", $param->{model});
        }
        my @results = ();
        my $query = sprintf("SELECT pr.target, rr.domain, pr.pfrmat, gr.code, pr.model, rr.sg_py, ra.alignment_sg_py
                FROM casp13.refinement_results rr JOIN casp13.predictions pr ON  (rr.predictions_id = pr.id) 
                JOIN casp13.groups gr ON (pr.groups_id = gr.id)
                JOIN casp13.refinement_results_alignment ra ON rr.id=ra.refinement_results_id
                WHERE 1=1 %s ORDER BY %s %s LIMIT 2500",  $sub_query, $field, $order);
        my $sth = $self->{_database}->query($query);
        if(defined($sth) && ($sth->rows() > 0)) {
          my $index = 1;
          while(my( $target, $domain, $pfrmat, $code, $model, $sg_py,  $alignment) = $sth->fetchrow_array()) {
            $alignment=defined($alignment)? $alignment: '';
            my @tokens = split(/\s+/, $alignment);
            my %hash_alignment;
            foreach my $token (@tokens){
                   if ($token =~ m/(\S+):(\S+)/){
                        $hash_alignment{$1} = $2;
                   }
            }
            push(@results, {
                INDEX => $index,
                TARGET => sprintf("%s%s", $target, ($domain == 0 ? '': "-D$domain")),
                PFRMAT => $pfrmat,
                CODE => sprintf("%03d",$code),
                MODEL => $model,
                sg_py => sprintf("%.2f", (defined($sg_py)?$sg_py: 0)),
                HASH_ALIGNMENT => \%hash_alignment,
                name => sprintf("%s%s%03d_%d%s", $target, $pfrmat, $code, $model, ($domain == 0 ? '': "-D$domain")),
                }
            );
            $index++;
          }
        }
        return @results;
    }
}



sub get_delta_refinement {
  my ($self, $params) = @_;
  my $where = ' WHERE 1=1 ';
  my $query;
  my @results;
  if (defined($params->{target}) && ($params->{target} eq 'all')) { # average over all targets
     if (defined($params->{models}) && ($params->{models} eq '1' || $params->{models} eq 'first')){
	$where .= " AND model=1 ";
     }
     $query = "SELECT gr_code, count(*) as count_m, 
		avg(delta_gdt_ts_4) as delta_gdt_ts_4, avg(delta_ace_rms_ca) as delta_ace_rms_ca, 
		avg(delta_ace_rms_all) as delta_ace_rms_all, avg(delta_gdt_ha_4) as delta_gdt_ha_4, 
		avg(delta_lga_4_tr) as delta_lga_4_tr, avg(delta_z_score_m) as delta_z_score_m, 
		avg(delta_dali_z_score) as delta_dali_z_score, avg(delta_lddt) as delta_lddt, 
		avg(delta_cad_aa) as delta_cad_aa, avg(delta_sg_py) as delta_sg_py, 
		avg(delta_mp_score) as delta_mp_score, avg(delta_codm) as delta_codm, 
		avg(delta_dfm) as delta_dfm, avg(delta_handedness) as delta_handedness, 
		avg(delta_rpf) as delta_rpf,
		avg(delta_sov) as delta_sov, avg(delta_ce) as delta_ce, 
		avg(delta_tm_score) as delta_tm_score, avg(delta_qcs) as delta_qcs, avg(delta_flexe) as delta_flexe
		FROM casp13.delta_refinement dr
		JOIN casp13.targets t ON t.name::text=dr.target::text
		JOIN casp13.results_targets rt ON rt.targets_id=t.id AND dr.domain=rt.domains_index
		$where	AND rt.access_type=1
		GROUP BY gr_code
		ORDER BY delta_gdt_ts_4 DESC, gr_code";
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($gr_code, $count_m,
		$delta_gdt_ts_4, $delta_ace_rms_ca,
                $delta_ace_rms_all, $delta_gdt_ha_4, $delta_lga_4_tr,
                $delta_z_score_m, $delta_dali_z_score, $delta_lddt, $delta_cad_aa, $delta_sg_py,
                $delta_mp_score, $delta_codm, $delta_dfm, $delta_handedness, $delta_rpf, $delta_sov, $delta_ce,
                $delta_tm_score, $delta_qcs, $delta_flexe) = $sth->fetchrow_array()) {
            push(@results, {
		INDEX => $index,
		MODEL_NAME => sprintf("G%03d", $gr_code),
		COUNT_M => $count_m,
                delta_gdt_ts_4 => (defined($delta_gdt_ts_4) ? sprintf("%.3f",$delta_gdt_ts_4) : '-'),
                delta_ace_rms_ca => (defined($delta_ace_rms_ca) ? sprintf("%.3f",$delta_ace_rms_ca) : '-'),
                delta_ace_rms_all => (defined($delta_ace_rms_all) ? sprintf("%.3f", $delta_ace_rms_all) : '-'),
                delta_gdt_ha_4 => (defined($delta_gdt_ha_4) ? sprintf("%.3f", $delta_gdt_ha_4) : '-'),
                delta_gdt_sc => (defined($delta_lga_4_tr) ? sprintf("%.3f", $delta_lga_4_tr) : '-'),
                delta_z_score_m => (defined($delta_z_score_m) ? sprintf("%.3f", $delta_z_score_m) : '-'),
                delta_dali_z_score => (defined($delta_dali_z_score) ? sprintf("%.3f", $delta_dali_z_score) : '-'),
                delta_lddt => (defined($delta_lddt) ? sprintf("%.3f", $delta_lddt) : '-'),
                delta_cad_aa => (defined($delta_cad_aa) ? sprintf("%.3f", $delta_cad_aa): '-'),
                delta_sg_py => (defined($delta_sg_py) ? sprintf("%.3f", $delta_sg_py) : '-'),
                delta_mp_score => (defined($delta_mp_score) ? sprintf("%.3f", $delta_mp_score) : '-'),
                delta_codm => (defined($delta_codm) ? sprintf("%.3f", $delta_codm) : '-'),
                delta_dfm => (defined($delta_dfm) ? sprintf("%.3f", $delta_dfm) : '-'),
                delta_handedness => (defined($delta_handedness) ? sprintf("%.3f", $delta_handedness) : '-'),
                delta_rpf => (defined($delta_rpf) ? sprintf("%.3f", $delta_rpf) : '-'),
                delta_sov => (defined($delta_sov) ? sprintf("%.3f", $delta_sov) : '-'),
                delta_ce => (defined($delta_ce) ? sprintf("%.3f", $delta_ce) : ''),
                delta_tm_score => (defined($delta_tm_score) ? sprintf("%.3f", $delta_tm_score) : '-'),
                delta_qcs => (defined($delta_qcs) ? sprintf("%.3f", $delta_qcs) : '-'),
                delta_flexe => (defined($delta_flexe) ? sprintf("%.3f", $delta_flexe) : '-')
		});
	    $index++;
	}
    }
  } elsif (defined($params->{target}) && ($params->{target} ne '')) {
     if ($params->{target} =~ /^R/ && $params->{target} !~ m/^R0957s2/) {
         $where .= sprintf(" AND target=\'%s\' AND domain=0 ", $params->{target});
     } elsif ($params->{target} =~ m/^(\S+)-D(\S+)/) {
         $where .= sprintf(" AND target=\'%s\' AND domain=%d ", $1, $2);
     } else {
         $where .= sprintf(" AND target=\'%s\' AND domain=0 ", $params->{target});
     }
     if (defined($params->{models}) && ($params->{models} eq '1' || $params->{models} eq 'first')){
        $where .= " AND model=1 ";
     }
     $query = "SELECT gr_code, domain, model, 
                delta_gdt_ts_4, delta_ace_rms_ca, 
                delta_ace_rms_all, delta_gdt_ha_4, 
                delta_lga_4_tr, delta_z_score_m, 
                delta_dali_z_score, delta_lddt, 
                delta_cad_aa, delta_sg_py, 
                delta_mp_score, delta_codm, 
                delta_dfm, delta_handedness, 
                delta_rpf,
                delta_sov, delta_ce, 
                delta_tm_score, delta_qcs, delta_flexe
                FROM casp13.delta_refinement 
                $where  
		ORDER BY delta_gdt_ts_4 DESC, gr_code , model
                ";
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($gr_code, $domain, $model, 
		$delta_gdt_ts_4, $delta_ace_rms_ca,
                $delta_ace_rms_all, $delta_gdt_ha_4, $delta_lga_4_tr,
                $delta_z_score_m, $delta_dali_z_score, $delta_lddt, $delta_cad_aa, $delta_sg_py,
                $delta_mp_score, $delta_codm, $delta_dfm, $delta_handedness, $delta_rpf, $delta_sov, $delta_ce,
                $delta_tm_score, $delta_qcs, $delta_flexe) = $sth->fetchrow_array()) {
            push(@results, {
                MODEL_NAME => sprintf("%sTS%03d_%d%s", ($params->{target} =~ m/R0957s2-D1/ ? 'R0957s2' : $params->{target} ), $gr_code, $model, ($domain == 0 ? '' : '-D'.$domain)),
                INDEX => $index,
		target => ($params->{target} =~ m/R0957s2-D1/ ? 'R0957s2' : $params->{target} ),
		gr_code => $gr_code,
		model => $model,
		domain => $domain,
                delta_gdt_ts_4 => (defined($delta_gdt_ts_4) ? sprintf("%.3f",$delta_gdt_ts_4) : '-'),
                delta_ace_rms_ca => (defined($delta_ace_rms_ca) ? sprintf("%.3f",$delta_ace_rms_ca) : '-'),
                delta_ace_rms_all => (defined($delta_ace_rms_all) ? sprintf("%.3f", $delta_ace_rms_all) : '-'),
                delta_gdt_ha_4 => (defined($delta_gdt_ha_4) ? sprintf("%.3f", $delta_gdt_ha_4) : '-'),
                delta_gdt_sc => (defined($delta_lga_4_tr) ? sprintf("%.3f", $delta_lga_4_tr) : '-'),
		delta_lga_4_tr => (defined($delta_lga_4_tr) ? sprintf("%.3f", $delta_lga_4_tr) : '-'),
                delta_z_score_m => (defined($delta_z_score_m) ? sprintf("%.3f", $delta_z_score_m) : '-'),
                delta_dali_z_score => (defined($delta_dali_z_score) ? sprintf("%.3f", $delta_dali_z_score) : '-'),
                delta_lddt => (defined($delta_lddt) ? sprintf("%.3f", $delta_lddt) : '-'),
                delta_cad_aa => (defined($delta_cad_aa) ? sprintf("%.3f", $delta_cad_aa): '-'),
                delta_sg_py => (defined($delta_sg_py) ? sprintf("%.3f", $delta_sg_py) : '-'),
                delta_mp_score => (defined($delta_mp_score) ? sprintf("%.3f", $delta_mp_score) : '-'),
                delta_codm => (defined($delta_codm) ? sprintf("%.3f", $delta_codm) : '-'),
                delta_dfm => (defined($delta_dfm) ? sprintf("%.3f", $delta_dfm) : '-'),
                delta_handedness => (defined($delta_handedness) ? sprintf("%.3f", $delta_handedness) : '-'),
                delta_rpf => (defined($delta_rpf) ? sprintf("%.3f", $delta_rpf) : '-'),
                delta_sov => (defined($delta_sov) ? sprintf("%.3f", $delta_sov) : '-'),
                delta_ce => (defined($delta_ce) ? sprintf("%.3f", $delta_ce) : '-'),
                delta_tm_score => (defined($delta_tm_score) ? sprintf("%.3f", $delta_tm_score) : '-'),
                delta_qcs => (defined($delta_qcs) ? sprintf("%.3f", $delta_qcs) : '-'),
                delta_flexe => (defined($delta_flexe) ? sprintf("%.3f", $delta_flexe) : '-')
                });
            $index++;
        }
    }
  }  
  return @results; 
}
 

1;
