package DomainsManager;

use strict;
use warnings;

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

use lib qw(Core);

use Database;
use TargetsManager;
use DomainDiscussionsManager;
use PDBUtils;
use String;

use Configuration;
use LocalConfiguration;

my $domains_manager = undef;

sub new {
    my ($class) = @_;
    
    return $domains_manager if(defined($domains_manager));
    
    my $self = {
        _id => undef,
        _database => Database->new($CONFIG->{HOSTNAME}, $CONFIG->{PORT}, $CONFIG->{DATABASE}, $CONFIG->{USERNAME}, $CONFIG->{PASSWORD})
    };
    
    $domains_manager = bless $self, $class;
    return $domains_manager;
}

sub exist {
    my ($self, $id) = @_;
    
    my $result = 0;
    
    my $query = sprintf("SELECT COUNT(id) FROM casp13.domains 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_domain {
    my ($self, $target_id, $index) = @_;
    
    my $result = 0;
    
    my $query = sprintf("SELECT COUNT(id) FROM casp13.domains WHERE (targets_id = %d) AND (index = %d)", $target_id, $index);
    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 update_range {
    my ($self, $target_id, $index, $range, $classification_id, $length) = @_;
    
    my $result = 0;
    
    return $result if(! $self->exist_domain($target_id, $index));
    
    my $query = sprintf("UPDATE casp13.domains SET range = '%s', domain_classifications_id=%d, length = %d WHERE (targets_id = %d) AND (index = %d)", quotemeta($range), $classification_id, $length, $target_id, $index);
    my $sth = $self->{_database}->query($query);
    
    if(defined($sth)) {
        $result = 1;
    }
    
    return $result;
}

sub add {
    my ($self, $target_id, $index, $range, $classification_id, $length) = @_;
    
    my $result = 0;
    
    my $query = sprintf("INSERT INTO casp13.domains (targets_id, index, range, domain_classifications_id, length) VALUES (%d, %d, '%s', %d, %d)",
                        $target_id, $index, $range, $classification_id, $length);
    
    my $sth = $self->{_database}->query($query);
    
    if(defined($sth)) {
        my $query = sprintf("SELECT MAX(id) FROM casp13.domains");
        my $sth = $self->{_database}->query($query);
        # add logger
        ($result) = $sth->fetchrow_array();
    }
    
    return $result;
}

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

sub get_domains {
    my ($self, $target_id, $domain, $is_edit) = @_;
    
    my @domains = ();
   
    my $sub_query = "";
    if(defined($domain) && ($domain ne '') && ($domain ne '0')) {
        $sub_query .= sprintf(" and d.index=\'%s\' ", $domain);	
    }
    if(defined($is_edit) && ($is_edit ne '') && ($is_edit eq '1')) {
    #    $sub_query .= sprintf(" and d.index < 10 ");
        #we are not going to edit domain from 10 to ... (9)
    }
    
    
    my $query = sprintf("SELECT d.id, d.index, d.range, d.length, dc.id, dc.name, d.date FROM casp13.domains d LEFT JOIN casp13.domain_classifications dc ON (dc.id = d.domain_classifications_id) WHERE (d.targets_id = %d) %s ORDER BY d.index ASC", $target_id, $sub_query);
    my $sth = $self->{_database}->query($query);
    
# if ($target_id eq '24') {
# 	print "Content-Type: text/html; charset=ISO-8859-1\n\n";
#     	print "Info $query<br>";
# 
# }
#print "Content-Type: text/html; charset=ISO-8859-1\n\n";
#print "Info $query<br>";

    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($domain_id, $domain_index, $range, $length, $classification_id, $classification_name, $date) = $sth->fetchrow_array()) {
push(@domains, {
                    INDEX => $index,
                    ID => $domain_id,
                    DOMAIN_INDEX => $domain_index,
                    RANGE => $range,
                    LENGTH => $length,
                    CLASSIFICATION_ID => $classification_id,
                    CLASSIFICATION_NAME => $classification_name,
		    DATE => substr($date, 0, 10)
            	}
            );
            $index++;
        }
    }
    
    return @domains;
}

