#!/usr/bin/perl -w
use strict;

=pod

=head1 XON

                   ##      ##       ##
                    ##      ##       ##
                   ##      ##       ##
                  ##      ##       ## 
                 ##      ##       ##
                  ##      ##       ##   
    ##################################################
     ## ------------------------------------------ ######
     ## get_abstracts_and_titles.pl .............. ##   ###
     ## ------------------------------------------ ##     ###
     ## holt die Abstracts und Titel von PubMed .. ##      ###
     ## und lemmatisiert und taggt sie............ ##       ### 
     ## ------------------------------------------ ##       ### 
     ## author..: Jannik Stroetgen................ ##     ###
     ## email...: stroetge@cl.uni-heidelberg.de .. ##   ###
     ## started.: 18.05.2005...................... ##  ### 
     ## finished: 23.01.2006...................... #####
    ##################################################  
  ##### embedded documentation tool: pod ......... #####
##########################################################

=cut

=head1 NAME

    get_abstracts_and_titles.pl <pubmed-infile>

=cut

=head1 BESCHREIBUNG

    Dieses Sub nimmt die PubMed-Files und liest die Titel
    und Abstracts von den Artikeln ein. Jeder Artikel wird 
    getaggt, lemmatisiert und als .xon-Datei in dem Verzeichnis
    "tmpXon/" gespeichert.

=cut

=head2 Inputfile

    <PubmedArticle>
        <MedlineCitation Owner="NLM" Status="MEDLINE">
            <PMID>15974560</PMID>
                ...
                <ArticleTitle>A "one-day survey": as a reliable estimation of the potential recruitment for proton- and carbon- ion therapy in France.</ArticleTitle>
                ...
                    <AbstractText>To estimate the real figure of the potential patient recruitment for hadrontherapy we carried out a survey directly in 5 radiation therapy departments of the East of France as a "one-day survey". The results presented account for 77 cases of potential indications among 532 evaluated medical records.</AbstractText>
        ...
    </PubmedArticle>

=cut

=head2 Outputfile

    <Xeldaresults file="pubmed2004.xml">
    <doc id ="15974560">
    <l s="0" pos="#DET">a</l>
    <l s="1" pos="#PUNCT">"</l>
    <l s="2" pos="#ADJ#GUESSED">one-day</l>
    <l s="3" pos="#NOUN">survey</l>
    <l s="4" pos="#PUNCT">"</l>
    <l s="5" pos="#SENT">:</l>
    <l s="6" pos="#COSUB">as</l>
    <l s="7" pos="#DET">a</l>
    <l s="8" pos="#ADJ">reliable</l>
    <l s="9" pos="#NOUN">estimation</l>
    <l s="10" pos="#PREP">of</l>
    <l s="11" pos="#DET">the</l>
    <l s="12" pos="#ADJ">potential</l>
    <l s="13" pos="#NOUN">recruitment</l>
    <l s="14" pos="#PREP">for</l>
    <l s="15" pos="#ADJ#GUESSED">proton-</l>
    <l s="16" pos="#COORD">and</l>
    <l s="17" pos="#ADJ#GUESSED">carbon-</l>
    <l s="18" pos="#NOUN">ion</l>
    <l s="19" pos="#NOUN">therapy</l>
    <l s="20" pos="#PREP">in</l>
    <l s="21" pos="#PROP">France</l>
    <l s="22" pos="#SENT">.</l>
    ...

=cut

