#!/usr/bin/perl
package sdevGetSeq;

#######################################################################
##### Author :	Shuai Weng
##### Date   :  Nov. 2001
##### Modified: Mira Kaloper
##### Description : This package contains all necessary methods for 
#####               displaying DNA/protein sequence to user. 
#####              
#######################################################################
use strict;
use DBI;
use CGI qw/:all/;

use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase/Objects";
use Chromosome;
use Sequence;
use GCG;
use Reference;
use Reflink;
use Feature;
use SeqParamTranslator;
use ConfigURLdictyBase;
use ConfigPathdictyBase;

use lib "/usr/local/dicty/www_dictybase/db/lib/common";
use Login qw (ConnectToDatabase);
use TextUtil qw (DeleteUnwantedChar);
use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase";
use dictyBaseCentralMod qw(:formatPage);

use Bio::SeqIO;
use Bio::Seq;

#######################################################################
#################### global variables #################################
#######################################################################

my $dbh;
my $dblink; 
my $configUrl;
my $configPath;
my $locusObj;
my $featObj;


#######################################################################
sub new {      ############ constructor ###############################
#######################################################################
       
	my ($self, %args) = @_;

	$self = {};

	bless $self;

      	$self->{'_database'} = $args{'database'};
	$self->{'_help'} = $args{'help'};
	$self->{'_title'} = $args{'title'};
	$self->{'_map'} = $args{'map'};
	$self->{'_query'} = $args{'query'};
	$self->{'_chr'} = $args{'chr'};
	$self->{'_beg'} = $args{'beg'};
	$self->{'_end'} = $args{'end'};

        if (!$self->{'_map'}) {
           $self->{'_map'} = "n3map";
        }
    	return $self;
}

sub help { $_[0]->{_help} }
sub database { $_[0]->{_database} }
sub title { $_[0]->{_title} }


######################################################################
sub DESTROY {   ############ destructor ##############################
######################################################################
    	if (defined $dbh) {
		$dbh->disconnect;
    	}
}

######################################################################
sub start{
######################################################################

    	my ($self) = @_;

	$configUrl = ConfigURLdictyBase->new;
	$dblink = $configUrl->dblink($self->database);
	$configPath = ConfigPathdictyBase->new;
	
	if (!$self->{'_query'} && !$self->{'_chr'}) {
	    $self->printEntryForm;
	    exit;
	}
	$dbh = &ConnectToDatabase($self->database);
 
	$self->setVariables;

	$self->setTitle;
        $self->setSeqType;
	$self->printSequencePage;
	exit;
}

#######################################################################
sub printEntryForm {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

	print center(table({-border=>3,
                        -cellpadding=>4,
                        -cellspacing=>4},
                       
                       Tr({-align=>'LEFT'},
                          [
                           td({-bgcolor=>"#b7d8e4",
                               -width=>350},
                              table({-border=>0},
                                    Tr({align=>'LEFT'},
                                       [
                                        td(start_form,
                                           "Enter a sequence name : ").
                                        td(textfield(-name=>'query',
                                                     -size=>'15')),
                                        td("&nbsp;").td(submit, reset, end_form)
                                        ]))
                              )
                           ])));

	&printEndPage;
}

########################################################################
sub printSequencePage {
########################################################################
    my ($self) = @_;
    &printStartPage($self->database, $self->title, $self->help);
 
    $self->printLinks;

    $self->printSubtitle;

       #print GCG 6Frame translation  
    if ($self->{'_map'} =~ /^[rf]/i) {    
       $self->printGCG;
       &printEndPage;
       return;

    }

    if ($self->{'_kind'} =~ /^gb/i) {
      
       $self->printGenBankSeq;

       &printEndPage;
       return;

    } 

    #when clone or chromosome selected retreve sequence using chromosome # 
    if (($self->{'_chr'}) || ($self->{'_kind'} =~ /^clone/i)) {
        $self->printDifferentFormat;
        $self->getSequenceFromChromosome;
        &printEndPage;
        return; 
    }

    if (($self->{_map} =~ /^a/i) 
       && (param('flankl')>0 || param('flankr')>0)
       && (param('flankl')!=1000 || param('flankr')!=1000)) {
       $self->printDifferentFormat;
       $self->getSequenceExtended;
       &printEndPage;
       return;
 
    }

    #when feature
    $self->printDifferentFormat; 
    $self->getSequence;
    &printEndPage;
}