sub get_all_domains {
    my ($self, $params) = @_;
    my $field = $params->{field};
    my $order = $params->{order};    
    #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 '')) ? 'd.date' : $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 $sub_query = "";
    if(defined($params->{target_id}) && ($params->{target_id} ne '')) {
	$sub_query .= sprintf(" and (d.targets_id = %d) ", $params->{target_id});
    }
    
    my @domains = ();
    
    my $query = sprintf("SELECT d.id, d.index, d.range, d.length, dc.id, dc.name, tr.name, tr.id, d.date FROM casp13.domains d LEFT JOIN casp13.domain_classifications dc ON (dc.id = d.domain_classifications_id)
                        JOIN casp13.targets tr ON (tr.id = d.targets_id)
                        WHERE 1=1 %s ORDER BY %s %s ", $sub_query , $field, $order);
    my $sth = $self->{_database}->query($query);
#    print "\n" . $query . "\n"; 
    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($domain_id, $domain_index, $range, $length, $classification_id, $classification_name, $target_name, $target_id, $date) = $sth->fetchrow_array()) {
            push(@domains, {
                    INDEX => $index,
                    ID => $domain_id,
                    DOMAIN_INDEX => $domain_index,
                    RANGE => $range,
                    LENGTH => $length,
                    CLASSIFICATION_ID => $classification_id,
                    CLASSIFICATION_NAME => $classification_name,
                    TARGET_NAME => $target_name,
		    TARGET_ID => $target_id,
		    DATE => substr($date, 0, 18)
            	}
            );
            $index++;
        }
    }
    
    return @domains;
}


