'."\n");
+ $r->print(''."\n");
+ $r->print(&CreateProblemStatisticsTableHeading($headings, $r));
+ } else {
+ if($sortProblems eq 'Sort Within Sequence') {
+ $r->print('"'.$cache->{$sequence.':title'}.'"');
}
- $discrim .= '&';
-
- my ($pr_no,$dod)=split('&',$ptr);
-# my $DoDiff=$DoDiff->{$dod};
-# $r->print(' '.$name.'---'.$ptr.'==='.$DoDiff);
-
- my $Fac = ($partData{$_.':tries'}) ?
- ($partData{$_.':awarded'}/$partData{$_.':tries'}) : 0;
- my $DisF;
- if($Fac > 0 && $Fac < 1) {
- $DisF = sprintf( "%.4f", $Fac );
- } else {
- $DisF = $Fac;
- }
-
- if ($Discuss->{"$name:$problem"}) {
- $TotDiscuss++;
- $Discussed=1;
- }
- my $time = $cache->{"$name:$LatestVersion:$problem:timestamp"};
- $discrim .= $tempSequenceOrder.'@'.$pOrder.'='.$DisF.'+'.$Yes;
- $ptr .= '&'.$partData{$_.':tries'}.
- '&'.$partData{$_.':wrong'}.
- '&'.$partData{$_.':code'};
- push (@$list, $ptr."&$Discussed");
-# $r->print(' '.$_.$name.'---'.$ptr);
-
-#### if ($DoDiff>0.85) {
-
- $TimeTot += $time;
-
- if ($Yes==1 && $partData{$_.':tries'}==1) {
- $TotFirst++;
- }
-# my $Acts= $Activity->{$name.':'.$problem};
-# if ($Acts) {
-# my $Pt=&ProcAct( $Acts, $time );
- #my ($spe,$beg) = split(/\+/,$Pt);
-# my $spe= $Pt;
-# if ($Yes==1) {$spent_yes += $spe;}
-# $spent += $spe;
- #$Beg += $beg;
-# $r->print(' '.$name.'---'.$problem.'---'.$spe);
-# }
- $TotalOpend++;
- $ProbTot++;
-
- $tempProblemOrder++;
+ $r->print(' ');
}
+ $currentSequence = $sequence;
}
- }
- my $pstr;
- if($totalTries) {
- my $DisFac = ($totalAwarded/$totalTries);
- my $DisFactor = sprintf( "%.4f", $DisFac );
- my $TS = sprintf( "%.2f", $spent );
- my $TS_yes = sprintf( "%.2f", $spent_yes );
- $pstr=$DisFactor.':'.$name.':'.$ProbTot.':'.$TotalOpend.':'.
- $totalTries.':'.$ProbSolved.':'.$TotFirst.':'.
- $TS_yes.':'.$TS.':'.$TotDiscuss;
- (%$discriminant)->{$pstr}=$discrim;
- }
-}
-
-sub NumericSort {
- $a <=> $b;
-}
-
-sub OrderedSort {
- if ($ENV{'form.order'} eq 'Descending') {
- $b <=> $a;
- } else {
- $a <=> $b;
- }
-}
-
+ my $ref = ''.$cache->{$problem.':title'}.'';
+ my $title = $cache->{$problem.':title'};
+ if($part != 0) {
+ $title .= ' Part '.$part;
+ }
+ my $source = $cache->{$problem.':source'};
+ my $tableData = join('&', $ref, $title, $source,
+ $cache->{$_.':studentCount'},
+ $cache->{$_.':totalTries'},
+ $cache->{$_.':maxTries'},
+ $cache->{$_.':mean'},
+ $cache->{$_.':correct'},
+ $cache->{$_.':correctByOverride'},
+ $cache->{$_.':percentWrong'},
+ $cache->{$_.':degreeOfDifficulty'},
+ $cache->{$_.':standardDeviation'},
+ $cache->{$_.':skewness'},
+ $cache->{$_.':discriminationFactor1'},
+ $cache->{$_.':discriminationFactor2'});
-sub BuildStatisticsTable {
- my ($cache,$upper,$lower,$list,$headings,$students,$r,$color)=@_;
- my $NoElements = scalar @$list;
- my @list=sort(@$list);
-
-#6666666
-# my $file="/home/httpd/perl/tmp/183d.txt";
-# open(OUT, ">$file");
-#6666666
-## &Apache::lonstatistics::Create_PrgWin($r);
-##777777
-## my (%Activity) = &LoadActivityLog();
-## $r->print('');
-## my ($doDiffFile) = &LoadDoDiffFile();
-
-##777777
-## $Str .= &Classify($discriminantFactor, $students);
-
- my $p_count = 0;
- my $dummy;
- my $p_val;
- my $ResId;
- my %TempCache;
- my $cIdx=0;
+ &TableRow($displayFormat,$tableData,$count,$r,$color);
- foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
- if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' &&
- $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {
- next;
- }
- &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'},
- $cache->{$sequence.':source'},
- $cache->{$sequence.':title'},
- $headings,$r);
- my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,
- $list[$cIdx]);
- my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);
- $sequence+=100;
- while ($SqOrd==$sequence && $cIdx<$NoElements) {
- my %storestats=();
- my $pOrd=$PrOrd;
- my $Temp = $Prob;
- my $MxTries = 0;
- my $TotalTries = 0;
- my $YES = 0;
- my $Incorrect = 0;
- my $Override = 0;
- my $StdNo = 0;
- my $DiscNo=0;
- my @StdLst;
- while ($pOrd==$PrOrd && $cIdx<$NoElements)
- {
- $cIdx++;
- $StdNo++;
- $StdLst[ $StdNo ] = $Tries;
- $TotalTries += $Tries;
- if ( $MxTries < $Tries ) { $MxTries = $Tries; }
- if ( $Code eq 'C' ){ $YES++; }
- elsif( $Code eq 'I' ) { $Incorrect++; }
- elsif( $Code eq 'O' ) { $Override++; }
- elsif( $Code eq '-' ) { $StdNo--; }
- ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,
- $list[$cIdx]);
- ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);
- }
-
- $p_count++;
- my $Dummy;
- ($ResId,$Dummy)=split(/\*/,$Temp);
- $Temp = ''.$cache->{$ResId.':title'}.$Dummy.'';
-
-# my $urlres = $cache->{$sequence.':source'});
-#check with Gerd
- #symb of the problem (already decluttered and cleaned)
- my $urlres = $cache->{$ResId.':problem'};
-
-#------------------------ Compute the Average of Tries about one problem
- my $Average = ($StdNo) ? $TotalTries/$StdNo : 0;
-
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time;
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo;
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average;
-
-#-------------------------------- Compute percentage of Wrong tries
- my $Wrong = ( $StdNo ) ? 100 * ( $Incorrect / $StdNo ) : 0;
-
-#-------------------------------- Compute Standard Deviation
- my $StdDev = 0;
- if ( $StdNo > 1 ) {
- for ( my $n = 0; $n < $StdNo; $n++ ) {
- my $Dif = $StdLst[ $n ]-$Average;
- $StdDev += $Dif*$Dif;
- }
- $StdDev /= ( $StdNo - 1 );
- $StdDev = sqrt( $StdDev );
- }
-
-#-------------------------------- Compute Degree of Difficulty
- my $DoDiff = 0;
- if( $TotalTries > 0 ) {
- $DoDiff = 1 - ( ( $YES + $Override ) / $TotalTries );
-# $DoDiff = ($TotalTries)/($YES + $Override+ 0.1);
- }
-
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___difficulty'}=$DoDiff;
-
-#-------------------------------- Compute the Skewness
- my $Skewness = 0;
- my $Sum = 0;
- if ( $StdNo > 0 && $StdDev > 0 ) {
- for ( my $n = 0; $n < $StdNo; $n++ ) {
- my $Dif = $StdLst[ $n ]-$Average;
- $Skewness += $Dif*$Dif*$Dif;
- }
- $Skewness /= $StdNo;
- $Skewness /= $StdDev*$StdDev*$StdDev;
- }
-
-#--------------------- Compute the Discrimination Factors
- my ($Up1,$Up2)=split(/\:/,$upper->{$sequence.'@'.$pOrd});
- my ($Lw1,$Lw2)=split(/\:/,$lower->{$sequence.'@'.$pOrd});
-
- my $Dis1 = $Up1 - $Lw1;
- my $Dis2 = $Up2 - $Lw2;
- my $_D1 = sprintf("%.2f", $Dis1);
- my $_D2 = sprintf("%.2f", $Dis2);
-
-#----------------- Some restition in presenting the float numbers
- my $Avg = sprintf( "%.2f", $Average );
- my $Wrng = sprintf( "%.1f", $Wrong );
- my $SD = sprintf( "%.1f", $StdDev );
- my $DoD = sprintf( "%.2f", $DoDiff );
- my $Sk = sprintf( "%.1f", $Skewness );
- my $join = $sequence.'@'.$pOrd.'&'.$Temp.'&'.$StdNo.'&'.
- $TotalTries.'&'.$MxTries.'&'.$Avg.'&'.
- $YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'.
- $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.
- $DiscNo.'&'.$Prob;
-
- $TempCache{'CacheTable:'.($p_count-1)}=$join;
-
-#6666666
-# $r->print(' '.$out.'&'.$DoD);
-# print (OUT $out.'@'.$DoD.'&');
-#6666666
-
-#check with Gerd
- $urlres=~/^(\w+)\/(\w+)/;
- if ($StdNo) {
- &Apache::lonnet::put('resevaldata',\%storestats,$1,$2);
- }
-#-------------------------------- Row of statistical table
- &TableRow($cache,$join,$cIdx,($p_count-1),$r,$color,
- \%TempCache);
- }
- $TempCache{'ProblemCount'}=$p_count;
- &CloseTable($cache,$r);
- }
-### &Close_PrgWin();
-#6666666
-# close( OUT );
-#666666
- return \%TempCache;
-}
-
-
-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);
+ $count++;
}
- 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;
- }
- &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 {
- &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);
+ if($displayFormat ne 'Display CSV Format') {
+ $r->print(' '."\n");
+ $r->print(' |