########################################################################
sub printGCG{
########################################################################
    my ($self) = shift;

 
    if (param('flankl') > 0 || param('flankr') > 0) {
       $self->{'_beg'} -= param('flankl');
       $self->{'_end'} += param('flankr');
       if ($self->{'_beg'} <= 1) {
           $self->{'_beg'} = 1;
       }
    }

    my $gcg;

    if ($self->{'_kind'} !~ /gb/i) {

	$gcg = GCG->new(map=>$self->{'_map'},
                       seqname=>$self->{'_seqname'},
                       chrnum=>$self->{'_chrnum'},
                       beg=>$self->{'_beg'},
                       end=>$self->{'_end'},
                       rev=>$self->{'_rev'},
                       men=>$self->{'_men'});

    }
    else {

	$gcg = GCG->new(map=>$self->{'_map'},
			sequence=>$self->{'_gbSeq'},
			rev=>$self->{'_rev'});

	
	$self->createTmpSeqFile($self->{'_gbSeq'}, 'dna');

    }
	
    my $seqfile = $gcg->getSequence;

    print "<pre>";

    system("/usr/bin/cat $seqfile");

    print "</pre>";

}

########################################################################
sub printGenBankSeq{
########################################################################
    my ($self) = shift;

    my ($trans, $seqtype);

    if ($self->{'_map'} =~ /^p/i) { 
	$trans++; 
	$seqtype = "protein";
    }
    else { $seqtype = "dna"; }

    my $seqObj = Sequence->new(dbh=>$dbh,
			       sequence=>$self->{'_gbSeq'},
			       desc=>$self->{'_gbDesc'},
			       trans=>$trans,
			       rev=>$self->{'_rev'},);
    my $sequence;

    if ($self->{'_map'} =~ /3/) {
	$sequence = $seqObj->fastaFormatedSequence;
    }
    elsif ($self->{'_map'} =~ /2/) {
	$sequence = $seqObj->noheaderFormatedSequence;
    }
    else {
	$sequence = $seqObj->gcgFormatedSequence;
    }

    $self->createTmpSeqFile($seqObj->getSequence, $seqtype);
   
    print "<pre>";

    print $sequence;

    print "</pre>";
    
}


########################################################################
sub createTmpSeqFile {
########################################################################
    my ($self, $sequence, $seqtype) = @_;
  
    my $SEQTMP = $configPath->tmpDir."gcgseq.tmp.".$self->{'_id'};  # Sequence temp file 
    open(OUT, ">$SEQTMP") || die "getSeq: Can't create tmp seq file:$!\n";
    
    if ($seqtype =~ /^protein/i) {
	print OUT "\!\!AA\_SEQUENCE\n";
    }
    else {
	print OUT "\!\!NA\_SEQUENCE\n";
    }
    print OUT "temp sequence ..\n\n";
    print OUT "$sequence\n";
    close (OUT);
   
}

########################################################################
sub getSequence {
########################################################################
  my ($self) = shift;


  my $map = $self->{'_map'};
  my $seq_type = $self->{'_seq_type'};

  my ($format, $chromosome, $citation, $description);

  if (($self->{'_map'} !~ /3/) && ($self->{'_map'} !~ /2/)) {
     $format = "gcg";
     my $chromosome = $self->getChromosome;
     my $citation = $self->getCitation;

     $description = $chromosome . "\n" . $citation;
  } elsif ($self->{'_map'} =~ /3/) {
    $format = "fasta";
    $description = $self->getFASTAHeader;
  }

 
  my $rev;

  if (!($self->{_map} =~ /^p/i)  
     &&($self->{'_strand'} eq 'watson') 
     && ($self->{'_rev'} eq '-REV')) {
     $rev = 1;
  }

  if (($self->{_map} =~ /^a/i) 
     && ($self->{'_strand'} eq 'crick') 
     && ($self->{'_rev'} eq '')) { 
     $rev = 1;
  }


  if (($self->{_map} =~ /^n/i)
     && ($self->{'_strand'} eq 'crick')
     && ($self->{'_rev'} eq '-REV')) {
     $rev = 1;
  }

 
  my $obj = Sequence->new( dbh => $dbh,
                         feature_name => $self->{'_seqname'},
                         type => $self->{'_seq_type'}, 
                         rev => $rev,
                         desc => $description,
                         display_id => $self->{'_seqname'});


  if (!$obj) {
      print br, $self->{'_seq_type'}, " for ", $self->{'_seqname'}, 
               " not found in the database", br;
      return; 

  }
  my $sequence = $obj->getSequence;


  if ($format eq 'gcg') {
     $sequence = $obj->gcgFormatedSequence;
  } elsif ($format eq 'fasta') {
     $sequence = $obj->fastaFormatedSequence;
  } else {
     $sequence = $obj->noheaderFormatedSequence;
  }


  print "<pre>";

  print $sequence;

  print "</pre>";



}


