'."\n".
''."\n".
'');
@@ -818,15 +877,9 @@ sub sequence_html_header {
sub sequence_html_output {
my ($seq) = @_;
my $data = $SeqStat{$seq->{'symb'}};
-# $SeqStat{$symb}->{'max'}
-# $SeqStat{$symb}->{'min'}
-# $SeqStat{$symb}->{'mean'}
-# $SeqStat{$symb}->{'std'}
-# $SeqStat{$symb}->{'count'}
-# $SeqStat{$symb}->{'max_possible'}
my $row = ' ';
foreach my $field (@SeqFields) {
-# next if ($field->{'selected'} ne 'yes');
+ next if ($field->{'selected'} ne 'yes');
$row .= '{'align'})) {
$row .= ' align="'.$field->{'align'}.'"';
@@ -970,6 +1023,11 @@ sub degrees_plot {
my $diffdata .= ''.join(',',@Labels).' '.$/.
''.join(',',@Diff).' '.$/;
#
+ my $title = 'Degree of Discrimination\nand Degree of Difficulty';
+ if ($xmax > 50) {
+ $title = 'Degree of Discrimination and Degree of Difficulty';
+ }
+ #
$plot=<<"END";
- Degree of Discrmination and Degree of Difficulty
+ $title
Problem Number
'.join(',',@Mean).''.$/.
''.join(',',@STD).' '.$/;
#
+ my $title = 'Mean and S.D. of Tries';
+ if ($xmax > 25) {
+ $title = 'Mean and Standard Deviation of Tries';
+ }
+ #
$plot=<<"END";
- Mean and S.D. of Tries
+ $title
Problem Number
+ Number of Tries
'yes',
name => 'degrees',
- title => 'DoDisc and DoDiff' },
+ title => 'Difficulty Indexes' },
{ graphable=>'yes',
name => 'tries statistics',
- title => 'Mean and S.D. of Tries' });
+ title => 'Tries Statistics' });
#
my $Str= "\n".'';
$Str .= ' '."\n";
$Str .= 'none '."\n";
- foreach my $field (@Fields,@Additional_Plots) {
+ foreach my $field (@Additional_Plots,@Fields) {
if (! exists($field->{'graphable'}) ||
$field->{'graphable'} ne 'yes') {
next;
@@ -1173,6 +1237,8 @@ sub Excel_output {
}
my $excel_sheet = $excel_workbook->addworksheet(
&Apache::loncommon::clean_excel_name($sheetname));
+ #
+ my $format = &Apache::loncommon::define_excel_formats($excel_workbook);
##
## Begin creating excel sheet
##
@@ -1180,28 +1246,17 @@ sub Excel_output {
#
# Put the course description in the header
$excel_sheet->write($rows_output,$cols_output++,
- $ENV{'course.'.$ENV{'request.course.id'}.'.description'});
+ $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
+ $format->{'h1'});
$cols_output += 3;
#
# Put a description of the sections listed
my $sectionstring = '';
- my @Sections = @Apache::lonstatistics::SelectedSections;
- if (scalar(@Sections) > 1) {
- if (scalar(@Sections) > 2) {
- my $last = pop(@Sections);
- $sectionstring = "Sections ".join(', ',@Sections).', and '.$last;
- } else {
- $sectionstring = "Sections ".join(' and ',@Sections);
- }
- } else {
- if ($Sections[0] eq 'all') {
- $sectionstring = "All sections";
- } else {
- $sectionstring = "Section ".$Sections[0];
- }
- }
- $excel_sheet->write($rows_output,$cols_output++,$sectionstring);
- $cols_output += scalar(@Sections);
+ $excel_sheet->write($rows_output,$cols_output++,
+ &Apache::lonstathelpers::sections_description
+ (@Apache::lonstatistics::SelectedSections),
+ $format->{'h3'});
+ $cols_output += scalar(@Apache::lonstatistics::SelectedSections);
#
# Time restrictions
my $time_string;
@@ -1217,6 +1272,10 @@ sub Excel_output {
# See note above about lonlocal:locallocaltime
$time_string .= 'Data collected before '.localtime($endtime).'.';
}
+ if (defined($time_string)) {
+ $excel_sheet->write($rows_output,$cols_output++,$time_string);
+ $cols_output+= 5;
+ }
#
# Put the date in there too
$excel_sheet->write($rows_output,$cols_output++,
@@ -1224,38 +1283,49 @@ sub Excel_output {
#
$rows_output++;
$cols_output=0;
- #
- # Long Headers
- foreach my $field (@Fields) {
- next if ($field->{'name'} eq 'problem_num');
- next if ($field->{'selected'} ne 'yes');
- if (exists($field->{'long_title'})) {
+ ##
+ ## Sequence Statistics
+ ##
+ &write_headers($excel_sheet,$format,\$rows_output,\$cols_output,
+ \@SeqFields);
+ foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
+ next if ($seq->{'num_assess'} < 1);
+ my $data = $SeqStat{$seq->{'symb'}};
+ $cols_output=0;
+ foreach my $field (@SeqFields) {
+ next if ($field->{'selected'} ne 'yes');
+ my $fieldformat = undef;
+ if (exists($field->{'excel_format'})) {
+ $fieldformat = $format->{$field->{'excel_format'}};
+ }
$excel_sheet->write($rows_output,$cols_output++,
- $field->{'long_title'});
- } else {
- $excel_sheet->write($rows_output,$cols_output++,'');
+ $data->{$field->{'name'}},$fieldformat);
}
+ $rows_output++;
+ $cols_output=0;
}
+ ##
+ ## Resource Statistics
+ ##
$rows_output++;
$cols_output=0;
- # Brief headers
- foreach my $field (@Fields) {
- next if ($field->{'selected'} ne 'yes');
- next if ($field->{'name'} eq 'problem_num');
- # Use english for excel as I am not sure how well excel handles
- # other character sets....
- $excel_sheet->write($rows_output,$cols_output++,$field->{'title'});
- }
- $rows_output++;
+ &write_headers($excel_sheet,$format,\$rows_output,\$cols_output,
+ \@Fields);
+ #
foreach my $data (@StatsArray) {
$cols_output=0;
foreach my $field (@Fields) {
next if ($field->{'selected'} ne 'yes');
next if ($field->{'name'} eq 'problem_num');
+ my $fieldformat = undef;
+ if (exists($field->{'excel_format'})) {
+ $fieldformat = $format->{$field->{'excel_format'}};
+ }
$excel_sheet->write($rows_output,$cols_output++,
- $data->{$field->{'name'}});
+ $data->{$field->{'name'}},$fieldformat);
}
$rows_output++;
+ $cols_output=0;
}
#
$excel_workbook->close();
@@ -1268,6 +1338,44 @@ sub Excel_output {
return;
}
+##
+## &write_headers
+##
+sub write_headers {
+ my ($excel_sheet,$format,$rows_output,$cols_output,$Fields) = @_;
+ ##
+ ## First the long titles
+ foreach my $field (@{$Fields}) {
+ next if ($field->{'name'} eq 'problem_num');
+ next if ($field->{'selected'} ne 'yes');
+ if (exists($field->{'long_title'})) {
+ $excel_sheet->write($$rows_output,${$cols_output},
+ $field->{'long_title'},
+ $format->{'bold'});
+ } else {
+ $excel_sheet->write($$rows_output,${$cols_output},'');
+ }
+ ${$cols_output}+= 1;
+ }
+ ${$cols_output} =0;
+ ${$rows_output}+=1;
+ ##
+ ## Then the short titles
+ foreach my $field (@{$Fields}) {
+ next if ($field->{'selected'} ne 'yes');
+ next if ($field->{'name'} eq 'problem_num');
+ # Use english for excel as I am not sure how well excel handles
+ # other character sets....
+ $excel_sheet->write($$rows_output,$$cols_output,
+ $field->{'title'},
+ $format->{'bold'});
+ $$cols_output+=1;
+ }
+ ${$cols_output} =0;
+ ${$rows_output}+=1;
+ return;
+}
+
##################################################
##################################################
##
@@ -1281,6 +1389,7 @@ sub compute_statistics_on_sequence {
foreach my $res (@{$seq->{'contents'}}) {
next if ($res->{'type'} ne 'assessment');
foreach my $part (@{$res->{'parts'}}) {
+ next if ($res->{'partdata'}->{$part}->{'Survey'});
#
# This is where all the work happens
my $data = &get_statistics($seq,$res,$part,scalar(@StatsArray)+1);
@@ -1301,6 +1410,7 @@ sub compute_all_statistics {
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
last if ($c->aborted);
next if ($seq->{'num_assess'} < 1);
+ &compute_sequence_statistics($seq);
&compute_statistics_on_sequence($seq);
}
}
@@ -1393,6 +1503,7 @@ sub get_statistics {
(\@Apache::lonstatistics::SelectedSections,
$Apache::lonstatistics::enrollment_status,
$symb,$part,$courseid,$starttime,$endtime);
+ $data->{'symb'} = $symb;
$data->{'part'} = $part;
$data->{'problem_num'} = $problem_num;
$data->{'container'} = $sequence->{'title'};
@@ -1404,6 +1515,28 @@ sub get_statistics {
$data->{'deg_of_disc'} =
&compute_discrimination_factor($resource,$part,$sequence);
}
+ #
+ # Store in metadata if computations were done for all students
+ if ($data->{'num_students'} > 1) {
+ my @Sections = @Apache::lonstatistics::SelectedSections;
+ my $sections = '"'.join(' ',@Sections).'"';
+ $sections =~ s/&+/_/g; # Ensure no special characters
+ $data->{'sections'}=$sections;
+ $data->{'course'} = $ENV{'request.course.id'};
+ my $urlres=(&Apache::lonnet::decode_symb($resource->{'symb'}))[2];
+ $data->{'urlres'}=$urlres;
+ my %storestats =
+ &LONCAPA::lonmetadata::dynamic_metadata_storage($data);
+ my ($dom,$user) = $urlres=~/^(\w+)\/(\w+)/;
+ &Apache::lonnet::put('nohist_resevaldata',\%storestats,$dom,$user);
+ }
+ #
+ # Get the due date for research purposes (commented out most of the time)
+# $data->{'duedate'} =
+# &Apache::lonnet::EXT('resource.'.$part.'.duedate',$symb);
+# $data->{'opendate'} =
+# &Apache::lonnet::EXT('resource.'.$part.'.opendate',$symb);
+# $data->{'resptypes'} = join(',',@{$resource->{'partdata'}->{$part}->{'ResponseTypes'}});
return $data;
}
@@ -1431,11 +1564,13 @@ sub compute_discrimination_factor {
}
#
# rank
+ my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();
my $ranking =
&Apache::loncoursedata::rank_students_by_scores_on_resources
(\@Resources,
\@Apache::lonstatistics::SelectedSections,
- $Apache::lonstatistics::enrollment_status,undef);
+ $Apache::lonstatistics::enrollment_status,undef,
+ $starttime,$endtime);
#
# compute their percent scores on the problems in the sequence,
my $number_to_grab = int(scalar(@{$ranking})/4);
@@ -1447,9 +1582,11 @@ sub compute_discrimination_factor {
$_->[&Apache::loncoursedata::RNK_student()];
} @{$ranking}[($num_students-$number_to_grab)..($num_students-1)];
my ($bottom_sum,$bottom_max) =
- &Apache::loncoursedata::get_sum_of_scores($resource,$part,\@BottomSet);
+ &Apache::loncoursedata::get_sum_of_scores($resource,$part,\@BottomSet,
+ undef,$starttime,$endtime);
my ($top_sum,$top_max) =
- &Apache::loncoursedata::get_sum_of_scores($resource,$part,\@TopSet);
+ &Apache::loncoursedata::get_sum_of_scores($resource,$part,\@TopSet,
+ undef,$starttime,$endtime);
my $deg_of_disc;
if ($top_max == 0 || $bottom_max==0) {
$deg_of_disc = 'nan';
@@ -1519,10 +1656,10 @@ sub compute_sequence_statistics {
$SeqStat{$symb}->{'countmax'} = $cmax;
$SeqStat{$symb}->{'countmin'} = $cmin;
$SeqStat{$symb}->{'countstd'} = $cSTD;
+ $SeqStat{$symb}->{'countmean'} = $cMean;
$SeqStat{$symb}->{'count'} = $ccount;
$SeqStat{$symb}->{'items'} = $K;
$SeqStat{$symb}->{'KR-21'}=$kr_21;
-
return;
}