--- loncom/interface/statistics/loncorrectproblemplot.pm 2004/02/20 16:24:20 1.6 +++ loncom/interface/statistics/loncorrectproblemplot.pm 2004/10/06 14:21:57 1.12 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncorrectproblemplot.pm,v 1.6 2004/02/20 16:24:20 matthew Exp $ +# $Id: loncorrectproblemplot.pm,v 1.12 2004/10/06 14:21:57 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,10 +39,6 @@ use Apache::lonlocal; my @SubmitButtons = ( { name => 'CreatePlot', text => 'Create Plot' }, - { name => 'ClearCache', - text => 'Clear Caches' }, - { name => 'updatecaches', - text => 'Update Student Data' }, ); ######################################################### @@ -81,44 +77,55 @@ sub BuildCorrectProblemsPage { ''); } # - &Apache::loncoursedata::clear_internal_caches(); - if (exists($ENV{'form.ClearCache'}) || - exists($ENV{'form.updatecaches'}) || - (exists($ENV{'form.firstanalysis'}) && - $ENV{'form.firstanalysis'} ne 'no')) { - &Apache::lonstatistics::Gather_Full_Student_Data($r); - } - if (! exists($ENV{'form.firstanalysis'})) { - $r->print(''); - } else { - $r->print(''); - } + my @CacheButtonHTML = + &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status'); foreach my $button (@SubmitButtons) { $r->print(''); $r->print(' 'x5); } + foreach my $html (@CacheButtonHTML) { + $r->print($html.(' 'x5)); + } $r->rflush(); # # Determine which problem symbs we are to sum over if (exists($ENV{'form.CreatePlot'})) { my @ProblemSymbs; + my $total_parts = 0; + my $title = ''; if ($Apache::lonstatistics::SelectedMaps[0] ne 'all') { foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()){ + if ($title eq '') { + $title = $seq->{'title'}; + } else { + $title = 'Multiple Sequences'; + } foreach my $res (@{$seq->{'contents'}}) { next if ($res->{'type'} ne 'assessment'); foreach my $part (@{$res->{'parts'}}) { + $total_parts++; push(@ProblemSymbs,{symb=>$res->{'symb'}, part=>$part}); } } } } + my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits(); + if (defined($starttime) || defined($endtime)) { + # Inform the user what the time limits on the data are. + $r->print(&mt('Statistics on submissions from [_1] to [_2]', + &Apache::lonlocal::locallocaltime($starttime), + &Apache::lonlocal::locallocaltime($endtime))); + } my $score_data = &Apache::loncoursedata::get_student_scores (\@Apache::lonstatistics::SelectedSections, \@ProblemSymbs, - $Apache::lonstatistics::enrollment_status); - $r->print(&AnalyzeScoreData($score_data)); + $Apache::lonstatistics::enrollment_status,undef, + $starttime,$endtime); + $r->print(&AnalyzeScoreData($score_data,$title,$total_parts)); + } else { + $r->print('

'.&mt('Make a sequence selection from the "Sequences and Folders" menu and hit "Create Plot" to begin').'

'); } return; } @@ -138,17 +145,18 @@ return html with a plot of the data and ######################################################### ######################################################### sub AnalyzeScoreData { - my ($score_data) = @_; + my ($score_data,$title,$total_parts) = @_; # # Basic check first - if (@$score_data < 1) { - return '

There is no data to plot

'; + if (ref($score_data) ne 'ARRAY' || @$score_data < 1) { + return '

'.&mt('There is no data to plot').'

'; } # # Determine which bins to use my $lowest = $score_data->[0]->[0]; $lowest = 0; my $highest = $score_data->[-1]->[0]; + &Apache::lonnet::logthis('highest = '.$highest); my $binsize = 1; if ($highest > 50) { $binsize = 2; } if ($highest > 100) { $binsize = 5; } @@ -160,10 +168,13 @@ sub AnalyzeScoreData { # Get the data into the bins (destroying $score_data in the process) my @Bins = &bin_data($score_data,$binsize,$lowest,$highest); my @Xdata; my @Ydata; my $max; - my $Str = ''."\n".''."\n"; + my $Str = + '
RangeCount
'."\n".''."\n"; + my $sum = 0; while (my $bin = shift(@Bins)) { push (@Xdata,$bin->{'start'}); push (@Ydata,$bin->{'count'}); + $sum += $bin->{'count'}; if ($bin->{'count'} > $max) { $max = $bin->{'count'}; } @@ -172,16 +183,17 @@ sub AnalyzeScoreData { } # scale max to an integer. $max = 5*(int($max/5)+1); - my $title = 'Correct Problems Plot'; $Str .= "
RangeCount

\n"; - $Str = "
\n".&Apache::loncommon::DrawBarGraph($title, - 'Num Correct Problems', + $title = &HTML::Entities::decode($title); + $Str = "\n

".&Apache::loncommon::DrawBarGraph($title.' N = '.$sum, + 'Num Correct Problems (max:'.$total_parts.')', 'Number of students', $max, undef, # colors \@Xdata, \@Ydata). "\n
\n".$Str; + $Str .= '

'."\n"; return $Str; } @@ -218,10 +230,10 @@ sub bin_data { my @Bins; my $count=0; my $idx=0; - while ($idx < scalar(@$data) && ($binend-$endbin)<$binsize) { + while ($idx < scalar(@$data) && ($endbin-$binend + $binsize)>0) { my $dataset = $data->[$idx++]; my ($x,$y) = @{$dataset}; - while ($x > $binend) { + while ($x > ($binend-.001)) { # store the old data push (@Bins,{ start => $binstart, count => $count, @@ -233,6 +245,11 @@ sub bin_data { } $count+=$y; } + if ($count > 0) { + push (@Bins,{ start => $binstart, + count => $count, + end => $binend }); + } return @Bins; } @@ -255,15 +272,19 @@ sub CreateInterface { ## ## Environment variable initialization my $Str; - $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Correct Problems Plot'); + $Str .= &Apache::lonhtmlcommon::breadcrumbs + (undef,'Correct Problems Plot'); + $Str .= '

'; + # $Str .= ''."\n"; $Str .= ''; $Str .= ''; $Str .= ''; $Str .= ''; + $Str .= ''; $Str .= ''."\n"; - ## - ## + # $Str .= ''; @@ -282,10 +303,16 @@ sub CreateInterface { }; $Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5, $only_seq_with_assessments); - $Str .= ''; + # $Str .= ''."\n"; $Str .= '
'.&mt('Sections').''.&mt('Enrollment Status').''.&mt('Sequences and Folders').''. + &Apache::lonstathelpers::limit_by_time_form().'
'."\n"; $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); $Str .= ''."\n"; - ## + $Str .= '
'."\n"; + # + $Str .= ''.&mt('Status: [_1]', + ''). + ''.'

'; + ## return $Str; }