--- loncom/interface/statistics/lonsubmissiontimeanalysis.pm 2004/02/20 16:38:49 1.13
+++ loncom/interface/statistics/lonsubmissiontimeanalysis.pm 2005/03/04 20:34:15 1.19
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonsubmissiontimeanalysis.pm,v 1.13 2004/02/20 16:38:49 matthew Exp $
+# $Id: lonsubmissiontimeanalysis.pm,v 1.19 2005/03/04 20:34:15 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -75,18 +75,8 @@ sub BuildSubmissionTimePage {
$r->print('
There are no students in the sections selected
');
}
#
- &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');
$r->rflush();
#
if (! exists($ENV{'form.problemchoice'}) ||
@@ -95,19 +85,23 @@ sub BuildSubmissionTimePage {
&mt('Graph Problem Submission Times').'" />');
$r->print(' 'x5);
$r->print('
'.&mt('Please select a problem to analyze').'
');
- $r->print(&Apache::lonstathelpers::ProblemSelector('.'));
+ $r->print(&Apache::lonstathelpers::problem_selector('.'));
} else {
foreach my $button (@SubmitButtons) {
$r->print('{'text'}).'" />');
$r->print(' 'x5);
}
+ foreach my $html (@CacheButtonHTML) {
+ $r->print($html.(' 'x5));
+ }
+ $r->rflush();
#
# Determine which problem we are to analyze
my $current_problem = &Apache::lonstathelpers::get_target_from_id
($ENV{'form.problemchoice'});
#
- my ($prev,$curr,$next) =
+ my ($navmap,$prev,$curr,$next) =
&Apache::lonstathelpers::get_prev_curr_next($current_problem,
'.',
'part');
@@ -132,12 +126,13 @@ sub BuildSubmissionTimePage {
if (! defined($resource)) {
$r->print('resource is undefined');
} else {
- $r->print('
'.$resource->{'title'}.'
');
- $r->print('
'.$resource->{'src'}.'
');
+ $r->print('
'.$resource->compTitle.'
');
+ $r->print('
'.$resource->src.'
');
$r->rflush();
$r->print(&Apache::lonstathelpers::render_resource($resource));
+ $r->print(' ');
$r->rflush();
- $r->print(&analyze_times($r,$resource,\@Students,
+ $r->print(&analyze_times($r,$resource->symb,\@Students,
$current_problem->{'part'}));
}
$r->print('');
@@ -163,7 +158,8 @@ sub get_week_start {
}
sub analyze_times {
- my ($r,$resource,$students,$part) = @_;
+ my ($r,$symb,$students,$part) = @_;
+ my $htmltable;
#
# Convenience arrays
my @FullWeekDay = (qw/Sunday Monday Tuesday Wednesday Thursday Friday
@@ -174,9 +170,11 @@ sub analyze_times {
my $html; # holds results of analysis
# Get the data
my $SubData = &Apache::loncoursedata::get_response_time_data
- ($students,$resource->{'symb'},$part);
+ (\@Apache::lonstatistics::SelectedSections,
+ $Apache::lonstatistics::enrollment_status,
+ $symb,$part);
if (! defined($SubData) || ! ref($SubData)) {
- $html.= '
There is no submission data for this problem
';
+ $html.= '
There is no submission data for this problem at all
';
return $html;
}
my $NumSub = scalar(@{$SubData});
@@ -197,20 +195,23 @@ sub analyze_times {
my $endtime = $day_start;
#
# Initialize loop variables
- my $max;
- my @Ydata=(0);
- my @AnsData=(0);
- my @Xlabel=($WeekDay[$wday]);
- my $cumulative_answers = 0;
+ my $max; # The sum of @Ydata
+ my @Ydata=(0); # number of submissions
+ my @AnsData=(0); # number of correct submissions
+ my @Xlabel=($WeekDay[$wday]); # Labels of itmes
+ my @BinEnd; # The end time of each bin
+ my $cumulative_answers = 0; # The sum of @AnsData
+ my %students; # which students have attempted the problem?
#
foreach my $row (@$SubData) {
my $subtime = &get_time_from_row($row);
while ($subtime > $endtime && $endtime < time) {
# Create a new bin
$bincount++;
- $Ydata[$bincount]=0;
- $AnsData[$bincount]=$AnsData[$bincount-1];
+ $Ydata[$bincount] = 0;
+ $AnsData[$bincount] = 0;
$endtime += $binsize;
+ push(@BinEnd,$endtime);
if ($bincount % (86400/$binsize) == 0) {
$wday++;
$wday %= 7;
@@ -223,21 +224,16 @@ sub analyze_times {
$max = $Ydata[$bincount] if ($max < $Ydata[$bincount]);
$AnsData[$bincount] += &successful_submission($row);
$cumulative_answers += &successful_submission($row);
+ $students{$row->[&Apache::loncoursedata::RT_student_id()]}++;
}
- foreach my $maximum (10,15,20,25,30,40,50,60,70,80,90,100,
- 120,150,200,250,300,350,400,450,500,
- 600,700,800,900,1000,1100,1200,1500,2000,
- 2500,3000,4000,5000) {
- if ($max < $maximum) {
- $max = $maximum;
- last;
- }
- }
+ #
+ # Pad the data to a full day
while ($bincount % $bins_per_day != 0) {
$bincount++;
$Ydata[$bincount]=0;
- $AnsData[$bincount]=$AnsData[$bincount-1];
+ $AnsData[$bincount]=0;
$endtime += $binsize;
+ push(@BinEnd,$endtime);
if ($bincount % (86400/$binsize) == 0) {
$wday ++;
$wday %= 7;
@@ -246,11 +242,68 @@ sub analyze_times {
$Xlabel[$bincount] = '';
}
}
- my $numstudents = scalar(@$students);
- for (my $i=0;$i<=$#AnsData;$i++) {
- $AnsData[$i] = int(100*($AnsData[$i]/$numstudents));
+ my $numstudents = scalar(keys(%students));
+ #
+ # Determine a nice maximum value to use
+ foreach my $maximum (10,15,20,25,30,40,50,60,70,80,90,100,
+ 120,150,200,250,300,350,400,450,500,
+ 600,700,800,900,1000,1100,1200,1500,2000,
+ 2500,3000,4000,5000) {
+ if ($max < $maximum) {
+ $max = $maximum;
+ last;
+ }
}
- my $title = 'Number of Submissions and Number Correct';
+ #
+ # Build the data table
+ $htmltable = '
'.
+ '
'.
+ ''.
+ '
'.
+ '
'.&mt('Begin').'
'.
+ '
'.(' 'x3).'
'.
+ '
'.&mt('End').'
'.
+ '
'.&mt('Submissions').'
'.
+ '
'.(' 'x3).'
'.
+ '
'.&mt('Correct Submissions').'
'.
+ '
'.(' 'x3).'
'.
+ '
'.&mt('Cumulative Correct of those attempting the problem').'
'.
+ '
'.(' 'x3).'
'.
+ '
'.&mt('Cumulative Percent Correct of those attempting the problem').'
'.
+ '
'.
+ ''.
+ '';
+ my @CumulativeCorrect=(0);
+ my @CumulativeCorrectPercent;
+ for (my $i=0;$i<=$#Ydata;$i++) {
+ $CumulativeCorrect[$i]=$CumulativeCorrect[-1]+$AnsData[$i];
+ $CumulativeCorrectPercent[$i] = sprintf('%3.1f',100*$CumulativeCorrect[$i]/$numstudents);
+ if ($Ydata[$i] != 0) {
+ next if (! defined($BinEnd[$i]) || $BinEnd[$i] == 0);
+ $htmltable .=
+ '