########################################################################
sub getSequenceExtended {
########################################################################
  my ($self) = shift;


  $self->{'_beg'} -= param('flankl');
  $self->{'_end'} += param('flankr');
  if ($self->{'_beg'} <= 1) {
      $self->{'_beg'} = 1;
  }


  $self->getSubsequence;

}


########################################################################
sub getSequenceFromChromosome{
##########################################################################
  my ($self) = shift;

  if (!$self->{'_chrnum'}) {
      print "Chromosome must be specified";
      exit;
  }

  if (!$self->{'_beg'} || !$self->{'_end'}) {
     print "The beginning and ending coordinates must be specified", br;
     exit;
  }

  $self->getSubsequence;

}


########################################################################
sub printLinks {
########################################################################
    my ($self) = @_;

    my $query;
    my $restrictionQuery;

    if ($self->{'_kind'} =~ /^feature/i) {

       my $suffix = 'nuc';
       $suffix = 'prot' if (($self->{'_map'} eq 'pmap') ||
                         ($self->{'_map'} eq 'p2map') ||
                         ($self->{'_map'} eq 'p3map'));

       $query = "?name=".$self->{'_seqname'}."&suffix=$suffix";
       $restrictionQuery="?locus=".$self->{'_seqname'};
    }

    $self->{'_id'} = $$.$$.$$;

    if ($self->{'_kind'} =~ /^gb/i) {
       $query = "?id=".$self->{'_id'};
       $restrictionQuery="?id=".$self->{'_id'};
 
    }


    if (($self->{'_chr'}) || ($self->{'_kind'} =~ /^clone/i)) {
       
       $restrictionQuery = "?chr=" .$self->{'_chrnum'} ."&beg=" 
       .$self->{'_beg'} .
       "&end=" . $self->{'_end'} . "&rev=" . $self->{'_rev'};
       $query = $restrictionQuery;
    }

    print p, center(a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/suggestion",
                       -target=>'infowin'},
                      "Send questions or suggestions to dictyBase")), p;

#    if (($self->{'_chr'}) || ($self->{'_kind'} =~ /^clone/i)) {
#       print "Temporary problem with analysis forms: For a very short time the sequence below will not be automatically included within the analysis forms. Please copy the sequence below and paste it into the forms. ", p;
#    }


    my $link = a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin/blast.pl$query", -target=>'infowin'}, "BLAST search")." | ".
               a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin/dictyBase/nph-fastadictyBase$query", -target=>'infowin'}, "FASTA search");
    if ($self->{'_kind'} =~ /^gb/i) {
        $link .= " | ";
        if ($self->{'_map'} !~ /^p/i) {
            $link .= a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/PATMATCH/RestrictionMapper$restrictionQuery", -target=>'infowin'}, "Genome Restriction Map")." | ".
                     a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin/dictyBase/web-primer$query", -target=>'infowin'}, "Design Primers")." | ";
        }
        $link .= a({-href=>$configUrl->ncbiUrlRoot2."query?db=n&form=6&uid=".$self->{'_uid'}."&dopt=g", -target=>'infowin'}, "NCBI Entrez")." for this sequence";
    }
    elsif ($self->{'_map'} !~ /^p/i) {
        $link .= " | ".a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/PATMATCH/RestrictionMapper$restrictionQuery", -target=>'infowin'}, "Genome Restriction Map")." | ".a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin/dictyBase/web-primer$query", -target=>'infowin'}, "Design Primers")." for this sequence";

    }
    print p, center($link),p, center(hr({-width=>'35%'})), p;

}