sub targets {
    my ($self, $field, $order) = @_;
    
    $field = (!defined($field) || ($field eq '')) ? 't.name' : $field;
    $order = (!defined($order) || ($order eq '')) ? 'ASC' : $order;
    
    #my $params = {'field' => $field, 'order' => $order, 'view' => 'regular'};
    my $params = {'field' => $field, 'order' => $order};
    
    my $targets_manager = new TargetsManager();
    my @targets = $targets_manager->public_targets($params);
    my $targets_count = scalar(@targets);
    
    my $domain_discussions_manager = new DomainDiscussionsManager();
    #this comment added by okrysko
    #OMG!! PLEASE USE USE JOIN or LEFT JOIN !! what are you doing ...  
    #SELECT rt.id, rt.targets_id, rt.domains_index, rt.domains_real_index, rt.is_public, tr.name, dm.range, dm.length, ss.number_of_aa
    #FROM casp13.results_targets rt JOIN casp13.targets tr ON (tr.id = rt.targets_id)
    #LEFT JOIN casp13.domains dm ON (dm.targets_id = rt.targets_id and  dm."index" = rt.domains_index) 
    #JOIN casp13.submitted_sequences ss ON (ss.id = tr.submitted_sequences_id)
    #
    # WHERE 1=1 and rt.is_public='1'
    #ORDER BY tr.name ASC
    #
    #this example will good for you 
    
    # this block handles with chains_superposition files
    my @chains_superposition_files = ();
    if(opendir(DIR, sprintf("%s", $LOCAL_CONFIG->{CHAIN_STRUCTURES_DIR}))){
	while (my $file = readdir(DIR)) {
        	next unless ($file =~ m/^(T|R)[0-9]{4}(s\d){0,1}\.[0-9]{1,}(models|chains)\.pdb$/);
		push @chains_superposition_files, $file;
	}
	closedir(DIR);
    }
    
    for(my $i = 0; $i < $targets_count; $i++) {
        my @domains = $self->get_domains($targets[$i]->{ID});
        my $domains_count = scalar(@domains);

    	# don't count domain with index '0'
	foreach my $domain (@domains){
		if($domain->{DOMAIN_INDEX} == 0){
			$domains_count = $domains_count - 1;
			last;
		}
	}
    
        $targets[$i]->{DOMAINS} = [@domains];
        $targets[$i]->{DOMAINS_COUNT} = $domains_count;
    
	$targets[$i]->{IS_FINAL_DOM_DEF} = $targets_manager->get_is_final_domain_def($targets[$i]->{ID});
	$targets[$i]->{IS_UPDATE_DOM_DEF} = $targets_manager->get_is_update_domain_def($targets[$i]->{ID});
	$targets[$i]->{IS_FINAL_EVAL} = $targets_manager->get_is_final_eval($targets[$i]->{ID});
	

	$targets[$i]->{HAS_TARGET_FILE} = (-e sprintf("%s/%s.pdb", $LOCAL_CONFIG->{TARGETS_DIR}, $targets[$i]->{NAME}) ? 1 : 0);
	$targets[$i]->{HAS_PSE_FILE} = (-e sprintf("/local/CASP13/ASSESSORS/PSE/%s.pse", $targets[$i]->{NAME}) ? 1 : 0);

	# chains_superposition
	$targets[$i]->{NUMBER_OF_CHAINS} = '-';
	$targets[$i]->{CHAINS_SUPERPOSITION_FILE} = '-';
	if($targets[$i]->{HAS_TARGET_FILE} == 1){
	   $targets[$i]->{NUMBER_OF_CHAINS} = 1;
	   foreach my $chain_file (@chains_superposition_files){
		my $regexp = sprintf("^%s\.([0-9]{1,})(models\|chains)\.pdb\$",$targets[$i]->{NAME});
		if($chain_file =~ m/$regexp/){
		   $targets[$i]->{NUMBER_OF_CHAINS} = $1;
		   $targets[$i]->{CHAINS_SUPERPOSITION_FILE} = $chain_file;
		   last;
		}
	   }
	}

        my @comments = $domain_discussions_manager->domain_discussions($targets[$i]->{ID});
        my $comments_count = scalar(@comments);
        
        $targets[$i]->{COMMENTS} = [@comments];
        $targets[$i]->{COMMENTS_COUNT} = $comments_count;
        
        if($comments_count > 0) {
            my $comment_date = DateTime->now( time_zone => 'America/Los_Angeles' );
            my $last_comment_date = $comments[$comments_count - 1]->{DATE};
            my $last_comment_author = sprintf("%s %s", $comments[$comments_count - 1]->{FIRSTNAME}, $comments[$comments_count - 1]->{LASTNAME});
            
            my $last_comment;
            if($last_comment_date =~ /(\d+)\-(\d+)\-(\d+) (\d+):(\d+)/) {
                $last_comment = new DateTime (
                    year => $1,
                    month => $2,
                    day => $3,
                    hour   => $4,
                    minute => $5,
                    time_zone => 'America/Los_Angeles'
                );
            }
            
            my $last_comment_state = 0;
            
            if(DateTime->compare_ignore_floating($comment_date->subtract(hours => 24), $last_comment) <= 0) {
                $last_comment_state = 1;
            } elsif(DateTime->compare_ignore_floating($comment_date->subtract(hours => 48), $last_comment) <= 0) {
                $last_comment_state = 2;
            } elsif(DateTime->compare_ignore_floating($comment_date->subtract(hours => 168), $last_comment) <= 0) {
                $last_comment_state = 3;
            }
            
            $targets[$i]->{LAST_COMMENT_STATE} = $last_comment_state;
            $targets[$i]->{LAST_COMMENT_DATE} = $last_comment_date;
            $targets[$i]->{LAST_COMMENT_AUTHOR} = $last_comment_author;
        }
    }
    
    return @targets;
}

sub classifations {
    my ($self) = @_;
    
    my @classifications = ();
    
    my $query = sprintf("SELECT id, name FROM casp13.domain_classifications ORDER BY id ASC");
    my $sth = $self->{_database}->query($query);
    
    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($id, $name) = $sth->fetchrow_array()) {
	    if($name eq 'TBM-HA'){next;} # isn't valid since CASP13
#	    if($name eq 'other'){next;} # is used only for classification of the whole target
            push(@classifications, {
                    INDEX => $index,
                    ID => $id,
                    NAME => $name
            	}
            );
            $index++;
        }
    }
    
    return @classifications;
}



