--- loncom/interface/statistics/lonproblemanalysis.pm 2004/11/02 20:45:41 1.102 +++ loncom/interface/statistics/lonproblemanalysis.pm 2006/12/21 19:52:28 1.129 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonproblemanalysis.pm,v 1.102 2004/11/02 20:45:41 matthew Exp $ +# $Id: lonproblemanalysis.pm,v 1.129 2006/12/21 19:52:28 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,7 +27,7 @@ package Apache::lonproblemanalysis; use strict; -use Apache::lonnet(); +use Apache::lonnet; use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::loncoursedata(); @@ -37,7 +37,10 @@ use Apache::lonstathelpers(); use Apache::lonstudentsubmissions(); use HTML::Entities(); use Time::Local(); -use Spreadsheet::WriteExcel(); +use capa; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + my $plotcolors = ['#33ff00', '#0033cc', '#990000', '#aaaa66', '#663399', '#ff9933', @@ -52,15 +55,14 @@ my @SubmitButtons = ({ name => 'PrevProb text => 'Next Problem' }, { name => 'break'}, { name => 'SelectAnother', - text => 'Choose a different Problem' }, - { name => 'ExcelOutput', - text => 'Produce Excel Output' }); + text => 'Choose a different Problem' }); sub BuildProblemAnalysisPage { my ($r,$c)=@_; # my %Saveable_Parameters = ('Status' => 'scalar', 'Section' => 'array', + 'Groups' => 'array', 'NumPlots' => 'scalar', 'AnalyzeOver' => 'scalar', ); @@ -75,20 +77,17 @@ sub BuildProblemAnalysisPage { # my @Students = @Apache::lonstatistics::Students; # - if (@Students < 1 && exists($ENV{'form.firstrun'})) { - $r->print('
'. + &mt($no_data_message,$plot_num,@extra_data). + ' | |
'. + &mt($header_message,$plot_num,@extra_data). + ' | |
'. + &mt($stats_message, + $stats->{'submission_count'}, + $stats->{'correct_count'}, + $stats->{'incorrect_count'}, + $stats->{'students'}, + @extra_data). + ' | |
'. + &numerical_plot_percent($r,$responses,$stats).' | '. + ''. + &numerical_plot_differences($r,$responses,$stats).' | '. + '
'.$post_message.' |
'.&mt('Bar').' | '. + ''.&mt('Range').' | '. + ''.&mt('Incorrect').' | '. + ''.&mt('Correct').' | '. + ''.&mt('Count').' | '. + '||
---|---|---|---|---|---|---|
'.$labels->[$i].' | '. + ''.$lownum.' | '. + '- | '. + ''.$highnum.' | '. + ''.$incorrect->[$i].' | '. + ''.$correct->[$i].' | '. + ''.$count->[$i].' | '. + '
'.
- ''.$title.' (N='.$N.')'.
- ''.
+ ''.&mt('Distribution of correct answers').''.
+ ' '.&mt('[_1] students, [_2] distinct correct answers', + $n,scalar(keys(%$data))). + ' '.&mt('Maximum number of coinciding values: [_1]',$max_y). ' | ||||
'.$min.' | '. + ''.$min_x.' | '. ''.$plotresult.' | '. - ''.$max.' | '. + ''.$max_x.' | '. '
'. - 'Maximum Number of Coinciding Values: '.$max_y. - ' |
'. ''. &mt($pre_graph_text, $plot_num,$foil_choice_data->{'_count'}, $correct, - $foil_choice_data->{'_count'}-$correct, + $incorrect, $foil_choice_data->{'_students'}, @extra_data). ' | |||||||||||||||||
'.
''.
@@ -1051,7 +1450,7 @@ sub OR_time_analysis {
''.$table;
}
#
- my $num_plots = $ENV{'form.NumPlots'};
+ my $num_plots = $env{'form.NumPlots'};
my $num_data = scalar(@$performance_data)-1;
#
my $current_index;
@@ -1102,6 +1501,7 @@ sub OR_time_analysis {
##
my ($processed_time_data,$correct,$data_count,$student_count) =
&OR_time_process_data($performance_data,$begin_index,$end_index);
+ $correct |= 0;
##
$table .= ''.
&mt('[_1] submissions from [_2] students, [_3] correct, [_4] incorrect',
@@ -1178,7 +1578,8 @@ sub OR_Foil_Time_Analysis {
100,
$plotcolors,
undef,
- $plotdata[0]);
+ $plotdata[0],
+ {xskip=>1});
for (my $j=0; $j< scalar(@{$plotdata[0]});$j++) {
$plotdata[0]->[$j]=0;
}
@@ -1189,7 +1590,7 @@ sub OR_Foil_Time_Analysis {
100,
$plotcolors,
undef,
- @plotdata);
+ @plotdata,{xskip=>1});
return ($correct_plot,$incorrect_plot);
}
@@ -1220,7 +1621,7 @@ sub OR_Concept_Time_Analysis {
100,
$plotcolors,
undef,
- \@plotdata);
+ \@plotdata,{xskip=>1});
}
sub OR_time_process_data {
@@ -1261,183 +1662,6 @@ sub OR_time_process_data {
scalar(keys(%distinct_students)));
}
-#########################################################
-#########################################################
-##
-## Excel output
-##
-#########################################################
-#########################################################
-sub OR_excel_sheet {
- my ($r,$resource,$performance_data,$ORdata) = @_;
- my $response = '';
- my (undef,$Foils,$Concepts) = &build_foil_index($ORdata);
- #
- # Create excel worksheet
- my $filename = '/prtspool/'.
- $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
- time.'_'.rand(1000000000).'.xls';
- my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
- if (! defined($workbook)) {
- $r->log_error("Error creating excel spreadsheet $filename: $!");
- $r->print(' | '.&mt("Unable to create new Excel file. ". - "This error has been logged. ". - "Please alert your LON-CAPA administrator"). - ' '); - return undef; - } - # - $workbook->set_tempdir('/home/httpd/perl/tmp'); - my $format = &Apache::loncommon::define_excel_formats($workbook); - # - # Create and populate main worksheets - my $problem_data_sheet = $workbook->addworksheet('Problem Data'); - my $student_data_sheet = &build_student_data_worksheet($workbook,$format); - my $response_data_sheet = $workbook->addworksheet('Response Data'); - foreach my $sheet ($problem_data_sheet,$student_data_sheet, - $response_data_sheet) { - $sheet->write(0,0,$resource->{'title'},$format->{'h2'}); - $sheet->write(1,0,$resource->{'src'},$format->{'h3'}); - } - # - my $result; - $result = &OR_build_problem_data_worksheet($problem_data_sheet,$format, - $Concepts,$ORdata); - if ($result ne 'okay') { - # Do something useful - } - $result = &OR_build_response_data_worksheet($response_data_sheet,$format, - $performance_data,$Foils, - $ORdata); - if ($result ne 'okay') { - # Do something useful - } - $response_data_sheet->activate(); - # - # Close the excel file - $workbook->close(); - # - # Write a link to allow them to download it - $result .= ''.&mt('Excel Raw Data Output').''. - ''. - &mt('Your Excel spreadsheet.'). - ' '."\n"; - return $result; -} - -sub OR_build_problem_data_worksheet { - my ($worksheet,$format,$Concepts,$ORdata) = @_; - my $rows_output = 3; - my $cols_output = 0; - $worksheet->write($rows_output++,0,'Problem Structure',$format->{'h3'}); - ## - ## - my @Headers; - if (@$Concepts > 1) { - @Headers = ("Concept\nNumber",'Concept',"Foil\nNumber", - 'Foil Name','Foil Text','Correct value'); - } else { - @Headers = ('Foil Number','FoilName','Foil Text','Correct value'); - } - $worksheet->write_row($rows_output++,0,\@Headers,$format->{'header'}); - my %Foildata = %{$ORdata->{'_Foils'}}; - my $conceptindex = 1; - my $foilindex = 1; - foreach my $concept (@$Concepts) { - my @FoilsInConcept = @{$concept->{'foils'}}; - my $firstfoil = shift(@FoilsInConcept); - if (@$Concepts > 1) { - $worksheet->write_row($rows_output++,0, - [$conceptindex, - $concept->{'name'}, - $foilindex++, - $Foildata{$firstfoil}->{'name'}, - $Foildata{$firstfoil}->{'text'}, - $Foildata{$firstfoil}->{'value'},]); - } else { - $worksheet->write_row($rows_output++,0, - [ $foilindex++, - $Foildata{$firstfoil}->{'name'}, - $Foildata{$firstfoil}->{'text'}, - $Foildata{$firstfoil}->{'value'},]); - } - foreach my $foilid (@FoilsInConcept) { - if (@$Concepts > 1) { - $worksheet->write_row($rows_output++,0, - ['', - '', - $foilindex, - $Foildata{$foilid}->{'name'}, - $Foildata{$foilid}->{'text'}, - $Foildata{$foilid}->{'value'},]); - } else { - $worksheet->write_row($rows_output++,0, - [$foilindex, - $Foildata{$foilid}->{'name'}, - $Foildata{$foilid}->{'text'}, - $Foildata{$foilid}->{'value'},]); - } - } continue { - $foilindex++; - } - } continue { - $conceptindex++; - } - $rows_output++; - $rows_output++; - ## - ## Option data output - $worksheet->write($rows_output++,0,'Options',$format->{'header'}); - foreach my $string (@{$ORdata->{'_Options'}}) { - $worksheet->write($rows_output++,0,$string); - } - return 'okay'; -} - -sub OR_build_response_data_worksheet { - my ($worksheet,$format,$performance_data,$Foils,$ORdata)=@_; - my $rows_output = 3; - my $cols_output = 0; - $worksheet->write($rows_output++,0,'Response Data',$format->{'h3'}); - $worksheet->set_column(1,1,20); - $worksheet->set_column(2,2,13); - my @Headers = ('identifier','time','award detail','attempt'); - foreach my $foil (@$Foils) { - push (@Headers,$foil.' submission'); - push (@Headers,$foil.' grading'); - } - $worksheet->write_row($rows_output++,0,\@Headers,$format->{'header'}); - # - foreach my $row (@$performance_data) { - next if (! defined($row)); - my ($student,$award,$grading,$submission,$time,$tries) = @$row; - my @Foilgrades = split('&',$grading); - my @Foilsubs = split('&',$submission); - my %response_data; - for (my $j=0;$j<=$#Foilgrades;$j++) { - my ($foilid,$correct) = split('=',$Foilgrades[$j]); - my (undef,$submission) = split('=',$Foilsubs[$j]); - $submission = &Apache::lonnet::unescape($submission); - $response_data{$foilid.' submission'}=$submission; - $response_data{$foilid.' award'}=$correct; - } - $worksheet->write($rows_output,$cols_output++,$student); - $worksheet->write($rows_output,$cols_output++, - &Apache::lonstathelpers::calc_serial($time),$format->{'date'}); - $worksheet->write($rows_output,$cols_output++,$award); - $worksheet->write($rows_output,$cols_output++,$tries); - foreach my $foilid (@$Foils) { - $worksheet->write($rows_output,$cols_output++, - $response_data{$foilid.' submission'}); - $worksheet->write($rows_output,$cols_output++, - $response_data{$foilid.' award'}); - } - $rows_output++; - $cols_output = 0; - } - return; -} - sub build_foil_index { my ($ORdata) = @_; return if (! exists($ORdata->{'_Foils'})); @@ -1609,19 +1833,18 @@ sub build_foil_key { 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 .= &Apache::lonhtmlcommon::breadcrumbs - (undef,'Detailed Problem Analysis'); + $Str .= &Apache::lonhtmlcommon::breadcrumbs('Detailed Problem Analysis'); $Str .= '
|