version 1.73, 2004/03/26 22:04:22
|
version 1.76, 2004/03/29 19:41:24
|
Line 73 my @Fields = (
|
Line 73 my @Fields = (
|
{ name => 'problem_num', |
{ name => 'problem_num', |
title => 'P#', |
title => 'P#', |
align => 'right', |
align => 'right', |
color => '#FFFFE6' }, |
color => '#FFFFE6', |
|
selectable => 'no', |
|
selected => 'yes', |
|
}, |
{ name => 'container', |
{ name => 'container', |
title => 'Sequence or Folder', |
title => 'Sequence or Folder', |
align => 'left', |
align => 'left', |
color => '#FFFFE6', |
color => '#FFFFE6', |
sortable => 'yes' }, |
sortable => 'yes', |
|
selectable => 'no', |
|
selected => 'yes', |
|
}, |
{ name => 'title', |
{ name => 'title', |
title => 'Title', |
title => 'Title', |
align => 'left', |
align => 'left', |
color => '#FFFFE6', |
color => '#FFFFE6', |
special => 'link', |
special => 'link', |
sortable => 'yes', }, |
sortable => 'yes', |
|
selectable => 'no', |
|
selected => 'yes', |
|
}, |
{ name => 'part', |
{ name => 'part', |
title => 'Part', |
title => 'Part', |
align => 'left', |
align => 'left', |
color => '#FFFFE6', |
color => '#FFFFE6', |
}, |
selectable => 'no', |
|
selected => 'yes', |
|
}, |
{ name => 'num_students', |
{ name => 'num_students', |
title => '#Stdnts', |
title => '#Stdnts', |
align => 'right', |
align => 'right', |
Line 97 my @Fields = (
|
Line 108 my @Fields = (
|
format => '%d', |
format => '%d', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Number of Students Attempting Problem' }, |
long_title => 'Number of Students Attempting Problem', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'tries', |
{ name => 'tries', |
title => 'Tries', |
title => 'Tries', |
align => 'right', |
align => 'right', |
Line 105 my @Fields = (
|
Line 119 my @Fields = (
|
format => '%d', |
format => '%d', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Total Number of Tries' }, |
long_title => 'Total Number of Tries', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'max_tries', |
{ name => 'max_tries', |
title => 'Max Tries', |
title => 'Max Tries', |
align => 'right', |
align => 'right', |
Line 113 my @Fields = (
|
Line 130 my @Fields = (
|
format => '%d', |
format => '%d', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Maximum Number of Tries' }, |
long_title => 'Maximum Number of Tries', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'min_tries', |
{ name => 'min_tries', |
title => 'Min Tries', |
title => 'Min Tries', |
align => 'right', |
align => 'right', |
Line 121 my @Fields = (
|
Line 141 my @Fields = (
|
format => '%d', |
format => '%d', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Minumum Number of Tries' }, |
long_title => 'Minumum Number of Tries', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'mean_tries', |
{ name => 'mean_tries', |
title => 'Mean Tries', |
title => 'Mean Tries', |
align => 'right', |
align => 'right', |
Line 129 my @Fields = (
|
Line 152 my @Fields = (
|
format => '%5.2f', |
format => '%5.2f', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Average Number of Tries' }, |
long_title => 'Average Number of Tries', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'std_tries', |
{ name => 'std_tries', |
title => 'S.D. tries', |
title => 'S.D. tries', |
align => 'right', |
align => 'right', |
Line 137 my @Fields = (
|
Line 163 my @Fields = (
|
format => '%5.2f', |
format => '%5.2f', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Standard Deviation of Number of Tries' }, |
long_title => 'Standard Deviation of Number of Tries', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'skew_tries', |
{ name => 'skew_tries', |
title => 'Skew Tries', |
title => 'Skew Tries', |
align => 'right', |
align => 'right', |
Line 145 my @Fields = (
|
Line 174 my @Fields = (
|
format => '%5.2f', |
format => '%5.2f', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Skew of Number of Tries' }, |
long_title => 'Skew of Number of Tries', |
|
selectable => 'yes', |
|
selected => 'no', |
|
}, |
{ name => 'num_solved', |
{ name => 'num_solved', |
title => '#YES', |
title => '#YES', |
align => 'right', |
align => 'right', |
Line 153 my @Fields = (
|
Line 185 my @Fields = (
|
format => '%4.1f',# format => '%d', |
format => '%4.1f',# format => '%d', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Number of Students able to Solve' }, |
long_title => 'Number of Students able to Solve', |
|
selectable => 'no', |
|
selected => 'yes', |
|
}, |
{ name => 'num_override', |
{ name => 'num_override', |
title => '#yes', |
title => '#yes', |
align => 'right', |
align => 'right', |
Line 161 my @Fields = (
|
Line 196 my @Fields = (
|
format => '%4.1f',# format => '%d', |
format => '%4.1f',# format => '%d', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Number of Students given Override' }, |
long_title => 'Number of Students given Override', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'num_wrong', |
{ name => 'num_wrong', |
title => '#Wrng', |
title => '#Wrng', |
align => 'right', |
align => 'right', |
Line 169 my @Fields = (
|
Line 207 my @Fields = (
|
format => '%4.1f', |
format => '%4.1f', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Percent of students whose final answer is wrong' }, |
long_title => 'Percent of students whose final answer is wrong', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'deg_of_diff', |
{ name => 'deg_of_diff', |
title => 'DoDiff', |
title => 'DoDiff', |
align => 'right', |
align => 'right', |
Line 178 my @Fields = (
|
Line 219 my @Fields = (
|
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Degree of Difficulty'. |
long_title => 'Degree of Difficulty'. |
'[ 1 - ((#YES+#yes) / Tries) ]'}, |
'[ 1 - ((#YES+#yes) / Tries) ]', |
|
selectable => 'yes', |
|
selected => 'yes', |
|
}, |
{ name => 'deg_of_disc', |
{ name => 'deg_of_disc', |
title => 'DoDisc', |
title => 'DoDisc', |
align => 'right', |
align => 'right', |
Line 186 my @Fields = (
|
Line 230 my @Fields = (
|
format => '%4.2f', |
format => '%4.2f', |
sortable => 'yes', |
sortable => 'yes', |
graphable => 'yes', |
graphable => 'yes', |
long_title => 'Degree of Discrimination' }, |
long_title => 'Degree of Discrimination', |
|
selectable => 'yes', |
|
selected => 'no', |
|
}, |
); |
); |
|
|
|
my %SelectedFields; |
|
|
|
sub parse_field_selection { |
|
# |
|
# Pull out the defaults |
|
if (! defined($ENV{'form.fieldselections'})) { |
|
$ENV{'form.fieldselections'} = []; |
|
foreach my $field (@Fields) { |
|
next if ($field->{'selectable'} ne 'yes'); |
|
if ($field->{'selected'} eq 'yes') { |
|
push(@{$ENV{'form.fieldselections'}},$field->{'name'}); |
|
} |
|
} |
|
} |
|
# |
|
# This should not happen, but in case it does... |
|
if (ref($ENV{'form.fieldselections'}) ne 'ARRAY') { |
|
$ENV{'form.fieldselections'} = [$ENV{'form.fieldselections'}]; |
|
} |
|
# |
|
# Set the field data and the selected fields (for easier checking) |
|
undef(%SelectedFields); |
|
foreach my $field (@Fields) { |
|
next if ($field->{'selectable'} ne 'yes'); |
|
$field->{'selected'} = 'no'; |
|
foreach my $selection (@{$ENV{'form.fieldselections'}}) { |
|
if ($selection eq $field->{'name'} || $selection eq 'all') { |
|
$field->{'selected'} = 'yes'; |
|
$SelectedFields{$field->{'name'}}++; |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub field_selection_input { |
|
my $Str = '<select name="fieldselections" multiple size="5">'."\n"; |
|
$Str .= '<option value="all">all</option>'."\n"; |
|
foreach my $field (@Fields) { |
|
next if ($field->{'selectable'} ne 'yes'); |
|
$Str .= ' <option value="'.$field->{'name'}.'" '; |
|
if ($field->{'selected'} eq 'yes') { |
|
$Str .= 'selected '; |
|
} |
|
$Str .= '>'.$field->{'title'}.'</option>'."\n"; |
|
} |
|
$Str .= "</select>\n"; |
|
} |
|
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
Line 204 select sections, maps, and output.
|
Line 300 select sections, maps, and output.
|
############################################### |
############################################### |
############################################### |
############################################### |
sub CreateInterface { |
sub CreateInterface { |
|
&parse_field_selection(); |
my $Str = ''; |
my $Str = ''; |
$Str .= &Apache::lonhtmlcommon::breadcrumbs |
$Str .= &Apache::lonhtmlcommon::breadcrumbs |
(undef,'Overall Problem Statistics','Statistics_Overall_Key'); |
(undef,'Overall Problem Statistics','Statistics_Overall_Key'); |
Line 212 sub CreateInterface {
|
Line 309 sub CreateInterface {
|
$Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>'; |
|
$Str .= '<td align="center"><b>'.&mt('Statistics').'</b></td>'; |
$Str .= '<td rowspan="2">'. |
$Str .= '<td rowspan="2">'. |
&Apache::lonstathelpers::limit_by_time_form().'</td>'; |
&Apache::lonstathelpers::limit_by_time_form().'</td>'; |
$Str .= '</tr>'."\n"; |
$Str .= '</tr>'."\n"; |
Line 232 sub CreateInterface {
|
Line 330 sub CreateInterface {
|
}; |
}; |
$Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5, |
$Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5, |
$only_seq_with_assessments); |
$only_seq_with_assessments); |
|
$Str .= '</td><td>'.&field_selection_input(); |
$Str .= '</td></tr>'."\n"; |
$Str .= '</td></tr>'."\n"; |
$Str .= '</table>'."\n"; |
$Str .= '</table>'."\n"; |
$Str .= '<input type="submit" name="GenerateStatistics" value="'. |
$Str .= '<input type="submit" name="GenerateStatistics" value="'. |
Line 310 sub BuildProblemStatisticsPage {
|
Line 409 sub BuildProblemStatisticsPage {
|
# This probably does not need to be done each time we are called, but |
# This probably does not need to be done each time we are called, but |
# it does not slow things down noticably. |
# it does not slow things down noticably. |
&Apache::loncoursedata::populate_weight_table(); |
&Apache::loncoursedata::populate_weight_table(); |
|
# |
if (exists($ENV{'form.Excel'})) { |
if (exists($ENV{'form.Excel'})) { |
&Excel_output($r); |
&Excel_output($r); |
} else { |
} else { |
|
my $count = 0; |
|
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
$count += $seq->{'num_assess'}; |
|
} |
|
if ($count > 10) { |
|
$r->print('<h2>'. |
|
&mt('Compiling statistics for [_1] problems',$count). |
|
'</h2>'); |
|
if ($count > 30) { |
|
$r->print('<h3>'.&mt('This will take some time.').'</h3>'); |
|
} |
|
$r->rflush(); |
|
} |
|
# |
my $sortby = $ENV{'form.sortby'}; |
my $sortby = $ENV{'form.sortby'}; |
$sortby = 'container' if (! defined($sortby) || $sortby =~ /^\s*$/); |
$sortby = 'container' if (! defined($sortby) || $sortby =~ /^\s*$/); |
my $plot = $ENV{'form.plot'}; |
my $plot = $ENV{'form.plot'}; |
&Apache::lonnet::logthis('form.plot = '.$plot); |
if ($plot eq '' || $plot eq 'none') { |
|
undef($plot); |
|
} |
if ($sortby eq 'container' && ! defined($plot)) { |
if ($sortby eq 'container' && ! defined($plot)) { |
&output_html_by_sequence($r); |
&output_html_by_sequence($r); |
} else { |
} else { |
if (defined($plot)) { |
if (defined($plot)) { |
&Apache::lonnet::logthis('calling plot routine'); |
|
&make_plot($r,$plot); |
&make_plot($r,$plot); |
} |
} |
&output_html_stats($r); |
&output_html_stats($r); |
Line 385 sub output_html_stats {
|
Line 500 sub output_html_stats {
|
return; |
return; |
} |
} |
|
|
|
|
sub html_preamble { |
sub html_preamble { |
my $Str=''; |
my $Str=''; |
$Str .= "<h2>". |
$Str .= "<h2>". |
Line 417 sub statistics_html_table_data {
|
Line 531 sub statistics_html_table_data {
|
my $row = ''; |
my $row = ''; |
foreach my $field (@Fields) { |
foreach my $field (@Fields) { |
next if ($options =~ /no $field->{'name'}/); |
next if ($options =~ /no $field->{'name'}/); |
|
next if ($field->{'selected'} ne 'yes'); |
$row .= '<td bgcolor="'.$field->{'color'}.'"'; |
$row .= '<td bgcolor="'.$field->{'color'}.'"'; |
if (exists($field->{'align'})) { |
if (exists($field->{'align'})) { |
$row .= ' align="'.$field->{'align'}.'"'; |
$row .= ' align="'.$field->{'align'}.'"'; |
Line 443 sub statistics_table_header {
|
Line 558 sub statistics_table_header {
|
my $header_row; |
my $header_row; |
foreach my $field (@Fields) { |
foreach my $field (@Fields) { |
next if ($options =~ /no $field->{'name'}/); |
next if ($options =~ /no $field->{'name'}/); |
|
next if ($field->{'selected'} ne 'yes'); |
$header_row .= '<th>'; |
$header_row .= '<th>'; |
if (exists($field->{'sortable'}) && $field->{'sortable'} eq 'yes') { |
if (exists($field->{'sortable'}) && $field->{'sortable'} eq 'yes') { |
$header_row .= '<a href="javascript:'. |
$header_row .= '<a href="javascript:'. |
Line 480 sub make_plot {
|
Line 596 sub make_plot {
|
&sort_data($ENV{'form.sortby'}); |
&sort_data($ENV{'form.sortby'}); |
if ($plot eq 'degrees') { |
if ($plot eq 'degrees') { |
°rees_plot($r); |
°rees_plot($r); |
|
} elsif ($plot eq 'tries statistics') { |
|
&tries_data_plot($r); |
} else { |
} else { |
&make_single_stat_plot($r,$plot); |
&make_single_stat_plot($r,$plot); |
} |
} |
Line 636 END
|
Line 754 END
|
return; |
return; |
} |
} |
|
|
|
sub tries_data_plot { |
|
my ($r)=@_; |
|
my $count = scalar(@StatsArray); |
|
my $width = 50 + 10*$count; |
|
$width = 300 if ($width < 300); |
|
my $height = 300; |
|
my $plot = ''; |
|
my @STD; my @Mean; my @Max; my @Min; |
|
my @Labels; |
|
my $ymax = 5; |
|
foreach my $data (@StatsArray) { |
|
my $max = $data->{'mean_tries'} + $data->{'std_tries'}; |
|
$ymax = $max if ($ymax < $max); |
|
$ymax = $max if ($ymax < $max); |
|
push(@Labels,$data->{'problem_num'}); |
|
push(@STD,$data->{'std_tries'}); |
|
push(@Mean,$data->{'mean_tries'}); |
|
} |
|
# |
|
# Make sure we show relevant information. |
|
my $xmax = $Labels[-1]; |
|
if ($xmax > 50) { |
|
if ($xmax % 10 != 0) { |
|
$xmax = 10 * (int($xmax/10)+1); |
|
} |
|
} else { |
|
if ($xmax % 5 != 0) { |
|
$xmax = 5 * (int($xmax/5)+1); |
|
} |
|
} |
|
$ymax = int($ymax)+1+2; |
|
# |
|
my $std_data .= '<data>'.join(',',@Labels).'</data>'.$/. |
|
'<data>'.join(',',@Mean).'</data>'.$/; |
|
# |
|
my $std_error_data .= '<data>'.join(',',@Labels).'</data>'.$/. |
|
'<data>'.join(',',@Mean).'</data>'.$/. |
|
'<data>'.join(',',@STD).'</data>'.$/; |
|
# |
|
$plot=<<"END"; |
|
<gnuplot |
|
texfont="10" |
|
fgcolor="x000000" |
|
plottype="Cartesian" |
|
font="large" |
|
grid="on" |
|
align="center" |
|
border="on" |
|
transparent="on" |
|
alttag="Sample Plot" |
|
samples="100" |
|
bgcolor="xffffff" |
|
height="$height" |
|
width="$width"> |
|
<title>Mean and S.D. of Tries</title> |
|
<axis xmin="0" ymin="0" xmax="$xmax" ymax="$ymax" color="x000000" /> |
|
<xlabel>Problem Number</xlabel> |
|
<curve |
|
linestyle="yerrorbars" |
|
name="S.D. Tries" |
|
pointtype="1" |
|
color="x666666"> |
|
$std_error_data |
|
</curve> |
|
<curve |
|
linestyle="points" |
|
name="Mean Tries" |
|
pointtype="1" |
|
color="xCC4444"> |
|
$std_data |
|
</curve> |
|
</gnuplot> |
|
END |
|
my $plotresult = |
|
'<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/; |
|
$r->print($plotresult); |
|
return; |
|
} |
|
|
sub plot_dropdown { |
sub plot_dropdown { |
my $current = ''; |
my $current = ''; |
# |
# |
Line 646 sub plot_dropdown {
|
Line 843 sub plot_dropdown {
|
my @Additional_Plots = ( |
my @Additional_Plots = ( |
{ graphable=>'yes', |
{ graphable=>'yes', |
name => 'degrees', |
name => 'degrees', |
title => 'DoDisc and DoDiff' }); |
title => 'DoDisc and DoDiff' }, |
|
{ graphable=>'yes', |
|
name => 'tries statistics', |
|
title => 'Mean and S.D. of Tries' }); |
# |
# |
my $Str= "\n".'<select name="plot" size="1">'; |
my $Str= "\n".'<select name="plot" size="1">'; |
$Str .= '<option name="none"></option>'."\n"; |
$Str .= '<option name="none"></option>'."\n"; |
Line 768 sub Excel_output {
|
Line 968 sub Excel_output {
|
# Long Headers |
# Long Headers |
foreach my $field (@Fields) { |
foreach my $field (@Fields) { |
next if ($field->{'name'} eq 'problem_num'); |
next if ($field->{'name'} eq 'problem_num'); |
|
next if ($field->{'selected'} ne 'yes'); |
if (exists($field->{'long_title'})) { |
if (exists($field->{'long_title'})) { |
$excel_sheet->write($rows_output,$cols_output++, |
$excel_sheet->write($rows_output,$cols_output++, |
$field->{'long_title'}); |
$field->{'long_title'}); |
Line 779 sub Excel_output {
|
Line 980 sub Excel_output {
|
$cols_output=0; |
$cols_output=0; |
# Brief headers |
# Brief headers |
foreach my $field (@Fields) { |
foreach my $field (@Fields) { |
|
next if ($field->{'selected'} ne 'yes'); |
next if ($field->{'name'} eq 'problem_num'); |
next if ($field->{'name'} eq 'problem_num'); |
# Use english for excel as I am not sure how well excel handles |
# Use english for excel as I am not sure how well excel handles |
# other character sets.... |
# other character sets.... |
Line 788 sub Excel_output {
|
Line 990 sub Excel_output {
|
foreach my $data (@StatsArray) { |
foreach my $data (@StatsArray) { |
$cols_output=0; |
$cols_output=0; |
foreach my $field (@Fields) { |
foreach my $field (@Fields) { |
|
next if ($field->{'selected'} ne 'yes'); |
next if ($field->{'name'} eq 'problem_num'); |
next if ($field->{'name'} eq 'problem_num'); |
$excel_sheet->write($rows_output,$cols_output++, |
$excel_sheet->write($rows_output,$cols_output++, |
$data->{$field->{'name'}}); |
$data->{$field->{'name'}}); |
Line 937 sub get_statistics {
|
Line 1140 sub get_statistics {
|
$data->{'title.link'} = $resource->{'src'}.'?symb='. |
$data->{'title.link'} = $resource->{'src'}.'?symb='. |
&Apache::lonnet::escape($resource->{'symb'}); |
&Apache::lonnet::escape($resource->{'symb'}); |
# |
# |
$data->{'deg_of_disc'} = &compute_discrimination_factor($resource,$part,$sequence); |
if ($SelectedFields{'deg_of_disc'}) { |
|
$data->{'deg_of_disc'} = |
|
&compute_discrimination_factor($resource,$part,$sequence); |
|
} |
return $data; |
return $data; |
} |
} |
|
|