sub split_targets_to_domains {
    my ($self, $target_name, $testdom_only) = @_;
    if (!defined($testdom_only) || $testdom_only == 0){ # 
	$testdom_only = 0;
    } else {
	$testdom_only = 1;
    }
    my $info = "";#"\nProcess Split Target:" . $target_name . "\n";
    my $targets_manager = new TargetsManager();    
    my $target_id = $targets_manager->get_id_by_name($target_name);    
    my @domains = $self->get_domains($target_id);
    
    for (my $i = 0; $i < scalar(@domains); $i++) {	
	if($domains[$i]->{RANGE} ne '' && $domains[$i]->{RANGE} ne '000') {
	    if ($testdom_only == 1){
		if ($domains[$i]->{DOMAIN_INDEX} < 7 || $domains[$i]->{DOMAIN_INDEX} > 9){
			next;
		}
	    }
            print "Split Target D# " . ($i+1). " RANGE: " . $domains[$i]->{RANGE}. "\n";
            $info .= "Split Target D# " . ($i+1). " RANGE: " . $domains[$i]->{RANGE}. "\n";
            my @subdomains = split(/,/, $domains[$i]->{RANGE});
            my @range = ();
            foreach my $subdomain (@subdomains) {
                my $from = 0;
                my $to = 0;
                if ($subdomain =~ /^(\d+)[-](\d+)$/) {
                    $from = int($1);
                    $to = int($2);
                } elsif($subdomain =~ /^(\d+)$/) {
                    $from = int($1);
                    $to = $from;
                }
                for (my $j = $from; $j <= $to; $j++) {
                    push @range, $j;
                }
            }

            if(scalar(@range) == 0 || $range[0] == 0) {
                print  "RANGE: " . $domains[$i]->{RANGE}. "\n We are not going to process this range \n";
                $info .= "RANGE: " . $domains[$i]->{RANGE}. "\n We are not going to process this range \n";
                next;
            }

            my $current_target_file = sprintf("%s/%s.pdb", $LOCAL_CONFIG->{DATA_TARGETS_DIR}, $target_name);
            my $results_domain_file = sprintf("%s/%s-D%s.pdb", $LOCAL_CONFIG->{DATA_TARGETS_DIR}, $target_name, $domains[$i]->{DOMAIN_INDEX});
            print "Current target: " . $current_target_file . "\n";
            print "Results target: " . $results_domain_file . "\n";
            print "\n";
            $self->split_file_by_domains(\@range, $current_target_file, $results_domain_file);

	    # for refinement targets
	    if ($target_name =~ m/^R/) {
		$current_target_file = sprintf("%s/templates/%s.pdb.txt", $LOCAL_CONFIG->{DATA_TARGETS_DIR}, $target_name);
                $results_domain_file = sprintf("%s/templates/%s-D%s.pdb.txt", $LOCAL_CONFIG->{DATA_TARGETS_DIR}, $target_name, $domains[$i]->{DOMAIN_INDEX});
		$self->split_file_by_domains(\@range, $current_target_file, $results_domain_file);
	    }
        }
    }
    return $info;
}

