version 1.20, 2002/08/13 12:21:46
|
version 1.22, 2002/08/13 15:01:07
|
Line 52 sub BuildProblemStatisticsPage {
|
Line 52 sub BuildProblemStatisticsPage {
|
$jr = $r; |
$jr = $r; |
|
|
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
return '<html><body>Unable to tie database.</body></html>'; |
$r->print('Unable to tie database.'); |
|
return; |
} |
} |
|
|
my $Ptr = ''; |
my $Ptr = ''; |
Line 78 sub BuildProblemStatisticsPage {
|
Line 79 sub BuildProblemStatisticsPage {
|
$r->print($Ptr); |
$r->print($Ptr); |
$r->rflush(); |
$r->rflush(); |
|
|
untie(%cache); |
|
|
|
&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students,'true', |
|
$cacheDB,'true', |
|
'true',$courseID, |
|
$r, $c); |
|
if($c->aborted()) { return; } |
|
|
|
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
|
return '<html><body>Unable to tie database.</body></html>'; |
|
} |
|
|
|
my @Header = ("Homework Sets Order","#Stdnts","Tries","Mod", |
my @Header = ("Homework Sets Order","#Stdnts","Tries","Mod", |
"Mean","#YES","#yes","%Wrng","DoDiff", |
"Mean","#YES","#yes","%Wrng","DoDiff", |
"S.D.","Skew.","D.F.1st","D.F.2nd","Disc."); |
"S.D.","Skew.","D.F.1st","D.F.2nd","Disc."); |
Line 97 sub BuildProblemStatisticsPage {
|
Line 86 sub BuildProblemStatisticsPage {
|
|
|
# my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID); |
# my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID); |
# my ($upper, $lower) = &Discriminant(\%discriminant,$r); |
# my ($upper, $lower) = &Discriminant(\%discriminant,$r); |
my ($problemData) = &ExtractStudentData(\%cache, $students); |
if(!defined($cache{'StatisticsCached'})) { |
&CalculateStatistics($problemData); |
untie(%cache); |
&SortProblems($problemData, $cache{'ProblemStatisticsSort'}, |
&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students, |
$cache{'ProblemStatisticsAscend'}); |
'true', |
#$TempCache= |
$cacheDB, |
&BuildStatisticsTable(\%cache, $cache{'DisplayFormat'}, |
'true', |
$problemData, \@Header, $r, $color); |
'true', |
untie(%cache); |
$courseID, |
|
$r, $c); |
# foreach (keys %$TempCache) { |
if($c->aborted()) { return; } |
# last if ($c->aborted()); |
|
# if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) { |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
# $cache{$_}=$TempCache->{$_}; |
$r->print('Unable to tie database.'); |
# untie(%cache); |
return; |
# } |
} |
# } |
my ($problemData) = &ExtractStudentData(\%cache, $students); |
|
&CalculateStatistics($problemData); |
|
untie(%cache); |
|
|
|
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) { |
|
$r->print('Unable to tie database.'); |
|
return; |
|
} |
|
foreach(keys(%$problemData)) { |
|
$cache{$_} = $problemData->{$_}; |
|
} |
|
$cache{'StatisticsCached'} = 'true'; |
|
untie(%cache); |
|
|
# if($c->aborted()) { return; } |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
# untie(%cache); |
$r->print('Unable to tie database.'); |
|
return; |
|
} |
|
} |
|
my $orderedProblems = &SortProblems(\%cache, |
|
$cache{'ProblemStatisticsSort'}, |
|
$cache{'ProblemStatisticsAscend'}); |
|
&BuildStatisticsTable(\%cache, $cache{'DisplayFormat'}, $orderedProblems, |
|
\@Header, $r, $color); |
|
untie(%cache); |
|
|
return; |
return; |
} |
} |
Line 141 sub CreateProblemStatisticsTableHeading
|
Line 151 sub CreateProblemStatisticsTableHeading
|
} |
} |
|
|
sub BuildStatisticsTable { |
sub BuildStatisticsTable { |
my ($cache,$displayFormat,$data,$headings,$r,$color)=@_; |
my ($cache,$displayFormat,$orderedProblems,$headings,$r,$color)=@_; |
|
|
#6666666 |
#6666666 |
# my $file="/home/httpd/perl/tmp/183d.txt"; |
# my $file="/home/httpd/perl/tmp/183d.txt"; |
Line 157 sub BuildStatisticsTable {
|
Line 167 sub BuildStatisticsTable {
|
##777777 |
##777777 |
## $Str .= &Classify($discriminantFactor, $students); |
## $Str .= &Classify($discriminantFactor, $students); |
|
|
my %TempCache; |
if($displayFormat ne 'Display CSV Format') { |
my $problems = $data->{'problemList'}; |
|
if($displayFormat ne 'Display CSV Format') { |
|
$r->print('<table border="0"><tr><td bgcolor="#777777">'."\n"); |
$r->print('<table border="0"><tr><td bgcolor="#777777">'."\n"); |
$r->print('<table border="0" cellpadding="3">'."\n"); |
$r->print('<table border="0" cellpadding="3">'."\n"); |
$r->print(&CreateProblemStatisticsTableHeading($headings, $r)); |
$r->print(&CreateProblemStatisticsTableHeading($headings, $r)); |
Line 168 sub BuildStatisticsTable {
|
Line 176 sub BuildStatisticsTable {
|
} |
} |
|
|
my $count = 1; |
my $count = 1; |
foreach(@$problems) { |
foreach(@$orderedProblems) { |
my ($sequence,$problem,$part)=split(':', $_); |
my ($sequence,$problem,$part)=split(':', $_); |
# my $problemRef = '<a href="'.$cache->{$problem.':source'}. |
# if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' && |
# '" target="_blank">'.$cache->{$problem.':title'}.'</a>'; |
# $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) { |
|
# next; |
|
# } |
|
|
|
|
my $ref = $cache->{$problem.':title'}; |
my $ref = '<a href="'.$cache->{$problem.':source'}. |
|
'" target="_blank">'.$cache->{$problem.':title'}.'</a>'; |
|
# my $ref = $cache->{$problem.':title'}; |
my $title = $cache->{$problem.':title'}; |
my $title = $cache->{$problem.':title'}; |
my $source = 'source'; |
my $source = 'source'; |
my $tableData = join('&', $ref, $title, $source, |
my $tableData = join('&', $ref, $title, $source, |
$data->{$_.':studentCount'}, |
$cache->{$_.':studentCount'}, |
$data->{$_.':totalTries'}, |
$cache->{$_.':totalTries'}, |
$data->{$_.':maxTries'}, |
$cache->{$_.':maxTries'}, |
sprintf("%.2f", $data->{$_.':mean'}), |
sprintf("%.2f", $cache->{$_.':mean'}), |
$data->{$_.':correct'}, |
$cache->{$_.':correct'}, |
$data->{$_.':correctByOverride'}, |
$cache->{$_.':correctByOverride'}, |
sprintf("%.1f", $data->{$_.':percentWrong'}), |
sprintf("%.1f", $cache->{$_.':percentWrong'}), |
sprintf("%.2f", $data->{$_.':degreeOfDifficulty'}), |
sprintf("%.2f", $cache->{$_.':degreeOfDifficulty'}), |
sprintf("%.1f", $data->{$_.':standardDeviation'}), |
sprintf("%.1f", $cache->{$_.':standardDeviation'}), |
sprintf("%.1f", $data->{$_.':skewness'}), |
sprintf("%.1f", $cache->{$_.':skewness'}), |
sprintf("%.2f", $data->{$_.':discriminationFactor1'}), |
sprintf("%.2f", $cache->{$_.':discriminationFactor1'}), |
sprintf("%.2f", $data->{$_.':discriminationFactor2'}), |
sprintf("%.2f", $cache->{$_.':discriminationFactor2'}), |
0); # 0 is for discussion, need to figure out |
0); # 0 is for discussion, need to figure out |
# $TempCache{'CacheTable:'.$_}=$join; |
|
|
|
#6666666 |
#6666666 |
# $r->print('<br>'.$out.'&'.$DoD); |
# $r->print('<br>'.$out.'&'.$DoD); |
Line 205 sub BuildStatisticsTable {
|
Line 217 sub BuildStatisticsTable {
|
# } |
# } |
#-------------------------------- Row of statistical table |
#-------------------------------- Row of statistical table |
&TableRow($displayFormat,$tableData,$count,$r,$color); |
&TableRow($displayFormat,$tableData,$count,$r,$color); |
# $GraphDat->{'GraphGif:'.($count-1)}=$DoD.':'.$Wrng; |
|
$count++; |
$count++; |
} |
} |
# $TempCache{'ProblemCount'}=$count; |
|
if($cache->{'DisplayFormat'} ne 'Display CSV Format') { |
if($cache->{'DisplayFormat'} ne 'Display CSV Format') { |
$r->print('</table>'."\n"); |
$r->print('</table>'."\n"); |
} |
} |
Line 216 sub BuildStatisticsTable {
|
Line 226 sub BuildStatisticsTable {
|
#6666666 |
#6666666 |
# close( OUT ); |
# close( OUT ); |
#666666 |
#666666 |
return \%TempCache; |
return; |
} |
|
|
|
=pod |
|
sub CacheStatisticsTable { |
|
my ($state,$cache,$headings,$r,$color)=@_; |
|
my @list = (); |
|
my %TempCache; |
|
my %myHeader = reverse( %$headings ); |
|
my $pos = $myHeader{$state}; |
|
if ($pos > 0) {$pos++;} |
|
my $p_count = $cache->{'ProblemCount'}; |
|
|
|
for ( my $k=0; $k<$p_count;$k++) { |
|
my $key=$cache->{'CacheTable:'.$k}; |
|
my @Temp=split(/\&/,$key); |
|
$list[$k]=$Temp[$pos].'+'.$key; |
|
} |
|
|
|
if ($pos>0) { |
|
@list = sort OrderedSort (@list); |
|
} else { |
|
@list = sort (@list); |
|
} |
|
my $cIdx=0; |
|
|
|
if ( $pos == 0 ) { |
|
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
|
if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' && |
|
$cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) { |
|
next; |
|
} |
|
if ($cIdx==$p_count) { |
|
return \%TempCache; |
|
} |
|
$r->print(&CreateProblemStatisticsTableHeading( |
|
$cache->{'DisplayFormat'}, |
|
$cache->{$sequence.':source'}, |
|
$cache->{$sequence.':title'}, |
|
$headings,$r)); |
|
|
|
my ($tar)=split(/\&/,$list[$cIdx]); |
|
$tar=~s/\+//eg; |
|
my ($SqOrd)=split(/\@/,$tar); |
|
$sequence+=100; |
|
while ($SqOrd==$sequence && $cIdx<$p_count) { |
|
my($Pre, $Post) = split(/\+/,$list[$cIdx]); |
|
&TableRow($cache,$Post,$cIdx,$cIdx,$r,$color,\%TempCache); |
|
$cIdx++; |
|
my ($tar)=split(/\&/,$list[$cIdx]); |
|
$tar=~s/\+//eg; |
|
($SqOrd)=split(/\@/,$tar); |
|
} |
|
&CloseTable($cache,$r); |
|
} |
|
} |
|
else { |
|
$r->print(&CreateProblemStatisticsTableHeading( |
|
$cache->{'DisplayFormat'}, |
|
'Sorted by: ', |
|
$headings->{$pos-1}, |
|
$headings,$r)); |
|
for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) { |
|
my($Pre, $Post) = split(/\+/,$list[$nIndex]); |
|
&TableRow($cache,$Post,$nIndex,$nIndex,$r,$color,\%TempCache); |
|
} |
|
&CloseTable($cache,$r); |
|
} |
|
|
|
return \%TempCache; |
|
} |
} |
=cut |
|
|
|
sub TableRow { |
sub TableRow { |
my ($displayFormat,$Str,$RealIdx,$r,$color)=@_; |
my ($displayFormat,$Str,$RealIdx,$r,$color)=@_; |
Line 454 sub ExtractStudentData {
|
Line 394 sub ExtractStudentData {
|
my @problemList=(); |
my @problemList=(); |
my %problemData; |
my %problemData; |
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
foreach my $sequence (split(':', $cache->{'orderedSequences'})) { |
if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' && |
|
$cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) { |
|
next; |
|
} |
|
|
|
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) { |
foreach my $part (split(/\:/,$cache->{$sequence.':'. |
foreach my $part (split(/\:/,$cache->{$sequence.':'. |
$problemID. |
$problemID. |
Line 518 sub ExtractStudentData {
|
Line 453 sub ExtractStudentData {
|
} |
} |
} |
} |
|
|
$problemData{'problemList'} = \@problemList; |
$problemData{'problemList'} = join(':::', @problemList); |
# $Discussed=0; |
# $Discussed=0; |
# if($Discuss->{"$name:$problem"}) { |
# if($Discuss->{"$name:$problem"}) { |
# $TotDiscuss++; |
# $TotDiscuss++; |
Line 531 sub ExtractStudentData {
|
Line 466 sub ExtractStudentData {
|
sub SortProblems { |
sub SortProblems { |
my ($problemData,$sortBy,$ascend)=@_; |
my ($problemData,$sortBy,$ascend)=@_; |
|
|
|
my @problems = split(':::', $problemData->{'problemList'}); |
if($sortBy eq "Homework Sets Order") { |
if($sortBy eq "Homework Sets Order") { |
return; |
return \@problems; |
} |
} |
|
|
my $data; |
my $data; |
Line 550 sub SortProblems {
|
Line 486 sub SortProblems {
|
elsif($sortBy eq "D.F.1st") { $data = ':discriminantFactor1'; } |
elsif($sortBy eq "D.F.1st") { $data = ':discriminantFactor1'; } |
elsif($sortBy eq "D.F.2nd") { $data = ':discriminantFactor2'; } |
elsif($sortBy eq "D.F.2nd") { $data = ':discriminantFactor2'; } |
elsif($sortBy eq "Disc.") { $data = ''; } |
elsif($sortBy eq "Disc.") { $data = ''; } |
else { return; } |
else { return \@problems; } |
|
|
my $problems = $problemData->{'problemList'}; |
|
my @orderedProblems = |
my @orderedProblems = |
sort { $problemData->{$a.$data} <=> $problemData->{$b.$data} } |
sort { $problemData->{$a.$data} <=> $problemData->{$b.$data} } |
@$problems; |
@problems; |
if($ascend eq 'Descending') { |
if($ascend eq 'Descending') { |
@orderedProblems = reverse(@orderedProblems); |
@orderedProblems = reverse(@orderedProblems); |
} |
} |
|
|
$problemData->{'problemList'} = \@orderedProblems; |
return \@orderedProblems; |
|
|
return; |
|
} |
} |
|
|
sub CalculateStatistics { |
sub CalculateStatistics { |
my ($data)=@_; |
my ($data)=@_; |
|
|
my $problems = $data->{'problemList'}; |
my @problems = split(':::', $data->{'problemList'}); |
foreach(@$problems) { |
foreach(@problems) { |
# Mean |
# Mean |
$data->{$_.':mean'} = ($data->{$_.':studentCount'}) ? |
$data->{$_.':mean'} = ($data->{$_.':studentCount'}) ? |
($data->{$_.':totalTries'} / $data->{$_.':studentCount'}) : 0; |
($data->{$_.':totalTries'} / $data->{$_.':studentCount'}) : 0; |
Line 694 sub Discriminant {
|
Line 627 sub Discriminant {
|
# ------------------------------------------- Prepare data for Graphical chart |
# ------------------------------------------- Prepare data for Graphical chart |
|
|
sub BuildGraphicChart { |
sub BuildGraphicChart { |
my ($ylab,$r,$cacheDB)=@_; |
my ($graph,$cacheDB,$courseDescription,$r)=@_; |
my %cache; |
my %cache; |
my $Col; |
my $max = 0; |
my $data=''; |
|
my $count = 0; |
|
my $Max = 0; |
|
|
|
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
return '<html><body>Unable to tie database.</body></html>'; |
return '<html><body>Unable to tie database.</body></html>'; |
} |
} |
|
|
my $p_count = $cache{'ProblemCount'}; |
my @problems = split(':::', $cache{'problemList'}); |
|
my @values = (); |
for ( my $k=0; $k<$p_count;$k++) { |
foreach (@problems) { |
my @Temp=split(/\:/,$cache{'GraphGif:'.$k}); |
my $data = 0; |
my $inf = $Temp[$Col]; |
if($graph eq 'DoDiffGraph') { |
if ( $Max < $inf ) {$Max = $inf;} |
$data = sprintf("%.2f", $cache{$_.':degreeOfDifficulty'}), |
$data .= $inf.','; |
} else { |
$count++; |
$data = sprintf("%.1f", $cache{$_.':percentWrong'}), |
|
} |
|
if($max < $data) { |
|
$max = $data; |
|
} |
|
push(@values, $data); |
} |
} |
untie(%cache); |
untie(%cache); |
# $r->print("<br>count=$p_count >>data= $data"); |
|
|
|
if ( $Max > 1 ) { |
my $sendValues = join(',', @values); |
$Max += (10 - $Max % 10); |
# my $sendCount = $#values; |
$Max = int($Max); |
my $sendCount = scalar(@values); |
} else { $Max = 1; } |
|
|
my $title = ''; |
my $cid=$ENV{'request.course.id'}; |
if($graph eq 'DoDiffGraph') { |
|
$title = 'Degree-of-Difficulty'; |
if ( $ylab eq 'DoDiff Graph' ) { |
|
$ylab = 'Degree-of-Difficulty'; |
|
$Col = 0; |
|
} else { |
} else { |
$ylab = 'Wrong-Percentage'; |
$title = 'Wrong-Percentage'; |
$Col = 1; |
|
} |
} |
my $Course = $ENV{'course.'.$cid.'.description'}; |
my @GData = ($courseDescription, 'Problems', $title, $max, $sendCount, |
$Course =~ s/\ /"_"/eg; |
$sendValues); |
my $GData=$Course.'&'.'Problems#'.'&'.$ylab.'&'. |
|
$Max.'&'.$count.'&'.$data; |
|
|
|
$r->print('<IMG src="/cgi-bin/graph.gif?'.$GData.'" />'); |
$r->print('</form>'."\n"); |
|
$r->print('<IMG src="/cgi-bin/graph.gif?'.(join('&', @GData)).'" border="1" />'); |
|
$r->print('<form>'."\n"); |
|
|
return; |
return; |
} |
} |