####################### <MAIN> ##########################
my $input = $ARGV[0]; # pubmed-2004clean.txt
die "\nArguments missing:\n\'perl $0 <Pubmed-File>\'\n" unless ($input);
my $infile = $input;
if ($input =~ m/\//){
    my @infile = split('/',$input);
    $infile = $infile[$#infile];
}
my $outDir1 = "tmpToTag";
system "mkdir $outDir1";
my $outDir2 = "$outDir1/getaggt";
system "mkdir $outDir2";
my $tmpXon = "tmpXon";
system "mkdir $tmpXon";
my $output = "$outDir1/$infile";
my $outname = $infile;
my $c = &get_abs_ttls($input,$output);
&tag_abs_ttls($c,$outDir1,$outDir2,$outname);
&create_xon($outDir2,$tmpXon,$infile);
system "rm -r $outDir1";
####################### </MAIN> #########################

####################### <SUBS> ##########################
########## <get_abs_ttls> ##########

=head2 sub get_abs_ttls

    @param    $input    Das Input-File (Das Pubmed-XML-File)
    @param    $output   Das (temp.) Output-File
    returned: $c        Hoechster Index der erstellten Dateien.

    Dieses Sub liest die Titel und Abstracts aus den Pubmed-
    Artikeln ($input) aus. Die Titel und Abstracts werden
    ausgegeben ($output). Der hoechste Index der erstellten
    Dateien wird zurueckgegeben. Die maximale Artikel-Anzahl
    je Datei betraegt 1000.

=cut

sub get_abs_ttls{
    my $in = shift;
    my $out = shift;
    my $counter =0;
    my $counter1=0;
    my $counter3=0;
    my $c=0;
    open I, $in or die "cannot open $in $!\n";
    open OUT, ">$out$c" or die "cannot open $out$c $!\n";
    $/ = "</PubmedArticle>";
    while (my $article = <I>){
	$counter++;
	$counter1++;
	print STDERR "\rprocessing Abstract - $counter1";
	my $id = $1 if ($article =~ /<PMID>(.*?)<\/PMID>/o);
	my $title = $1 if ($article =~ /<ArticleTitle>(.*?)<\/ArticleTitle>/o);
	my $abstract = $1 if ($article =~ /<AbstractText>(.*?)<\/AbstractText>/o);
	if ($id && ($title or $abstract)){
	    if ($counter < 1000){
		print OUT "<PMID>$id</PMID>.\n<title> $title </title>\n<abstracttext> $abstract </abstracttext>\n";
	    }
	    else{
		$counter3++;
		print STDERR "\r\t\t\t\t\t$counter3 files created";
		close OUT;
		$c++;
		open OUT, ">$out$c" or die "cannot open $out$c $!\n";
		print OUT "<PMID>$id</PMID>.\n<title> $title </title>\n<abstracttext> $abstract </abstracttext>\n";
		$counter=0;
	    }
	}
    }
    close I;
    close OUT;
    print STDERR "\rprocessed Abstracts -    $counter\n";
    return $c;
}
########## </get_abs_ttls> #########
########## <tag_abs_ttls> ##########

=head2 sub tag_abs_ttls

    @param   $c        hoechster Index der Input-Files
                       erstellt mit Sub get_abs_ttls
    @param   $outDir1  Verzeichnis mit Input-Files
    @param   $outDir2  hier werden die Output-Files gespeichert
    @param   $outname  Name der Output-Files (+Index $c)

    Dieses Sub taggt die Dateien des Input-Dirs ($outDir1) und 
    speichert die Ergebnisse in $outDir2. Der Name der Output-
    Files ist "$outname + $c + .ntg".

=cut

sub tag_abs_ttls{
    my $o     = shift;
    my $oDir1 = shift;
    my $oDir2 = shift;
    my $oname = shift;
    my $l;
    for ($l=0;$l<=$o;$l++){
	my $in2 = "$oDir1/$oname$l";
	print "\n\n$in2\n";
	my $out = $oDir2."/$oname$l.ntg";
	system "tag -l english $in2 > $out";
	my $tagged = $l+1;
	print STDERR "\n $tagged files tagged\n";
    }
}
########## </tag_abs_ttls> #########
########## <create_xon> ############

=head2 sub create_xon

    @param   $outDir2   Dir mit zu verarbeitenden Dateien
    @param   $tmpXon    Dir in dem Ergebnisse gespeichert werden
    @param   $infile    Name des Orginal-Input-Files

    Dieses Sub nimmt das getaggte File (von tag_abs_ttls) von dem
    Parameter $outDir2 und erstellt die .xon-Files, die in dem 
    Parameter Dir $tmpXon gespeichert werden. Die Struktur der 
    .xon-Files wurde weiter oben beschrieben (Outputfile).

=cut

sub create_xon{
    my $oDir2 = shift;
    my $xon   = shift;
    my $ifile = shift;
    opendir DIR, "$oDir2" or die "nope $oDir2 $!\n";
    my @input = readdir DIR;
    my $counter2 =0;
    foreach my $in (@input){
	if ($in=~ m/\.ntg/o){
	    open OUT, ">$xon/$in.xon" or die "cannot open $xon/$in.xon $!\n";
	    if ($in =~ m/\.ntg/o){
		open I, "$oDir2/$in" or die "cannot open $oDir2$in $!\n";
		$/ = "\n";
		my $title1 = "";
		my $abstract1 = "";
		print OUT "<Xeldaresults file=\"$ifile\">\n";
		my $t1 = 0;
		my $t2 = 0;
		my $i =0;
		while (my $line = <I>){
		    if ($line =~ /<PMID>(.*?)<\/PMID>\t/o){
			my $id1 = $1;
			print STDERR "\rcreating .xon - $counter2";
			print OUT "<doc id =\"$id1\">\n";
			$counter2++;
		    }
		    elsif ($line =~ /<title>\t<title>\t/o){
			$t1 = 1;   
		    }
		    elsif($line =~ /<abstracttext.\t<abstracttext>\t/o){
			$t2 = 1;
		    }
		    elsif ($t2 == 1){
			if ($line =~ /<\/abstracttext>\t<\/abstracttext>\t/o){
			    $t2 = 0;
			    print OUT $abstract1;
			    $abstract1 = "";
			    $i = 0;
			    print OUT "</doc>\n";
			}else{
			    if ($line =~ /\t(.*?)\t(.*?)\n/o){
				my $lemma1 = $1;
				my $tag1 = $2;
				$abstract1 .= "<l s=\"$i\" pos=\"$tag1\">$lemma1</l>\n";
				$i++;
			    }
			}
		    }
		    elsif ($t1 == 1){
			if ($line =~ /<\/title>\t<\/title>\t/o){
			    $t1 = 0;
			    print OUT $title1;
			    $title1 = "";
			}
			else{
			    if ($line =~ /\t(.*?)\t(.*?)\n/o){
				my $lemma = $1;
				my $tag = $2;
				$title1 .= "<l s=\"$i\" pos=\"$tag\">$lemma</l>\n";
				$i++;
			    }
			}
		    }
		}
		close I;
	    }
	    print OUT "</Xeldaresults>";
	    close OUT;
	}
    }
    closedir DIR;
    print STDERR "\rcreated .xon for $counter2 abstracts\n";
}
########## </create_xon> ###########
####################### </SUBS> #########################