########################################################################
sub printSubtitle {
########################################################################
    my ($self) = @_;

    if ($self->{'_map'} =~ /^p/i) {

	print font({-color=>'FF0000'}, strong("Protein translation of the coding sequence.")),p;

	return;

    }

    my $flankl = param('flankl');
    my $flankr = param('flankr');
    my $beg = $self->{'_beg'};
    my $end = $self->{'_end'};

    if ($self->{'_strand'} eq "crick") {

	($flankl, $flankr) = ($flankr, $flankl);

	($beg, $end) = ($end, $beg);

    }

    my $subtitle;

    if ($self->{'_kind'} =~ /^gb/i) {

	$subtitle = "The currently selected sequence is : ".b("GenBank entry ".font({-color=>'red'}, $self->{'_showNm'})." (".$self->{'_gbDesc'}.")").br;  

    }
    else {

	$subtitle = "The currently selected gene/sequence is : ".p.b(font({-color=>'red'}, $self->{'_showNm'})." on ".$self->{'_chrdesc'}." from coordinates $beg to $end");
    }
    if ($flankr && $flankl) { 
	 $subtitle .= b(" plus $flankl basepairs of upstream sequence and $flankr basepairs of downstream sequence.");
    }
    elsif ($flankl && !$flankr) {
	 $subtitle .= b(" plus $flankl basepairs of upstream sequence.");
    }
    elsif (!$flankl && $flankr) { 
	 $subtitle .= b(" plus $flankr basepairs of downstream sequence.");
    }
    elsif ($self->{'_kind'} !~ /gb/i)  { $subtitle .= b("."); }

    print $subtitle, p;

    if ($self->{'_strand'} eq "watson") {
	if (param('rev')) {
	    if ($self->{'_kind'} =~ /^(locus|feature|dictyBaseid|alias)/i) {
		print font({-color=>'FF0000'}, strong("This is the reverse complement of the coding sequence.")),p;
	    } 
	    else {
		print font({-color=>'FF0000'}, strong("This is the reverse complement of the sequence in the database.")),p;
	    }
	}
    } 
    elsif ($self->{'_strand'} eq "crick") {
	if (param('rev')) {
	    if ($self->{'_kind'} =~ /^(cds|locus|feature|dictyBaseid|alias)/i) {
		print font({-color=>'FF0000'}, strong("This is the reverse complement of the coding sequence.")),p;
	    } 
	    else {
		print font({-color=>'FF0000'}, strong("This is the reverse complement of the sequence in the database.")),p;
	    }
	} 
	else {
	    print font({-color=>'FF0000'}, strong("This sequence is on the Crick strand and this is the coding sequence.")),p;
	}
    }

}

########################################################################
sub setTitle {
########################################################################

    my ($self) = @_;

    my %num2chr = ('1'=>'I', '2'=>'II', '3'=>'III', '4'=>'IV',
		   '5'=>'V', '6'=>'VI', '7'=>'VII', '8'=>'VIII',
		   '9'=>'IX', '10'=>'X', '11'=>'XI', '12'=>'XII',
		   '13'=>'XIII', '14'=>'XIV', '15'=>'XV', '16'=>'XVI',
		   '17'=>'Mito');


#    my $gcgDir = $configPath->DictyosteliumFtpPubDir."genome_seq/all_gcg/";
    
    
    if ($self->{'_beg'} > $self->{'_end'}) {
	$self->{'_strand'} = "crick";
        ($self->{'_beg'}, $self->{'_end'}) = 
	    ($self->{'_end'}, $self->{'_beg'});
    }
    else {
	$self->{'_strand'} = "watson";
    }
    if ($self->{'_chr'}) {
	if ($self->{'_chr'} == 17 || $self->{'_chr'} =~ /^Mt/i) {
	    $self->{'_subtitle'} = "Mitochondria";
	}
	else {
	    $self->{'_subtitle'} = "Chromosome ".$num2chr{$self->{'_chrnum'}};
	}
    }
    else {
	$self->{'_subtitle'} = $self->{'_showNm'};
	if ($self->{'_kind'} eq "gb") {
	    $self->{'_subtitle'} .= " (GB)";
	}
    }
#    if ($self->{'_chrnum'}) {
#	$self->{'_INFILE'} = $gcgDir."chr".$self->{'_chrnum'}.".gcg";
#    }
#    else { 
#	$self->{'_INFILE'} = "gb_sc:";
#    }
    if ($self->{'_map'} eq "rmap") { ### restriction map
	if ($self->{'_chr'}) {
	    $self->{'_title'} = "Restriction Map for a region of ".$self->{'_subtitle'};
        } 
	else {
	    $self->{'_title'} = "Restriction Map of ".$self->{'_subtitle'};
	}
    }
    elsif ( $self->{'_map'} eq "fmap") { ### restriction fragments
	if ($self->{'_chr'}) {
	    $self->{'_title'} = "Restriction Fragments for a region of ".$self->{'_subtitle'};
	} 
	else {
	    $self->{'_title'} = "Restriction Fragments for ".$self->{'_subtitle'};
	}
    }
    elsif ($self->{'_map'} eq "pmap" || 
	   $self->{'_map'} eq "p2map") { ### protein translation
	if ($self->{'_kind'} eq "gb" || 
	    $self->{'_kind'} eq "cds") { ### GenBank sequence title
	    $self->{'__title'} = "Protein Translation for ".$self->{'_subtitle'};
	} 
	else { ### chromosome region/segment title
	    $self->{'_title'} = "Protein Translation for a region of ".$self->{'_subtitle'};
	} 
    } 
    else { ### dna sequence (GCG/No header/FASTA format) 
	if ($self->{'_kind'} eq "gb") { ### GenBank sequence title
	    $self->{'_title'} = "Sequence for ".$self->{'_subtitle'};
	}
	else  { ### chromosome region/segment title
	    $self->{'_title'} = "Sequence for a region of ".$self->{'_subtitle'};
	} 
    }
	
    if ($self->{'_map'} !~ /^(a|r|f)/i) {
	$self->{'_rev'} = param('rev');
    }
    else {
	if ($self->{'_strand'} =~ /^c/i) {
	    if (param('rev')) {
		$self->{'_rev'} = "";
	    }
	    else {
		$self->{'_rev'} = "-REV";
	    }
	}
	else {
	   $self->{'_rev'} = param('rev');
        } 
    }
    
    ### Add flanking region 
    # Mira - do not add this
    #if (param('flankl') > 0 || param('flankr') > 0) {
#	$self->{'_beg'} -= param('flankl');
#	$self->{'_end'} += param('flankr');
#	if ($self->{'_beg'} <= 1) {
#	    $self->{'_beg'} = 1;
#	}
#    }
    ### o = open reading frames; n = no translation
    $self->{'_men'} = "-MEN=o";
}


