version 1.44, 2003/03/26 17:03:41
|
version 1.48, 2003/03/28 15:20:59
|
Line 26
|
Line 26
|
# |
# |
# (Navigate problems for statistical reports |
# (Navigate problems for statistical reports |
# |
# |
### |
############################################### |
|
############################################### |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
lonproblemstatistics |
|
|
|
=head1 SYNOPSIS |
|
|
|
Routines to present problem statistics to instructors via tables, |
|
Excel files, and plots. |
|
|
|
=over 4 |
|
|
|
=cut |
|
|
|
############################################### |
|
############################################### |
|
|
package Apache::lonproblemstatistics; |
package Apache::lonproblemstatistics; |
|
|
Line 37 use Apache::loncoursedata;
|
Line 56 use Apache::loncoursedata;
|
use Apache::lonstatistics; |
use Apache::lonstatistics; |
use Spreadsheet::WriteExcel; |
use Spreadsheet::WriteExcel; |
|
|
####################################################### |
############################################### |
####################################################### |
############################################### |
|
|
|
=pod |
|
|
|
=item &CreateInterface() |
|
|
|
Create the main intereface for the statistics page. Allows the user to |
|
select sections, maps, and output. |
|
|
|
=cut |
|
|
|
############################################### |
|
############################################### |
sub CreateInterface { |
sub CreateInterface { |
my $Str = ''; |
my $Str = ''; |
$Str .= '<table cellspacing="5">'."\n"; |
$Str .= '<table cellspacing="5">'."\n"; |
Line 77 sub CreateInterface {
|
Line 107 sub CreateInterface {
|
|
|
=item &CreateAndParseOutputSelector() |
=item &CreateAndParseOutputSelector() |
|
|
|
Construct a selection list of options for output and parse output selections. |
|
The current output selected is indicated by the values of the two package |
|
variables $output_mode and $show. @OutputOptions holds the descriptions of |
|
the output options and the values for $output_mode and $show. |
|
|
|
Based on code from lonstudentassessment.pm. |
|
|
=cut |
=cut |
|
|
####################################################### |
####################################################### |
Line 135 sub OutputDescriptions {
|
Line 172 sub OutputDescriptions {
|
|
|
sub CreateAndParseOutputSelector { |
sub CreateAndParseOutputSelector { |
my $Str = ''; |
my $Str = ''; |
my $elementname = 'outputmode'; |
my $elementname = 'statsoutputmode'; |
# |
# |
# Format for output options is 'mode, restrictions'; |
# Format for output options is 'mode, restrictions'; |
my $selected = 'html, with links'; |
my $selected = 'HTML problem statistics grouped'; |
if (exists($ENV{'form.'.$elementname})) { |
if (exists($ENV{'form.'.$elementname})) { |
if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) { |
if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) { |
$selected = $ENV{'form.'.$elementname}->[0]; |
$selected = $ENV{'form.'.$elementname}->[0]; |
Line 170 sub CreateAndParseOutputSelector {
|
Line 207 sub CreateAndParseOutputSelector {
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
|
=pod |
|
|
|
=item &Gather_Student_Data() |
|
|
|
Ensures all student data is up to date. |
|
|
|
=cut |
|
|
############################################### |
############################################### |
############################################### |
############################################### |
sub Gather_Student_Data { |
sub Gather_Student_Data { |
Line 200 sub Gather_Student_Data {
|
Line 245 sub Gather_Student_Data {
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
|
=pod |
|
|
|
=item &BuildProblemStatisticsPage() |
|
|
|
Main interface to problem statistics. |
|
|
|
=cut |
|
|
############################################### |
############################################### |
############################################### |
############################################### |
sub BuildProblemStatisticsPage { |
sub BuildProblemStatisticsPage { |
Line 213 sub BuildProblemStatisticsPage {
|
Line 266 sub BuildProblemStatisticsPage {
|
$r->print('<input type="hidden" name="sortby" value="'.$ENV{'form.sortby'}. |
$r->print('<input type="hidden" name="sortby" value="'.$ENV{'form.sortby'}. |
'" />'); |
'" />'); |
if (! exists($ENV{'form.statsfirstcall'})) { |
if (! exists($ENV{'form.statsfirstcall'})) { |
|
$r->print(<<ENDMSG); |
|
<p> |
|
<font size="+1"> |
|
Please make your selections in the boxes above and hit |
|
the button marked "Update Display". |
|
</font> |
|
</p> |
|
ENDMSG |
return; |
return; |
} |
} |
# |
# |
Line 233 sub BuildProblemStatisticsPage {
|
Line 294 sub BuildProblemStatisticsPage {
|
} elsif ($output_mode eq 'excel') { |
} elsif ($output_mode eq 'excel') { |
$r->print("<h2>Preparing Excel Spreadsheet</h2>"); |
$r->print("<h2>Preparing Excel Spreadsheet</h2>"); |
&output_excel($r); |
&output_excel($r); |
|
} elsif ($output_mode eq 'plot') { |
|
if ($show eq 'deg of diff') { |
|
&plot_statistics($r,'DoDiff'); |
|
} elsif ($show eq 'per wrong') { |
|
&plot_statistics($r,'%Wrng'); |
|
} |
} else { |
} else { |
$r->print("<h1>Not implemented</h1>"); |
$r->print("<h1>Not implemented</h1>"); |
} |
} |
Line 242 sub BuildProblemStatisticsPage {
|
Line 309 sub BuildProblemStatisticsPage {
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
|
=pod |
|
|
|
=item &output_html_grouped_by_sequence() |
|
|
|
Presents the statistics data as an html table organized by the order |
|
the assessments appear in the course. |
|
|
|
=cut |
|
|
############################################### |
############################################### |
############################################### |
############################################### |
sub output_html_grouped_by_sequence { |
sub output_html_grouped_by_sequence { |
my ($r) = @_; |
my ($r) = @_; |
|
my $problem_num = 0; |
#$r->print(&ProblemStatisticsLegend()); |
#$r->print(&ProblemStatisticsLegend()); |
my @Header = ("Title","Part","#Stdnts","Tries","Mod", |
my @Header = ("Title","Part","#Stdnts","Tries","Mod", |
"Mean","#YES","#yes","%Wrng","DoDiff", |
"Mean","#YES","#yes","%Wrng","DoDiff", |
"S.D.","Skew.");#,"D.F.1st","D.F.2nd"); |
"S.D.","Skew.");#,"D.F.1st","D.F.2nd"); |
# #FFFFE6 #EEFFCC #DDFFFF FFDDDD #DDFFDD #FFDDFF |
# #FFFFE6 #EEFFCC #DDFFFF FFDDDD #DDFFDD #FFDDFF |
foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) { |
foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) { |
my $show_part = 0; |
|
next if ($sequence->{'num_assess'}<1); |
next if ($sequence->{'num_assess'}<1); |
$r->print("<h3>".$sequence->{'title'}."</h3>"); |
$r->print("<h3>".$sequence->{'title'}."</h3>"); |
$r->print('<table border="0"><tr><td bgcolor="#777777">'."\n"); |
$r->print('<table border="0"><tr><td bgcolor="#777777">'."\n"); |
Line 262 sub output_html_grouped_by_sequence {
|
Line 338 sub output_html_grouped_by_sequence {
|
foreach my $resource (@{$sequence->{'contents'}}) { |
foreach my $resource (@{$sequence->{'contents'}}) { |
next if ($resource->{'type'} ne 'assessment'); |
next if ($resource->{'type'} ne 'assessment'); |
foreach my $part (@{$resource->{'parts'}}) { |
foreach my $part (@{$resource->{'parts'}}) { |
|
$problem_num++; |
my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD, |
my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD, |
$SKEW) = &Apache::loncoursedata::get_problem_statistics |
$SKEW) = &get_statistics($resource->{'symb'},$part); |
(undef,$resource->{'symb'},$part, |
|
$ENV{'request.course.id'}); |
|
# |
# |
$show_part = 1 if ($part ne '0'); |
|
$part = ' ' if ($part == 0); |
$part = ' ' if ($part == 0); |
# |
# |
my $wrongpercent = 0; |
my $wrongpercent = 0; |
if (defined($num) && $num > 0) { |
if (defined($num) && $num > 0) { |
$wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10; |
$wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10; |
} |
} |
|
my $option = ''; |
$r->print('<tr>'.&statistics_html_table_data |
$r->print('<tr>'.&statistics_html_table_data |
($resource,$part,$num,$tries,$mod,$mean,$Solved, |
($resource,$part,$num,$tries,$mod,$mean,$Solved, |
$solved,$wrongpercent,$DegOfDiff,$STD,$SKEW, |
$solved,$wrongpercent,$DegOfDiff,$STD,$SKEW, |
$show_part). |
$option). |
"</tr>\n"); |
"</tr>\n"); |
} |
} |
} |
} |
Line 292 sub output_html_grouped_by_sequence {
|
Line 367 sub output_html_grouped_by_sequence {
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
|
=pod |
|
|
|
=item &output_html_ungrouped() |
|
|
|
Presents the statistics data in a single html table which can be sorted by |
|
different columns. |
|
|
|
=cut |
|
|
############################################### |
############################################### |
############################################### |
############################################### |
sub output_html_ungrouped { |
sub output_html_ungrouped { |
my ($r) = @_; |
my ($r,$option) = @_; |
# |
# |
|
my $problem_num = 0; |
my $show_container = 0; |
my $show_container = 0; |
my $show_part = 0; |
my $show_part = 0; |
#$r->print(&ProblemStatisticsLegend()); |
#$r->print(&ProblemStatisticsLegend()); |
Line 313 sub output_html_ungrouped {
|
Line 398 sub output_html_ungrouped {
|
if (! defined($sortby) || $sortby eq '') { |
if (! defined($sortby) || $sortby eq '') { |
$sortby = 'Container'; |
$sortby = 'Container'; |
} |
} |
# #FFFFE6 #EEFFCC #DDFFFF FFDDDD #DDFFDD #FFDDFF |
# If there is more than one sequence, list their titles |
my @Sequences = &Apache::lonstatistics::Sequences_with_Assess(); |
my @Sequences = &Apache::lonstatistics::Sequences_with_Assess(); |
if (@Sequences > 1) { |
if (@Sequences > 1) { |
unshift(@Header,"Container"); |
unshift(@Header,"Container"); |
$show_container = 1; |
$show_container = 1; |
} |
} |
|
# |
|
# If the option for showing the problem number is needed, push that |
|
# on the list too |
|
if (defined($option) && $option =~ /show probnum/) { |
|
unshift(@Header,"P#"); |
|
} |
# |
# |
$r->print('<table border="0"><tr><td bgcolor="#777777">'."\n"); |
$r->print('<table border="0"><tr><td bgcolor="#777777">'."\n"); |
$r->rflush(); |
$r->rflush(); |
Line 330 sub output_html_ungrouped {
|
Line 421 sub output_html_ungrouped {
|
foreach my $resource (@{$sequence->{'contents'}}) { |
foreach my $resource (@{$sequence->{'contents'}}) { |
next if ($resource->{'type'} ne 'assessment'); |
next if ($resource->{'type'} ne 'assessment'); |
foreach my $part (@{$resource->{'parts'}}) { |
foreach my $part (@{$resource->{'parts'}}) { |
|
$problem_num++; |
my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD, |
my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD, |
$SKEW) = &Apache::loncoursedata::get_problem_statistics |
$SKEW) = &get_statistics($resource->{'symb'},$part); |
(undef,$resource->{'symb'},$part, |
|
$ENV{'request.course.id'}); |
|
# |
# |
$show_part = 1 if ($part ne '0'); |
$show_part = 1 if ($part ne '0'); |
$part = ' ' if ($part == 0); |
$part = ' ' if ($part == 0); |
Line 357 sub output_html_ungrouped {
|
Line 447 sub output_html_ungrouped {
|
'DoDiff' => $DegOfDiff, |
'DoDiff' => $DegOfDiff, |
'S.D.' => $STD, |
'S.D.' => $STD, |
'Skew' => $SKEW, |
'Skew' => $SKEW, |
|
'problem_num' => $problem_num, |
}); |
}); |
} |
} |
} |
} |
Line 368 sub output_html_ungrouped {
|
Line 459 sub output_html_ungrouped {
|
foreach (@Header) { |
foreach (@Header) { |
next if ($_ eq 'Part' && !$show_part); |
next if ($_ eq 'Part' && !$show_part); |
# Do not allow sorting on some fields |
# Do not allow sorting on some fields |
if ($_ eq $sortby || /^(Part)$/) { |
if ($_ eq $sortby || /^(Part|P\#)$/) { |
$Str .= '<th>'.$_.'</th>'; |
$Str .= '<th>'.$_.'</th>'; |
} else { |
} else { |
$Str .= '<th>'. |
$Str .= '<th>'. |
Line 417 sub output_html_ungrouped {
|
Line 508 sub output_html_ungrouped {
|
} @Statsarray; |
} @Statsarray; |
} |
} |
} |
} |
|
$option .= ',no part' if (! $show_part); |
foreach my $row (@OutputOrder) { |
foreach my $row (@OutputOrder) { |
$r->print('<tr>'); |
$r->print('<tr>'); |
|
if (defined($option) && $option =~ /show probnum/) { |
|
$r->print('<td bgcolor="#FFFFE6">'.$row->{'problem_num'}.'</td>'); |
|
} |
if ($show_container) { |
if ($show_container) { |
$r->print('<td bgcolor="#FFFFE6">' |
$r->print('<td bgcolor="#FFFFE6">' |
.$row->{'sequence'}->{'title'}.'</td>'); |
.$row->{'sequence'}->{'title'}.'</td>'); |
} |
} |
$r->print(&stats_row_from_hash($row,$show_part)); |
$r->print(&statistics_html_table_data |
|
($row->{'resource'},$row->{'Part'},$row->{'#Stdnts'}, |
|
$row->{'Tries'},$row->{'Mod'},$row->{'Mean'}, |
|
$row->{'#YES'},$row->{'#yes'},$row->{"\%Wrng"}, |
|
$row->{'DoDiff'},$row->{'S.D.'},$row->{'Skew'}, |
|
$option)); |
$r->print("</tr>\n"); |
$r->print("</tr>\n"); |
} |
} |
$r->print("</table>\n"); |
$r->print("</table>\n"); |
Line 433 sub output_html_ungrouped {
|
Line 533 sub output_html_ungrouped {
|
return; |
return; |
} |
} |
|
|
sub stats_row_from_hash { |
|
my ($data,$show_part) = @_; |
|
return &statistics_html_table_data($data->{'resource'},$data->{'Part'}, |
|
$data->{'#Stdnts'}, $data->{'Tries'}, |
|
$data->{'Mod'}, $data->{'Mean'}, |
|
$data->{'#YES'}, $data->{'#yes'}, |
|
$data->{"\%Wrng"}, $data->{'DoDiff'}, |
|
$data->{'S.D.'}, $data->{'Skew'}, |
|
$show_part); |
|
} |
|
|
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
|
=pod |
|
|
|
=item &output_excel() |
|
|
|
Presents the statistical data in an Excel 95 compatable spreadsheet file. |
|
|
|
=cut |
|
|
############################################### |
############################################### |
############################################### |
############################################### |
sub output_excel { |
sub output_excel { |
Line 535 sub output_excel {
|
Line 632 sub output_excel {
|
foreach my $part (@{$resource->{'parts'}}) { |
foreach my $part (@{$resource->{'parts'}}) { |
$cols_output=0; |
$cols_output=0; |
my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD, |
my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD, |
$SKEW) = &Apache::loncoursedata::get_problem_statistics |
$SKEW) = &get_statistics($resource->{'symb'},$part); |
(undef,$resource->{'symb'},$part, |
|
$ENV{'request.course.id'}); |
|
# |
# |
if (!defined($part) || $part eq '') { |
if (!defined($part) || $part eq '') { |
$part = ' '; |
$part = ' '; |
Line 565 sub output_excel {
|
Line 660 sub output_excel {
|
return; |
return; |
} |
} |
|
|
|
############################################### |
|
############################################### |
|
|
|
=pod |
|
|
|
=item &statistics_html_table_data() |
|
|
|
Help function used to format the rows for HTML table output. |
|
|
|
=cut |
|
|
|
############################################### |
|
############################################### |
sub statistics_html_table_data { |
sub statistics_html_table_data { |
my ($resource,$part,$num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent, |
my ($resource,$part,$num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent, |
$DegOfDiff,$STD,$SKEW,$show_part) = @_; |
$DegOfDiff,$STD,$SKEW,$options) = @_; |
my $row = ''; |
my $row = ''; |
$row .= '<td bgcolor="#FFFFE6">'. |
$row .= '<td bgcolor="#FFFFE6">'. |
'<a href="'.$resource->{'src'}.'" target="_blank" >'. |
'<a href="'.$resource->{'src'}.'" target="_blank" >'. |
$resource->{'title'}.'</a>'. |
$resource->{'title'}.'</a>'. |
'</td>'; |
'</td>'; |
$row .= '<td bgcolor="#FFFFE6">'.$part.'</td>' if ($show_part); |
$row .= '<td bgcolor="#FFFFE6">'.$part.'</td>' if ($options !~ /no part/); |
foreach ($num,$tries) { |
foreach ($num,$tries) { |
$row .= '<td bgcolor="#EEFFCC" align="right">'.$_.'</td>'; |
$row .= '<td bgcolor="#EEFFCC" align="right">'.$_.'</td>'; |
} |
} |
foreach ($mod,$mean) { |
foreach ($mod) { |
|
$row .= '<td bgcolor="#DDFFFF" align="right">'.$_.'</td>'; |
|
} |
|
foreach ($mean) { |
$row .= '<td bgcolor="#DDFFFF" align="right">'. |
$row .= '<td bgcolor="#DDFFFF" align="right">'. |
sprintf("%5.2f",$_).'</td>'; |
sprintf("%5.2f",$_).'</td>'; |
} |
} |
Line 597 sub statistics_html_table_data {
|
Line 706 sub statistics_html_table_data {
|
return $row; |
return $row; |
} |
} |
|
|
|
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
sub BuildGraphicChart { |
=pod |
my ($graph,$cacheDB,$courseDescription,$students,$courseID,$r,$c)=@_; |
|
my %cache; |
=item &plot_statistics() |
my $max; |
|
my $title = ''; |
=cut |
if($graph eq 'DoDiffGraph') { |
|
$title = 'Degree-of-Difficulty'; |
############################################### |
} else { |
############################################### |
$title = 'Wrong-Percentage'; |
sub plot_statistics { |
} |
my ($r,$datafield) = @_; |
my $currentSequence = -1; |
my @Data; |
my $sortProblems = 'Sort Within Sequence'; |
# |
my ($result, $orderedProblems) = |
my %Fields = ('#Stdnts'=> 0, |
&InitializeProblemStatistics($cacheDB, $students, $courseID, $c, $r); |
'Tries' => 1, |
if($result ne 'OK') { |
'Mod' => 2, |
return; |
'Mean' => 3, |
|
'#YES' => 4, |
|
'#yes' => 5, |
|
'%Wrng' => 9, |
|
'DoDiff' => 6, |
|
'S.D.' => 7, |
|
'Skew' => 8,); |
|
# |
|
my $field = '%Wrng'; |
|
foreach (keys(%Fields)) { |
|
$field = $_ if ($datafield eq $_); |
} |
} |
my @values = (); |
my $fieldindex = $Fields{$field}; |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
# |
return 'Unable to tie database.7'; |
my $Max = 0; |
} |
foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) { |
foreach(@$orderedProblems) { |
next if ($sequence->{'num_assess'}<1); |
my ($sequence,$problem,$part)=split(':', $_); |
foreach my $resource (@{$sequence->{'contents'}}) { |
if($cache{'StatisticsMaps'} ne 'All Maps' && |
next if ($resource->{'type'} ne 'assessment'); |
$cache{'StatisticsMaps'} ne $cache{$sequence.':title'}) { |
foreach my $part (@{$resource->{'parts'}}) { |
next; |
my @Results= &get_statistics($resource->{'symb'},$part); |
} |
my ($num,$Solved,$solved) = @Results[0,4,5]; |
if( $currentSequence == -1 || |
my $wrongpercent = 0; |
($sortProblems eq 'Sort Within Sequence' && |
if (defined($num) && $num > 0) { |
$currentSequence != $sequence)) { |
$wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10; |
if($currentSequence != -1) { |
} |
&DrawGraph(\@values,$courseDescription,$title,$max,$r); |
push (@Results,$wrongpercent); |
} |
my $data = $Results[$fieldindex]; |
if($sortProblems eq 'Sort Within Sequence') { |
$data = 0 if ($data eq 'nan'); |
$r->print('<br><b>'.$cache{$sequence.':title'}.'</b>'."\n"); |
$Max = $data if ($Max<$data); |
|
push (@Data,$data); |
} |
} |
$currentSequence = $sequence; |
|
@values = (); |
|
$max=0; |
|
} |
|
my $data = 0; |
|
if($graph eq 'DoDiffGraph') { |
|
$data = sprintf("%.2f", $cache{$_.':degreeOfDifficulty'}), |
|
} else { |
|
$data = sprintf("%.1f", $cache{$_.':percentWrong'}), |
|
} |
} |
if($max < $data) { |
} |
$max = $data; |
# |
|
# Print out plot request |
|
my $title = 'Percent Wrong'; |
|
if ($field eq 'DoDiff') { |
|
$title = 'Degree of Difficulty'; |
|
} |
|
my $yaxis = 'Percent'; |
|
if ($field eq 'DoDiff') { |
|
$yaxis = ''; |
|
} elsif ($field ne '%Wrng') { |
|
$yaxis = ''; |
|
} |
|
# |
|
# Determine appropriate value for $Max |
|
if ($field eq 'DoDiff') { |
|
if ($Max > 0.5) { |
|
$Max = 1; |
|
} elsif ($Max > 0.2) { |
|
$Max = 0.5; |
|
} elsif ($Max > 0.1) { |
|
$Max = 0.2; |
|
} |
|
} elsif ($field eq '%Wrng') { |
|
if ($Max > 50) { |
|
$Max = 100; |
|
} elsif ($Max > 25) { |
|
$Max = 50; |
|
} elsif ($Max > 20) { |
|
$Max = 25; |
|
} elsif ($Max > 10) { |
|
$Max = 20; |
|
} elsif ($Max > 5) { |
|
$Max = 10; |
|
} else { |
|
$Max = 5; |
} |
} |
push(@values, $data); |
|
} |
} |
untie(%cache); |
|
&DrawGraph(\@values,$courseDescription,$title,$max,$r); |
$r->print("<p>".&DrawGraph(\@Data,$title,'Problem Number',$yaxis, |
|
$Max)."</p>\n"); |
|
# |
|
# Print out the data |
|
$ENV{'form.sortby'} = 'Contents'; |
|
&output_html_ungrouped($r,'show probnum'); |
return; |
return; |
} |
} |
|
|
|
############################################### |
|
############################################### |
|
|
|
=pod |
|
|
|
=item &DrawGraph() |
|
|
|
=cut |
|
|
|
############################################### |
|
############################################### |
sub DrawGraph { |
sub DrawGraph { |
my ($values,$courseDescription,$title,$Max,$r)=@_; |
my ($values,$title,$xaxis,$yaxis,$Max)=@_; |
|
$title = '' if (! defined($title)); |
|
$xaxis = '' if (! defined($xaxis)); |
|
$yaxis = '' if (! defined($yaxis)); |
|
# |
my $sendValues = join(',', @$values); |
my $sendValues = join(',', @$values); |
my $sendCount = scalar(@$values); |
my $sendCount = scalar(@$values); |
$r->print("<br>The Maximum Value is: $Max"); |
|
if ( $Max > 1 ) { |
if ( $Max > 1 ) { |
if ($Max % 10) { |
if ($Max % 10) { |
if ( int($Max) < $Max ) { |
if ( int($Max) < $Max ) { |
Line 669 sub DrawGraph {
|
Line 831 sub DrawGraph {
|
$Max = int($Max); |
$Max = int($Max); |
} |
} |
} |
} |
#(10 - $Max % 10); |
} else { |
} else { $Max = 1; } |
$Max = 1; |
my @GData = ('','Problem_number',$title,$Max,$sendCount,$sendValues); |
|
# $r->print('</form>'."\n"); |
|
$r->print('<br>'."\n"); |
|
$r->print('<IMG src="/cgi-bin/graph.png?'. |
|
(join('&', @GData)).'" border="1" />'); |
|
# $r->print('<form>'."\n"); |
|
$r->print('<br>'."\n"); |
|
} |
|
|
|
#---- Problem Statistics Web Page --------------------------------------- |
|
sub CreateProblemStatisticsTableHeading { |
|
my ($headings,$r)=@_; |
|
my $Str=''; |
|
$Str .= '<tr>'."\n"; |
|
$Str .= '<th bgcolor="#ffffe6">P#</th>'."\n"; |
|
foreach(@$headings) { |
|
$Str .= '<th bgcolor="#ffffe6">'; |
|
$Str .= '<a href="/adm/statistics?reportSelected='; |
|
$Str .= &Apache::lonnet::escape('Problem Statistics'); |
|
$Str .= '&ProblemStatisticsSort='; |
|
$Str .= &Apache::lonnet::escape($_).'">'.$_.'</a> </th>'."\n"; |
|
} |
} |
$Str .= "\n".'</tr>'."\n"; |
my @GData = ($title,$xaxis,$yaxis,$Max,$sendCount,$sendValues); |
return $Str; |
return '<IMG src="/cgi-bin/graph.png?'. |
|
(join('&', @GData)).'" border="1" />'; |
} |
} |
|
|
sub BuildStatisticsTable { |
sub get_statistics { |
my ($cache,$displayFormat,$sortProblems,$orderedProblems,$headings, |
my ($symb,$part) = @_; |
$r,$color)=@_; |
# |
my $count = 1; |
my $courseid = $ENV{'request.course.id'}; |
my $currentSequence = -1; |
# |
foreach(@$orderedProblems) { |
my $students = \@Apache::lonstatistics::Students; |
my ($sequence,$problem,$part)=split(':', $_); |
if ($Apache::lonstatistics::SelectedSections[0] eq 'all') { |
if($cache->{'StatisticsMaps'} ne 'All Maps' && |
$students = undef; |
$cache->{'StatisticsMaps'} ne $cache->{$sequence.':title'}) { |
|
next; |
|
} |
|
if($currentSequence == -1 || |
|
($sortProblems eq 'Sort Within Sequence' && |
|
$currentSequence != $sequence)) { |
|
if($displayFormat ne 'Display CSV Format') { |
|
if($currentSequence ne -1) { |
|
$r->print('</table>'); |
|
$r->print('</td></tr></table><br>'); |
|
} |
|
if($sortProblems eq 'Sort Within Sequence') { |
|
$r->print('<b>'.$cache->{$sequence.':title'}.'</b>'); |
|
} |
|
$r->print('<table border="0"><tr><td bgcolor="#777777">'."\n"); |
|
$r->print('<table border="0" cellpadding="3">'."\n"); |
|
$r->print(&CreateProblemStatisticsTableHeading($headings, $r)); |
|
} else { |
|
if($sortProblems eq 'Sort Within Sequence') { |
|
$r->print('"'.$cache->{$sequence.':title'}.'"'); |
|
} |
|
$r->print('<br>'); |
|
} |
|
$currentSequence = $sequence; |
|
} |
|
my $ref = '<a href="'.$cache->{$problem.':source'}. |
|
'" target="_blank">'.$cache->{$problem.':title'}.'</a>'; |
|
my $title = $cache->{$problem.':title'}; |
|
if($part != 0) { |
|
$title .= ' Part '.$part; |
|
} |
|
my $source = $cache->{$problem.':source'}; |
|
my $tableData = join('&', $ref, $title, $source, |
|
$cache->{$_.':studentCount'}, |
|
$cache->{$_.':totalTries'}, |
|
$cache->{$_.':maxTries'}, |
|
$cache->{$_.':mean'}, |
|
$cache->{$_.':correct'}, |
|
$cache->{$_.':correctByOverride'}, |
|
$cache->{$_.':percentWrong'}, |
|
$cache->{$_.':degreeOfDifficulty'}, |
|
$cache->{$_.':standardDeviation'}, |
|
$cache->{$_.':skewness'}, |
|
$cache->{$_.':discriminationFactor1'}, |
|
$cache->{$_.':discriminationFactor2'}); |
|
&TableRow($displayFormat,$tableData,$count,$r,$color); |
|
$count++; |
|
} |
|
if($displayFormat ne 'Display CSV Format') { |
|
$r->print('</table>'."\n"); |
|
$r->print('</td></tr></table>'); |
|
} else { |
|
$r->print('<br>'); |
|
} |
} |
return; |
my @Results = &Apache::loncoursedata::get_problem_statistics |
|
($students,$symb,$part,$courseid); |
|
return @Results; |
} |
} |
|
|
sub TableRow { |
############################################### |
my ($displayFormat,$Str,$RealIdx,$r,$color)=@_; |
############################################### |
my($ref,$title,$source,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override, |
|
$Wrng,$DoD,$SD,$Sk,$_D1,$_D2)=split(/\&/,$Str); |
|
my $Ptr; |
|
if($displayFormat eq 'Display CSV Format') { |
|
$Ptr='"'.$RealIdx.'",'."\n". |
|
'"'.$title.'",'."\n". |
|
'"'.$source.'",'."\n". |
|
'"'.$StdNo.'",'."\n". |
|
'"'.$TotalTries.'",'."\n". |
|
'"'.$MxTries.'",'."\n". |
|
'"'.$Avg.'",'."\n". |
|
'"'.$YES.'",'."\n". |
|
'"'.$Override.'",'."\n". |
|
'"'.$Wrng.'",'."\n". |
|
'"'.$DoD.'",'."\n". |
|
'"'.$SD.'",'."\n". |
|
'"'.$Sk.'",'."\n". |
|
'"'.$_D1.'",'."\n". |
|
'"'.$_D2.'"'."\n". |
|
"<br>\n"; |
|
$r->print("\n".$Ptr); |
|
} else { |
|
$Ptr='<tr>'."\n". |
|
'<td bgcolor="#ffffe6">'.$RealIdx.'</td>'."\n". |
|
'<td bgcolor="#ffffe6">'.$ref.'</td>'."\n". |
|
'<td bgcolor='.$color->{"yellow"}.'> '.$StdNo.'</td>'."\n". |
|
'<td bgcolor='.$color->{"yellow"}.'>'.$TotalTries.'</td>'."\n". |
|
'<td bgcolor='.$color->{"yellow"}.'>'.$MxTries.'</td>'."\n". |
|
'<td bgcolor='.$color->{"gb"}.'>'.$Avg.'</td>'."\n". |
|
'<td bgcolor='.$color->{"gb"}.'> '.$YES.'</td>'."\n". |
|
'<td bgcolor='.$color->{"gb"}.'> '.$Override.'</td>'."\n". |
|
'<td bgcolor='.$color->{"red"}.'> '.$Wrng.'</td>'."\n". |
|
'<td bgcolor='.$color->{"red"}.'> '.$DoD.'</td>'."\n". |
|
'<td bgcolor='.$color->{"green"}.'> '.$SD.'</td>'."\n". |
|
'<td bgcolor='.$color->{"green"}.'> '.$Sk.'</td>'."\n". |
|
'<td bgcolor='.$color->{"purple"}.'> '.$_D1.'</td>'."\n". |
|
'<td bgcolor='.$color->{"purple"}.'> '.$_D2.'</td>'."\n"; |
|
$r->print($Ptr.'</tr>'."\n"); |
|
} |
|
return; |
|
} |
|
|
|
# For loading the colored table for display or un-colored for print |
=pod |
sub setbgcolor { |
|
my $PrintTable=shift; |
=item &ProblemStatisticsLegend() |
my %color; |
|
if ($PrintTable){ |
|
$color{"gb"}="#FFFFFF"; |
|
$color{"red"}="#FFFFFF"; |
|
$color{"yellow"}="#FFFFFF"; |
|
$color{"green"}="#FFFFFF"; |
|
$color{"purple"}="#FFFFFF"; |
|
} else { |
|
$color{"gb"}="#DDFFFF"; |
|
$color{"red"}="#FFDDDD"; |
|
$color{"yellow"}="#EEFFCC"; |
|
$color{"green"}="#DDFFDD"; |
|
$color{"purple"}="#FFDDFF"; |
|
} |
|
return \%color; |
|
} |
|
|
|
sub ProblemStatisticsButtons { |
|
my ($displayFormat, $displayLegend, $sortProblems)=@_; |
|
my $Ptr = '<tr><td></td><td align="left">'; |
|
$Ptr .= '<input type="submit" name="DoDiffGraph" '; |
|
$Ptr .= 'value="Plot Degree of Difficulty" />'."\n"; |
|
$Ptr .= '</td><td align="left">'; |
|
$Ptr .= '<input type="submit" name="PercentWrongGraph" '; |
|
$Ptr .= 'value="Plot Percent Wrong" />'."\n"; |
|
$Ptr .= '</td></tr><tr><td></td><td>'."\n"; |
|
$Ptr .= '<input type="submit" name="SortProblems" '; |
|
if($sortProblems eq 'Sort All Problems') { |
|
$Ptr .= 'value="Sort Within Sequence" />'."\n"; |
|
} else { |
|
$Ptr .= 'value="Sort All Problems" />'."\n"; |
|
} |
|
$Ptr .= '</td><td align="left">'; |
|
$Ptr .= '<input type="submit" name="DisplayLegend" '; |
|
if($displayLegend eq 'Show Legend') { |
|
$Ptr .= 'value="Hide Legend" />'."\n"; |
|
} else { |
|
$Ptr .= 'value="Show Legend" />'."\n"; |
|
} |
|
$Ptr .= '</td><td align="left">'; |
|
$Ptr .= '<input type="submit" name="DisplayCSVFormat" '; |
|
if($displayFormat eq 'Display CSV Format') { |
|
$Ptr .= 'value="Display Table Format" />'."\n"; |
|
} else { |
|
$Ptr .= 'value="Display CSV Format" />'."\n"; |
|
} |
|
$Ptr .= '</td></tr>'; |
|
return $Ptr; |
|
} |
|
|
|
|
=cut |
|
|
|
############################################### |
|
############################################### |
sub ProblemStatisticsLegend { |
sub ProblemStatisticsLegend { |
my $Ptr = ''; |
my $Ptr = ''; |
$Ptr = '<table border="0">'; |
$Ptr = '<table border="0">'; |