sub split_models_to_domains {
    my($self, $target_name, $testdom_only)  = @_;
    if (!defined($testdom_only) || $testdom_only == 0){ # 
        $testdom_only = 0;
    } else {
        $testdom_only = 1;
    }

    my $info = ""; #"\nProcess Split Models:" . $target_name . "\n";
    my @models = ();
    open(MODELS_LIST, "ls " . $LOCAL_CONFIG->{DATA_MODELS_DIR} ."/". $target_name . "/ |") || die("Can't open " . $LOCAL_CONFIG->{DATA_MODELS_DIR} . "/" . $target_name . "/");
    @models = <MODELS_LIST>;
    close(MODELS_LIST);
    
    my $targets_manager = new TargetsManager();    
    my $target_id = $targets_manager->get_id_by_name($target_name);    
    my @domains = $self->get_domains($target_id);
    
    # if model contain 1 domain skip
    #if(($onedomain eq 'No') && ($domains[1]->{RANGE} eq '')) {
    #    next;
    #}
        
    for (my $i = 0; $i < scalar(@domains); $i++) {
	if($domains[$i]->{RANGE} ne '' && $domains[$i]->{RANGE} ne '000') {
           if ($testdom_only == 1){
                if ($domains[$i]->{DOMAIN_INDEX} < 7 || $domains[$i]->{DOMAIN_INDEX} > 9){
                        next;
                }
            }
            print "Split Models D# " . ($i+1). " RANGE: " . $domains[$i]->{RANGE}. "\n";
            $info .= "Split Models D# " . ($i+1). " RANGE: " . $domains[$i]->{RANGE}. "\n";
            my @subdomains = split(/,/, $domains[$i]->{RANGE});
            my @range = ();
            foreach my $subdomain (@subdomains) {
                my $from = 0;
                my $to = 0;
                if ($subdomain =~ /^(\d+)[-](\d+)$/) {
                    $from = int($1);
                    $to = int($2);
                } elsif($subdomain =~ /^(\d+)$/) {
                    $from = int($1);
                    $to = $from;
                }
                for (my $j = $from; $j <= $to; $j++) {
                    push @range, $j;
                }
            }
            
            if(scalar(@range) == 0 || $range[0] == 0) {
                print  "RANGE: " . $domains[$i]->{RANGE}. "\n We are not going to process this range \n";
                $info .= "RANGE: " . $domains[$i]->{RANGE}. "\n We are not going to process this range \n";
                next;
            }
            
            # RESULTS/T0283_D1/
            my $RESULTS_DOMAINS_DIR = $LOCAL_CONFIG->{DATA_MODELS_DIR} ."/". $target_name . "-D" . $domains[$i]->{DOMAIN_INDEX} . "/";
            
            if (! -e $RESULTS_DOMAINS_DIR) {
                system('mkdir -p ' . $RESULTS_DOMAINS_DIR);
		system(sprintf("chgrp users %s", $RESULTS_DOMAINS_DIR));
                system(sprintf("chmod 775 %s", $RESULTS_DOMAINS_DIR));
            }
            
	    my $count = 0;
            for (my $m = 0; $m < scalar(@models); $m++) {
                my $current_model = trim($models[$m]);
                if($current_model =~ /^$target_name/) {
                    my $current_model_file = $LOCAL_CONFIG->{DATA_MODELS_DIR} ."/". $target_name . "/" . $current_model;
                    my $results_domain_file = $RESULTS_DOMAINS_DIR . $current_model . "-D" . $domains[$i]->{DOMAIN_INDEX};
                    print "Current model: " . $current_model_file . "\n";
                    print "Results model: " . $results_domain_file . "\n";
                    print "\n";
                    $self->split_file_by_domains(\@range, $current_model_file, $results_domain_file);
		    # check for length of the domain model: cutOff 20 residues
		    if(isShort($results_domain_file)){
			$info .= "Model " . $results_domain_file . " is short (less than 20 residues)\n";
			unlink($results_domain_file);
			$count++;
		    }
                }
            }
            
            $info .= "Number of splited models " . scalar(@models) . "\nShort models removed: $count\n\n";
            
        }
    }
    return $info;
    
}