########################################################################
sub setSeqType{
########################################################################
    my ($self) = @_;

    my $map = $self->{'_map'};

    my $seq_type;
    $seq_type = 'DNA coding sequence' if (($map eq 'nmap') ||
                                              ($map eq 'n2map') ||
                                              ($map eq 'n3map'));
    $seq_type = 'Protein' if (($map eq 'pmap') ||
                                  ($map eq 'p2map') ||
                                  ($map eq 'p3map'));
    $seq_type = 'Genomic DNA' if ((($map eq 'amap') &&
                                      (param('flankl')!=1000 ||
                                       param('flankr')!=1000)) ||
                                      (($map eq 'a2map') &&
                                      (param('flankl')!=1000 ||
                                       param('flankr')!=1000)) ||
                                      (($map eq 'a3map') &&
                                      (param('flankl')!=1000 ||
                                       param('flankr')!=1000)));
    $seq_type = 'Genomic DNA +/- 1000bp' if ((($map eq 'amap') &&
                                                 (param('flankl') == 1000 &&
                                                  param('flankr') == 1000)) ||
                                                 ((($map eq 'a2map') &&
                                                 (param('flankl') == 1000 &&
                                                  param('flankr') == 1000))) || 
                                                  ((($map eq 'a3map') &&
                                                 (param('flankl') == 1000 &&
                                                  param('flankr') == 1000))));

    $self->{'_seq_type'} = $seq_type;
}


