');
$r->rflush();
- $r->print(&render_resource($resource));
+ $r->print(&Apache::lonstathelpers::render_resource($resource));
+ $r->print(' ');
$r->rflush();
- $r->print(&analyze_times($r,$resource,\@Students,$part));
+ if (@Students) {
+ $r->print(&analyze_times($r,$resource->symb,\@Students,
+ $current_problem->{'part'}));
+ }
}
$r->print('');
}
@@ -148,60 +171,69 @@ 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
+ Saturday/);
+ my @WeekDay = (qw/SUN MON TUE WED THU FRI SAT SUN/);
+ my @Month = (qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/);
+ #
my $html; # holds results of analysis
# Get the data
my $SubData = &Apache::loncoursedata::get_response_time_data
- ($students,$resource->{'symb'},$part);
+ ([&Apache::lonstatistics::get_selected_sections()],
+ [&Apache::lonstatistics::get_selected_groups()],
+ $Apache::lonstatistics::enrollment_status,
+ $symb,$part);
if (! defined($SubData) || ! ref($SubData)) {
- $html.= '
There is no submission data for this resource
';
+ $html.= '
'
+ .&mt('There is no submission data for this problem at all.')
+ .'
';
return $html;
}
my $NumSub = scalar(@{$SubData});
if (! @{$SubData}) {
- $html.= '
There is no submission data for this resource
';
+ $html.= '
'
+ .&mt('There is no submission data for this problem.')
+ .'
';
return $html;
}
# Process the data
- # Get first and last times
- my $span = &get_time_from_row($SubData->[-1]) -
- &get_time_from_row($SubData->[0]);
- if ($span == 0) {
- $html.= '
There is no submission data for this resource
';
- return $html;
- }
#
my (undef,undef,undef,$mday,$month,$year,$wday,$yday,$isdst) =
localtime(&get_time_from_row($SubData->[0]));
my $day_start = &Time::Local::timelocal(0,0,0,$mday,$month,$year);
- my $start_day_of_week = $wday;
- #
- my @WeekDay = (qw/SUN MON TUE WED THU FRI SAT SUN/);
- my @Month = (qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/);
- #
- my $cumulative_answers = 0;
- #
- my @Ydata;
- my @AnsData;
- my @Xlabel;
#
+ # Configure the bins used to store the data.
my $binsize = 3600; # seconds
my $bins_per_day = 86400/$binsize;
my $bincount = 0;
my $endtime = $day_start;
#
- my $max;
+ # Initialize loop variables
+ 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) {
- $Xlabel[$bincount] = $WeekDay[$wday++];
+ $wday++;
$wday %= 7;
+ $Xlabel[$bincount] = $WeekDay[$wday];
} else {
$Xlabel[$bincount] = '';
}
@@ -210,7 +242,27 @@ 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()]}++;
+ }
+ #
+ # Pad the data to a full day
+ while ($bincount % $bins_per_day != 0) {
+ $bincount++;
+ $Ydata[$bincount]=0;
+ $AnsData[$bincount]=0;
+ $endtime += $binsize;
+ push(@BinEnd,$endtime);
+ if ($bincount % (86400/$binsize) == 0) {
+ $wday ++;
+ $wday %= 7;
+ $Xlabel[$bincount] = $WeekDay[$wday];
+ } else {
+ $Xlabel[$bincount] = '';
+ }
}
+ 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,
@@ -220,55 +272,98 @@ sub analyze_times {
last;
}
}
- while ($bincount % $bins_per_day != 0) {
- $bincount++;
- $Ydata[$bincount]=0;
- $AnsData[$bincount]=$AnsData[$bincount-1];
- $endtime += $binsize;
- if ($bincount % (86400/$binsize) == 0) {
- $Xlabel[$bincount] = $WeekDay[$wday];
- } else {
- $Xlabel[$bincount] = '';
+ #
+ # Build the data table
+ $htmltable = '
'.
+ &Apache::loncommon::end_data_table_row().$/;
}
}
-
- my $title = 'Number of Submissions and Number Correct';
+ $htmltable .= ''.&Apache::loncommon::end_data_table().'
';
+ #
+ # Build the plot
+ my $title = '';#'Number of Submissions and Number Correct';
my $xlabel;
- (undef,undef,undef,$mday,$month,$year) = localtime($day_start);
- $xlabel .= 'Sunday '.join(' ',($Month[$month],$mday,1900+$year)).' - ';
- (undef,undef,undef,$mday,$month,$year) = localtime($endtime);
- $xlabel .= 'Sunday '.join(' ',($Month[$month],$mday,1900+$year));
+ (undef,undef,undef,$mday,$month,$year,$wday) = localtime($day_start);
+ $xlabel .= $FullWeekDay[$wday].' '.
+ join(' ',($Month[$month],$mday,1900+$year)).' - ';
+ (undef,undef,undef,$mday,$month,$year,$wday) = localtime($endtime);
+ $xlabel .= $FullWeekDay[$wday].' '.
+ join(' ',($Month[$month],$mday,1900+$year));
+ my $width = 50+2*$bincount;
+ if ($width < 250) {
+ $width = 250;
+ }
+ #
$html .= &Apache::loncommon::DrawXYYGraph($title,
$xlabel,
- 'Number of Submissions',
+ 'Submissions vs Time',
$plotcolors,
\@Xlabel,
- \@Ydata,
- 0,$max,
- \@AnsData,
- 0,scalar(@$students),
+ \@Ydata,0,$max,
+ \@corr_as_percent_of_selected,0,100,
(xskip => $bins_per_day,
x_ticks => $bins_per_day,
x_tick_offset => $bins_per_day,
- width => 50+2*$bincount)
+ width => $width,
+ y1_label=>'Number of Submissions per hour',
+ y2_label=>'Percent of Students answering Correctly',
+ 'data.1.label'=>'Submissions per hour',
+ 'data.2.label'=>'Percent correct',
+ )
);
- $html .= ' ';
+ $html .= ' '.$htmltable;
return $html;
}
sub successful_submission {
my ($row) = @_;
if (ref($row) eq 'ARRAY') {
- return $row->[1];
+ return $row->[&Apache::loncoursedata::RT_awarded()];
}
return undef;
- return 0;
}
sub get_time_from_row {
my ($row) = @_;
if (ref($row) eq 'ARRAY') {
- return $row->[3];
+ return $row->[&Apache::loncoursedata::RT_timestamp()];
}
return undef;
}
@@ -276,7 +371,7 @@ sub get_time_from_row {
sub get_tries_from_row {
my ($row) = @_;
if (ref($row) eq 'ARRAY') {
- return $row->[2];
+ return $row->[&Apache::loncoursedata::RT_tries()];
}
return undef;
}
@@ -298,116 +393,42 @@ sub Process_Row {
sub CreateInterface {
##
## Environment variable initialization
- if (! exists$ENV{'form.AnalyzeOver'}) {
- $ENV{'form.AnalyzeOver'} = 'Tries';
+ if (! exists$env{'form.AnalyzeOver'}) {
+ $env{'form.AnalyzeOver'} = 'Tries';
}
##
## Build the menu
my $Str = '';
- $Str .= '