--- loncom/homework/convertjme.pl 2003/10/20 16:25:33 1.8 +++ loncom/homework/convertjme.pl 2011/07/04 09:24:54 1.16 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # Dynamically converts JME strings into either a png or ps file. # -# $Id: convertjme.pl,v 1.8 2003/10/20 16:25:33 albertel Exp $ +# $Id: convertjme.pl,v 1.16 2011/07/04 09:24:54 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,8 +34,8 @@ use strict; ### For standalone operation, set $loncapa to 0, and comment out both uses my $loncapa=1; use lib '/home/httpd/lib/perl'; -use LONCAPA::loncgi(); - +use LONCAPA::loncgi; +use LONCAPA; use GD; use PostScript::Simple; @@ -66,13 +66,13 @@ sub unescape { my ($id,$width,$ps,$png,@JMEstring); if ($loncapa) { $id=$ENV{'QUERY_STRING'}; - $width = $ENV{'cgi.'.$id.'.WIDTH'}; + $width = $Apache::lonnet::env{'cgi.'.$id.'.WIDTH'}; if (!$width) { $width = 400; } - $png = $ENV{'cgi.'.$id.'.PNG'}; - $ps = $ENV{'cgi.'.$id.'.PS'}; - @JMEstring=&unescape($ENV{'cgi.'.$id.'.JME'}); + $png = $Apache::lonnet::env{'cgi.'.$id.'.PNG'}; + $ps = $Apache::lonnet::env{'cgi.'.$id.'.PS'}; + @JMEstring=&unescape($Apache::lonnet::env{'cgi.'.$id.'.JME'}); } else { - my @JMEstring = @ARGV; + @JMEstring = @ARGV; $width = shift @JMEstring; $png = 1; $ps = 1; @@ -86,7 +86,6 @@ my @modulator_structs=split(/\|/,$modula my @product_structs=split(/\|/,$products); - my @all_structs=(@reactant_structs,@modulator_structs,@product_structs); #get size of image and initialize image and globals @@ -136,9 +135,9 @@ if ($png) { units => "cm"); } -my %valence = ("C",4,"N",3,"P",3,"O",2,"S",2); +my %electrons = ("C",4,"N",5,"P",5,"O",6,"S",6); my %font_width = (" ",250,"+",564,"-",500,"0",500,"1",500,"2",500,"3",500,"4",500,"5",500,"6",500,"7",500,"8",500,"9",500,"A",722,"B",667,"C",667,"D",722,"E",611,"F",556,"G",722,"H",722,"I",333,"J",389,"K",722,"L",611,"M",889,"N",722,"O",722,"P",556,"Q",722,"R",667,"S",556,"T",611,"U",722,"V",722,"W",944,"X",722,"Y",722,"Z",611,"a",444,"b",500,"c",444,"d",500,"e",444,"f",333,"g",500,"h",500,"i",278,"j",278,"k",500,"l",278,"m",778,"n",500,"o",500,"p",500,"q",500,"r",333,"s",389,"t",278,"u",500,"v",500,"w",722,"x",500,"y",500,"z",444); -my $font = '/usr/share/fonts/default/Type1/n021003l.pfb'; +my $font = '/home/httpd/html/adm/fonts/DejaVuSerif-Roman.ttf'; my $pointsize = 20; my ($ptsize,@bounds); if ($png) { @@ -200,6 +199,7 @@ foreach my $struct (@all_structs) { my @adjacent = map {0} 0..$natoms-1; my @bondsx = map {0} 0..$natoms-1; my @bondsy = map {0} 0..$natoms-1; + my @aldehyde = map {0} 0..$natoms-1; for (my $i = 0; $i < $nbonds; $i++) { $bonds[$atomA[$i]] += ($bondType[$i]>0) ? $bondType[$i] : 1; $bonds[$atomB[$i]] += ($bondType[$i]>0) ? $bondType[$i] : 1; @@ -211,8 +211,15 @@ foreach my $struct (@all_structs) { $bondsy[$atomA[$i]] += $y[$atomB[$i]] - $y[$atomA[$i]]; $bondsx[$atomB[$i]] += $x[$atomA[$i]] - $x[$atomB[$i]]; $bondsy[$atomB[$i]] += $y[$atomA[$i]] - $y[$atomB[$i]]; + + if ( @bondType[$i] == 2) { + @aldehyde[@atomA[$i]] ++ if (@name[@atomB[$i]] eq "O"); + @aldehyde[@atomB[$i]] ++ if (@name[@atomA[$i]] eq "O"); + } + } + # Draw bonds for (my $i = 0; $i < $nbonds; $i++) { my $xa = $x[$atomA[$i]]; @@ -268,7 +275,8 @@ foreach my $struct (@all_structs) { } elsif ($bondType[$i] == 2 && (($adjacent[$atomA[$i]] == 1 && $adjacent[$atomB[$i]] > 2)|| - ($adjacent[$atomB[$i]] == 1 && $adjacent[$atomA[$i]] > 2))) { + ($adjacent[$atomB[$i]] == 1 && $adjacent[$atomA[$i]] > 2)|| + @name[@atomA[$i]] eq "O" || @name[@atomB[$i]] eq "O")) { # centered bond my $xperp = $doubleWidth*$sina; my $yperp = $doubleWidth*$cosa; @@ -322,20 +330,19 @@ foreach my $struct (@all_structs) { for (my $i = 0; $i < $natoms; $i++) { my ($formula,$sign,$charge) = ($name[$i] =~ /(\w+)([\+|\-])?(\d)?/); - if ($png) { - $sign = "–" if ($sign eq "-"); # replace by n-dash - } if ($formula ne "C" || $sign ne ""|| - $adjacent[$i] < 2 || ($adjacent[$i] == 2 && $bonds[$i] == 4)) { + $adjacent[$i] < 2 || ($adjacent[$i] == 2 && $bonds[$i] == 4) || (@aldehyde[$i] == 1 && @bonds[$i] == 3)) { # don't show C, unless charged, terminal, or linear - my $nH = 0; - if (exists $valence{$formula}) { - $nH = $valence{$formula} - $bonds[$i]; - $nH += (($charge eq "")? 1 : $charge) if ($sign eq "+"); - $nH -= (($charge eq "")? 1 : $charge) if ($sign eq "-"); + if (exists $electrons{$formula}) { + # add H atoms to satisfy minimum valence + my $e = $electrons{$formula}; + $e -= (($charge eq "")? 1 : $charge) if ($sign eq "+"); + $e += (($charge eq "")? 1 : $charge) if ($sign eq "-"); + my $valence = 4 - abs($e-4); + my $nH = $valence - @bonds[$i]; + $formula .= "H" if ($nH > 0); + $formula .= $nH if ($nH > 1); } - $formula .= "H" if ($nH > 0); - $formula .= $nH if ($nH > 1); my @formula = $formula=~ /[A-Z][a-z]?\d*/g; my $PI = 3.1415; @@ -389,7 +396,7 @@ foreach my $struct (@all_structs) { (shift @formula) =~ /([A-Z][a-z]?)(\d*)/; my $carrige = $x[$i]-stringWidth($1)/2; $carrige = printElement ($1,$2,$carrige,$y[$i]); - my $y = (@formula > 0) ? $y[$i] + fm2cm(800) : $y[$i]; + my $y = (@formula > 0) ? $y[$i] + fm2cm(900) : $y[$i]; $carrige = (@formula > 0) ? $x[$i]-stringWidth($1)/2 : $carrige; foreach (@formula) { @@ -402,7 +409,7 @@ foreach my $struct (@all_structs) { (shift @formula) =~ /([A-Z][a-z]?)(\d*)/; my $carrige = $x[$i]-stringWidth($1)/2; $carrige = printElement ($1,$2,$carrige,$y[$i]); - my $y = (@formula > 0) ? $y[$i] + fm2cm(-800) : $y[$i]; + my $y = (@formula > 0) ? $y[$i] + fm2cm(-900) : $y[$i]; $carrige = (@formula > 0) ? $x[$i]-stringWidth($1)/2 : $carrige; foreach (@formula) { @@ -424,7 +431,7 @@ if ($loncapa) { print "Content-type: image/png\n\n"; print $im->png; } elsif ($ps) { - my $psfile = "/home/httpd/perl/tmp/".$id.'.eps'; + my $psfile = LONCAPA::tempdir().$id.'.eps'; $im->output($psfile); print "Content-type: text/html\n\n"; print (<