sub split_file_by_domains {
    my ($self, $range_ref, $model_file, $domain_file) = @_;
    
    open(RESULTS_FILE, ">" . $domain_file);
    open(MODEL_FILE, $model_file);
    
    while(<MODEL_FILE>) {
        if($_ =~ /^ATOM/) {
            my @line = split(//, $_);
            my $resSeq = int($line[22] . $line[23] . $line[24] . $line[25]);
            
            if($self->in_array($range_ref, $resSeq)) {
                print RESULTS_FILE $_;
            }
        } else {
            print RESULTS_FILE $_;
        }
    }
    
    close(MODEL_FILE);
    close(RESULTS_FILE);
   
    system(sprintf("chgrp users %s", $domain_file));
    system(sprintf("chmod 664 %s", $domain_file)); 
    return 0;
}

sub in_array() {
    my ($self, $array_ref, $value) = @_;
    foreach my $elem (@$array_ref) {
        if($value == $elem) {
            return 1;
        }
    }
    return 0;
}

sub get_aa_count_for_target() {
    my ($self, $target_id) = @_;
	my $result = 0;
	my $query = sprintf("SELECT ss.number_of_aa from casp13.submitted_sequences ss join casp13.targets tr on (tr.submitted_sequences_id = ss.id) where tr.id=%s LIMIT 1", $target_id);
	#print "Content-Type: text/html; charset=ISO-8859-1\n\n";
	#print "Info $query<br>";
	my $sth = $self->{_database}->query($query);
	if(defined($sth) && ($sth->rows() > 0)) {
		$result = $sth->fetchrow_array();
	}
	return $result;
}


###############
### REF TARGET


sub split_tr_targets_to_domains {
    my ($self, $target_name, $domain, $rangestr, $DATA_TARGETS_DIR) = @_;
    my $info = "";#"\nProcess Split Target:" . $target_name . "\n";
# # #     my $targets_manager = new TargetsManager();    
# # #     my $target_id = $targets_manager->get_id_by_name($target_name);    
# # #     my @domains = $self->get_domains($target_id);
# # #     
# # #     for (my $i = 0; $i < scalar(@domains); $i++) {	
	if($rangestr ne '' && $rangestr ne '000') {
            print "Split Target D# " . $domain . " RANGE: " . $rangestr. "\n";
            $info .= "Split Target D# " . $domain . " RANGE: " . $rangestr. "\n";
            my @subdomains = split(/,/, $rangestr);
            my @range = ();
            foreach my $subdomain (@subdomains) {
                my $from = 0;
                my $to = 0;
                if ($subdomain =~ /^(\d+)[-](\d+)$/) {
                    $from = int($1);
                    $to = int($2);
                } elsif($subdomain =~ /^(\d+)$/) {
                    $from = int($1);
                    $to = $from;
                }
                for (my $j = $from; $j <= $to; $j++) {
                    push @range, $j;
                }
            }

            if(scalar(@range) == 0 || $range[0] == 0) {
                print  "RANGE: " . $rangestr . "\n We are not going to process this range \n";
                $info .= "RANGE: " . $rangestr . "\n We are not going to process this range \n";
                next;
            }

            my $current_target_file = sprintf("%s/%s.pdb", $DATA_TARGETS_DIR, $target_name);
            my $results_domain_file = sprintf("%s/%s-D%s.pdb", $DATA_TARGETS_DIR, $target_name, $domain);
            print "Current target: " . $current_target_file . "\n";
            print "Results target: " . $results_domain_file . "\n";
            print "\n";
            $self->split_file_by_domains(\@range, $current_target_file, $results_domain_file);
        }
    ###}
    return $info;
}

sub split_tr_models_to_domains {
    my($self, $target_name, $domain, $rangestr, $DATA_MODELS_DIR)  = @_;
    my $info = ""; #"\nProcess Split Models:" . $target_name . "\n";
    my @models = ();
    open(MODELS_LIST, "ls " . $DATA_MODELS_DIR  . "/ |") || die("Can't open " . $DATA_MODELS_DIR . "/" );
    @models = <MODELS_LIST>;
    close(MODELS_LIST);
    
# #     my $targets_manager = new TargetsManager();    
# #     my $target_id = $targets_manager->get_id_by_name($target_name);    
# #     my @domains = $self->get_domains($target_id);
# #     
    # if model contain 1 domain skip
    #if(($onedomain eq 'No') && ($range eq '')) {
    #    next;
    #}
        
    ###for (my $i = 0; $i < scalar(@domains); $i++) {
	if($rangestr ne '' && $rangestr ne '000') {
            print "Split Models D# " . $domain . " RANGE: " . $rangestr. "\n";
            $info .= "Split Models D# " . $domain . " RANGE: " . $rangestr. "\n";
            my @subdomains = split(/,/, $rangestr);
            my @range = ();
            foreach my $subdomain (@subdomains) {
                my $from = 0;
                my $to = 0;
                if ($subdomain =~ /^(\d+)[-](\d+)$/) {
                    $from = int($1);
                    $to = int($2);
                } elsif($subdomain =~ /^(\d+)$/) {
                    $from = int($1);
                    $to = $from;
                }
                for (my $j = $from; $j <= $to; $j++) {
                    push @range, $j;
                }
            }
            
            if(scalar(@range) == 0 || $range[0] == 0) {
                print  "RANGE: " . $rangestr. "\n We are not going to process this range \n";
                $info .= "RANGE: " . $rangestr. "\n We are not going to process this range \n";
                next;
            }
            
            # RESULTS/T0283_D1/
            my $RESULTS_DOMAINS_DIR = $DATA_MODELS_DIR ."/". $target_name . "-D" . $domain . "/";
            
            if (! -e $RESULTS_DOMAINS_DIR) {
                system('mkdir -p ' . $RESULTS_DOMAINS_DIR);
                system(sprintf("chgrp users %s", $RESULTS_DOMAINS_DIR));
                system(sprintf("chmod 775 %s", $RESULTS_DOMAINS_DIR));
 
            }
            
            for (my $m = 0; $m < scalar(@models); $m++) {
                my $current_model = trim($models[$m]);
                if($current_model =~ /^$target_name/) {
                    my $current_model_file = $DATA_MODELS_DIR ."/".  $current_model;
                    my $results_domain_file = $RESULTS_DOMAINS_DIR . $current_model . "-D" . $domain;
                    print "Current model: " . $current_model_file . "\n";
                    print "Results model: " . $results_domain_file . "\n";
                    print "\n";
                    $self->split_file_by_domains(\@range, $current_model_file, $results_domain_file);
                }
            }
            
            $info .= "Number of splited models " . scalar(@models) . "\n\n";
            
        }
    ###}
    return $info;
    
}


sub  get_summary_domains {
    my ($self, $params) = @_;
    my $field = $params->{field};
    my $order = $params->{order};

    $field = (!defined($field) || ($field eq '')) ? 't.name' : $field;
    $order = (!defined($order) || ($order eq '')) ? 'ASC' : $order;

    my @domains = ();

    my $query = sprintf("SELECT t.name as target_name, ss.number_of_aa as target_n_aa, t.is_server_only as target_type, d.index as domain_index, d.range, d.length as domain_n_aa, dc.name as classification_name, t.release_date, t.pdb_code as pdb, t.cancellation_status as is_cancel 
		FROM casp13.targets t LEFT JOIN casp13.domains d ON t.id=d.targets_id JOIN casp13.domain_classifications dc ON dc.id=d.domain_classifications_id 
		LEFT JOIN casp13.submitted_sequences ss ON t.submitted_sequences_id=ss.id WHERE (t.name similar TO 'T%%' AND d.index NOT IN (8,9)  AND t.cancellation_status<>1) ORDER BY 
                 %s %s, d.index ASC ",  $field, $order);
    my $sth = $self->{_database}->query($query);
#    print "\n" . $query . "\n"; 
    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($target_name, $target_n_aa, $is_server_only, $domain_index, $range, $domain_n_aa, $classification_name, $release_date, $pdb, $is_cancel) = $sth->fetchrow_array()) {
            push(@domains, {
                    INDEX => $index,
                    TARGET_NAME => $target_name,
		    TARGET_N_AA => $target_n_aa,
		    IS_SERVER_ONLY => $is_server_only,
                    DOMAIN_INDEX => ($is_cancel ne '1' ? $domain_index : '-'),
                    RANGE => ($is_cancel ne '1' ? $range : '-'),
                    DOMAIN_N_AA => ($is_cancel ne '1' ? $domain_n_aa : 'cancelled'),
                    CLASSIFICATION_NAME => ($is_cancel ne '1' ? ($classification_name eq 'other' ? 'not evaluated': $classification_name ) : '-'),
                    RELEASE_DATE => $release_date,
		    PDB => ((!defined($pdb) or $pdb eq '' or $is_cancel eq '1') ? '-' : $pdb ),
		    IS_CANCEL => $is_cancel
                }
            );
            $index++;
        }
    }

    return @domains;


}















1;