########################################################################
sub setVariables {
########################################################################
    my ($self) = @_;

    my %num2chrdesc = ('1'=>'chromosome I',
		       '2'=>'chromosome II',
		       '3'=>'chromosome III',
		       '4'=>'chromosome IV',
		       '5'=>'chromosome V',
		       '6'=>'chromosome VI',
		       '7'=>'chromosome VII',
		       '8'=>'chromosome VIII',
		       '9'=>'chromosome IX',
		       '10'=>'chromosome X',
		       '11'=>'chromosome XI',
		       '12'=>'chromosome XII',
		       '13'=>'chromosome XIII',
		       '14'=>'chromosome XIV',
		       '15'=>'chromosome XV',
		       '16'=>'chromosome XVI',
		       '17'=>'mitochondria');


    $self->{'_query'} = uc($self->{'_query'});

    my $query = $self->{'_query'};

    &DeleteUnwantedChar(\$query);

    if ($query) {

	my $seqObj = SeqParamTranslator->new(dbh=>$dbh,
					     query=>$query);
	

	if ($seqObj->error) {
	    $self->err_report($seqObj->error);
	}
 
	$self->{'_kind'} = $seqObj->type;

	my $locusObj = $seqObj->locusObject;
	my $featObj = $seqObj->featureObject;

	if (!$featObj && $locusObj) {
	    $self->err_report("There is no feature_name associated with '$query' in database.");
	}
   
	if ($featObj) {
	    $self->{'_chrnum'} = $featObj->chromosome;
	    $self->{'_beg'} = $featObj->start_coord;
	    $self->{'_end'} = $featObj->stop_coord;
	    $self->{'_showNm'} = $featObj->feature_name;
	    $self->{'_seqname'} = $featObj->feature_name;
	    if ($featObj->locus_name) {
		$self->{'_showNm'} .= "/".$featObj->locus_name;
	    }
	}
	elsif ($self->{'_kind'} =~ /^clone/i) {
	    $self->{'_chrnum'} = $seqObj->chromosome;
	    $self->{'_beg'} = $seqObj->start_coord;
	    $self->{'_end'} = $seqObj->stop_coord;
	    $self->{'_showNm'} = $query;
	    $self->{'_seqname'} = $query;
	}
	elsif ($self->{'_kind'} =~ /^gb/i) {

	    my $gbSeqObj = $seqObj->genbankSeqObject;

	    $self->{'_seqname'} = $gbSeqObj->display_id();
	    $self->{'_showNm'} = $gbSeqObj->display_id();
	    $self->{'_gbSeq'} = $gbSeqObj->seq;
	    $self->{'_gbDesc'} = $gbSeqObj->desc();
	    $self->{'_gbMoltype'} = $gbSeqObj->moltype;
	    $self->{'_uid'} = $gbSeqObj->primary_id;
 
	}
    }
    elsif ($self->{'_chr'}) {
 
	if ($self->{'_beg'} =~ /^\-/ || $self->{'_end'} =~ /^\-/) {
	    $self->err_report("You should enter positive numbers for coordinates. Please go back, correct them and submit again. Thanks!");
	}

	my $chrObj = Chromosome->new(dbh=>$dbh,
				     chromosome=>$self->{'_chr'});

	if (!$chrObj) {
	    $self->err_report("The chromosome number = ".$self->{'_chr'}." is not found in database.");
	}
	if ($self->{'_beg'} >= $chrObj->physical_length) {
	    $self->err_report("The starting coordinate is larger than or equal to the chromosome size (".$chrObj->physical_length."). Please go back and enter a smaller number. Thanks!");
	}
	elsif ($self->{'_end'} > $chrObj->physical_length) {
	    $self->err_report("The ending coordinate is larger than the chromosome size (".$chrObj->physical_length."). Please go back and enter a smaller number. Thanks!");
	}
	$self->{'_chrnum'} = $self->{'_chr'};	
	if (!$self->{'_beg'} && !$self->{'_end'}) {
	    $self->{'_beg'} = 1;
	    $self->{'_end'} = 10000;
	}
	elsif (($self->{'_beg'} == 0 && $self->{'_end'} == 0) ||
	    $self->{'_beg'} == $self->{'_end'}) {

	    $self->err_report("The beginning and ending coordinates (nucleotide numbers) must be specified and be different values.");

	}
    }

    $self->{'_chrdesc'} = $num2chrdesc{$self->{'_chrnum'}};

}

########################################################################
sub err_report {
########################################################################
    my ($self, $err) = @_;

    &printStartPage($self->database, $self->title, $self->help);
   
    print b($err);
    
    &printEndPage;

    $dbh->disconnect;
    exit;
}


########################################################################
sub getChromosome {
########################################################################
  my ($self) = shift;

  my %chrHash =(
               1=>  'I',
               2 => 'II',
               3 => 'III',
               4 => 'IV',
               5 => 'V',
               6 => 'VI',
               7 => 'VII',
               8 => 'VIII',
               9 => 'IX',
               10 => 'X',
               11 => 'XI',
               12 => 'XII',
               13 => 'XIII',
               14 => 'XIV',
               15 => 'XV',
               16 => 'XVI',
               17 => 'Mito'
              );

  my $chromosome_no = $self->{'_chrnum'};

  return "Chromosome $chrHash{$chromosome_no} Sequence";

}

########################################################################
sub getCitation{
########################################################################
  my ($self) = @_;

  my $chromosome_no = $self->{'_chrnum'};
  
  my $refNoList = Reflink->GetRefNoListBYtabNmPrikeyPrikeycol(dbh=>$dbh, tab_name=>'CHROMOSOME', primary_key=>$chromosome_no, primary_key_col=>'CHROMOSOME');

  my $RefObj = Reference->new(dbh=>$dbh, reference_no=>$refNoList);

  my $citation = $RefObj->citation;

  return $citation;

}

########################################################################
sub getFASTAHeader{
########################################################################
  my ($self) = @_;

  my ($name, $chr, $reverse, $cut);

  $chr = $self->{'_chrnum'};

  if (!$chr) {
     $chr = $self->('_chr');
  }

  if ($self->{_rev} eq '-REV') {
     $reverse = " reverse complement";
  }

  if ((($self->{_map} =~ /^a/i)
       && (param('flankl')>0 || param('flankr')>0)
       && param('flankl')!=1000 &&  param('flankr')!=1000) 
       || (param('chr'))){

      $cut = "  from " . $self->{'_beg'} . " to " . $self->{'_end'} . " ";
  }


  return "$name Chr $chr $cut $reverse";
}


########################################################################
sub getSubsequence {
########################################################################
  my ($self) = @_;
 
  my ($description, $format, $citation, $chromosome);


  if (($self->{'_map'} !~ /3/) && ($self->{'_map'} !~ /2/)) {
     $format = "gcg";
     my $chromosome = $self->getChromosome;
     my $citation = $self->getCitation;

     $description = $chromosome . "\n" . $citation;
  } elsif ($self->{'_map'} =~ /3/) {
    $format = "fasta";
    $description = $self->getFASTAHeader;
  }

  my ($rev, $translate);

  if ($self->{_rev} eq '-REV') {
     $rev = 1;
  }

    #when protein requested and chromosome is selected
    # have to do protein transation...
    if (($self->{'_map'} =~ /^p/i) &&  ($self->{'_chr'})) {
       $translate = 1;
    }

  my $obj = Sequence->new(dbh => $dbh,
                          chrnum => $self->{'_chrnum'},
                          beg => $self->{'_beg'},
                          end => $self->{'_end'},
                          rev => $rev,
                          trans => $translate,
                          desc => $description,
                          display_id => $self->{'_seqname'});


  if (!$obj) {
     print br, "Chromosome for ", $self->{'_chrnum'}, 
               " not found in the database", br;
     return;
  }

  my $sequence = $obj->getSequence;



  if ($format eq 'gcg') {
     $sequence = $obj->gcgFormatedSequence;
  } elsif ($format eq 'fasta') {
     $sequence = $obj->fastaFormatedSequence;
  } else {
     $sequence = $obj->noheaderFormatedSequence;
  }

  print "<pre>";

  print $sequence;

  print "</pre>";


}


########################################################################
sub printDifferentFormat{
########################################################################
  my $self = shift;

  my $getSeqQueryline;

  if (param('chr')) {
     $getSeqQueryline = "chr=".$self->{'_chr'}.
                          "&beg=".$self->{'_beg'}.
                          "&end=".$self->{'_end'}.
                          "&rev=" . param('rev');
  } else { 
    $getSeqQueryline = "seq=".$self->{'_query'}."&flankl=" . param('flankl') . "&flankr=" . param('flankr') . "&rev=" . param('rev');
  }


  my $getSeqUrl = $configUrl->dictyBaseCGIRoot."$dblink/getSeq";

  print p;

  print "Other Formats Available: ";

  my $type = substr($self->{_map},0,1);
  if ($self->{_map} =~ /2/) {
 
     print a({-href=>$getSeqUrl."?map=" .$type ."map&".$getSeqQueryline},
                       "GCG")." | " .
           a({-href=>$getSeqUrl."?map=" . $type. "3map&".$getSeqQueryline},
                     "FASTA");
 
  }elsif ($self->{_map} =~ /3/) {
    print a({-href=>$getSeqUrl."?map=" .$type . "map&".$getSeqQueryline},
                       "GCG");
  } else {
    print a({-href=>$getSeqUrl."?map=" .$type ."3map&".$getSeqQueryline},
                     "FASTA");
  }


}
 

########################################################################
1; #####################################################################
########################################################################



















