Diff for /loncom/interface/statistics/lonproblemstatistics.pm between versions 1.10 and 1.16

version 1.10, 2002/08/02 12:41:20 version 1.16, 2002/08/06 17:38:26
Line 31 Line 31
 # 11/1,11/4,11/16,12/14,12/16,12/18,12/20,12/31 Behrouz Minaei  # 11/1,11/4,11/16,12/14,12/16,12/18,12/20,12/31 Behrouz Minaei
 # YEAR=2002  # YEAR=2002
 # 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6 Behrouz Minaei  # 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6 Behrouz Minaei
 # 5/12,5/14,5/15,5/19,5/26,7/16,7/25,7/29  Behrouz Minaei  # 5/12,5/14,5/15,5/19,5/26,7/16,7/25,7/29,8/5  Behrouz Minaei
 #  #
 ###  ###
   
Line 47  use GDBM_File; Line 47  use GDBM_File;
 sub BuildProblemStatisticsPage {  sub BuildProblemStatisticsPage {
     my ($cacheDB, $students, $courseID, $c, $r)=@_;      my ($cacheDB, $students, $courseID, $c, $r)=@_;
     my %cache;      my %cache;
     #my %DoDiff;  
     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>';
     }      }
Line 70  sub BuildProblemStatisticsPage { Line 70  sub BuildProblemStatisticsPage {
     $Ptr .= '</table>';      $Ptr .= '</table>';
     $Ptr .= &ProblemStatisticsLegend();      $Ptr .= &ProblemStatisticsLegend();
     $r->print($Ptr);      $r->print($Ptr);
       $r->rflush();
   
     untie(%cache);      untie(%cache);
       &Create_PrgWin($r);
       my $count=0;
     foreach (@$students) {      foreach (@$students) {
           &Update_PrgWin(scalar(@$students),$count,$_,$r);
         my $courseData =           my $courseData = 
             &Apache::loncoursedata::DownloadCourseInformation($_, $courseID);              &Apache::loncoursedata::DownloadCourseInformation($_, $courseID);
         last if ($c->aborted());          last if ($c->aborted());
Line 81  sub BuildProblemStatisticsPage { Line 85  sub BuildProblemStatisticsPage {
                                                        $courseData, $_);                                                         $courseData, $_);
             untie(%cache);              untie(%cache);
         }          }
           $count++;
     }      }
       &Close_PrgWin($r);
     if($c->aborted()) { return; }      if($c->aborted()) { return; }
   
     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 %discriminant=();  
     my @list=();  
     my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID);  
     my $index=0;  
     foreach (@$students) {  
  $index++;  
  #&Apache::lonstatistics::Update_PrgWin(++$index,$r);  
         &ExtractStudentData(\%cache, $_, \@list,\%Discuss, $r, \%discriminant);  
     }  
     #&Apache::lonstatistics::Close_PrgWin($r);  
    
     my ($upper, $lower) = &Discriminant(\%discriminant,$r);  
     my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod",      my %Header = (0,"Homework Sets Order",1,"#Stdnts",2,"Tries",3,"Mod",
                   4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff",                    4,"Mean",5,"#YES",6,"#yes",7,"%Wrng",8,"DoDiff",
                   9,"S.D.",10,"Skew.",11,"D.F.1st",12,"D.F.2nd", 13, "Disc.");                    9,"S.D.",10,"Skew.",11,"D.F.1st",12,"D.F.2nd", 13, "Disc.");
     my $color=&setbgcolor(0);      my $color=&setbgcolor(0);
     my %GraphDat= &BuildStatisticsTable(\%cache, $upper, $lower, \@list,   
                                         \%Header, $students, $r, $color);  
     untie(%cache);  
 }  
   
       my $state=$ENV{'form.ProblemStatisticsHeading'}; 
   
 #---- Problem Statistics Web Page ---------------------------------------      my $TempCache;
   
       if ($state) {
    $TempCache=&CacheStatisticsTable($state,\%cache,\%Header,
    $r,$color);
       } else {    
    my %discriminant=();
    my @list=();
    my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID);
    my $index=0;
    foreach (@$students) {
       $index++;
       &ExtractStudentData(\%cache, $_, \@list,\%Discuss, $r,
                                   \%discriminant);
    }
    my ($upper, $lower) = &Discriminant(\%discriminant,$r);
    $TempCache= &BuildStatisticsTable(\%cache, $upper, $lower, 
      \@list, \%Header, $students,
      $r, $color);
       }
       untie(%cache);
   
 sub NumericSort {                foreach (keys %$TempCache) {
     $a <=> $b;          last if ($c->aborted());
           if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT,0640)) {
       $cache{$_}=$TempCache->{$_};
   
               untie(%cache);
           }
       }
       if($c->aborted()) { return; }
       untie(%cache);
 }  }
   
   
   #---- Problem Statistics Web Page ---------------------------------------
   
 sub CreateProblemStatisticsTableHeading {  sub CreateProblemStatisticsTableHeading {
     my ($displayFormat,$sequenceSource,$sequenceTitle,$headings,$r)=@_;      my ($displayFormat,$sequenceSource,$sequenceTitle,$headings,$r)=@_;
     if($displayFormat eq 'Display CSV Format') {      if($displayFormat eq 'Display CSV Format') {
Line 124  sub CreateProblemStatisticsTableHeading Line 145  sub CreateProblemStatisticsTableHeading
         $r->print($sequenceSource.'"');          $r->print($sequenceSource.'"');
  return;   return;
     }      }
       if ($sequenceSource eq 'Sorted by: ') {
     $r->print('<br><a href="'.$sequenceSource.   $r->print('<br><b>'.$sequenceSource.$sequenceTitle.'</b>');
               '" target="_blank">'.$sequenceTitle.'</a>');      } else {
           $r->print('<br><a href="'.$sequenceSource.
     '" target="_blank">'.$sequenceTitle.'</a>');
       }
     my $Result = "\n".'<table border=2><tr><th>P#</th>'."\n";      my $Result = "\n".'<table border=2><tr><th>P#</th>'."\n";
     for(my $nIndex=0; $nIndex < (scalar (keys %$headings)); $nIndex++) {       for(my $nIndex=0; $nIndex < (scalar (keys %$headings)); $nIndex++) { 
  $Result .= '<th>'.'<input type="submit" name="';   $Result .= '<th>'.'<input type="submit" name="';
Line 149  sub CloseTable { Line 172  sub CloseTable {
 }  }
   
   
   # Create progress
   sub Create_PrgWin {
       my ($r)=@_;
       $r->print(<<ENDPOP);
       <script>
       popwin=open('','popwin','width=400,height=100');
       popwin.document.writeln('<html><body bgcolor="#88DDFF">'+
         '<title>LON-CAPA Statistics</title>'+
         '<h4>Computation Progress</h4>'+
         '<form name=popremain>'+
         '<input type=text size=35 name=remaining value=Starting></form>'+
         '</body></html>');
       popwin.document.close();
       </script>
   ENDPOP
   
       $r->rflush();
   }
   
   # update progress
   sub Update_PrgWin {
       my ($totalStudents,$index,$name,$r)=@_;
       $r->print('<script>popwin.document.popremain.remaining.value="'.
                 'Computing '.$index.'/'.$totalStudents.': '.
                 $name.'";</script>');
       $r->rflush();
   }
   
   # close Progress Line
   sub Close_PrgWin {
       my ($r)=@_;
       $r->print('<script>popwin.close()</script>');
       $r->rflush(); 
   }
   
     
 # ------ Dump the Student's DB file and handling the data for statistics table   # ------ Dump the Student's DB file and handling the data for statistics table 
 sub ExtractStudentData {  sub ExtractStudentData {
Line 175  sub ExtractStudentData { Line 233  sub ExtractStudentData {
  my $tempProblemOrder=100;   my $tempProblemOrder=100;
         if($cache->{'ProblemStatisticsMaps'} ne 'All Maps'  &&          if($cache->{'ProblemStatisticsMaps'} ne 'All Maps'  &&
            $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {             $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {
 #    $r->print("<br>sequences=$cache->{'orderedSequences'}");  
 #    $r->print("<br>".$cache->{$sequence.':title'});  
             next;              next;
         }          }
  $tempSequenceOrder++;   $tempSequenceOrder++;
   
         #$discrim .= '&';  
         foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {          foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {
 #    $r->print("<br>problems=$cache->{$sequence.':problems'}");  
             my $problem = $cache->{$problemID.':problem'};              my $problem = $cache->{$problemID.':problem'};
 #    $r->print("<br>$problemID === $problem");  
             my $LatestVersion = $cache->{$name.':version:'.$problem};              my $LatestVersion = $cache->{$name.':version:'.$problem};
     # Output dashes for all the parts of this problem if there      # Output dashes for all the parts of this problem if there
             # is no version information about the current problem.              # is no version information about the current problem.
Line 209  sub ExtractStudentData { Line 262  sub ExtractStudentData {
                                                   ':parts'})) {                                                    ':parts'})) {
  $tempProblemOrder++;   $tempProblemOrder++;
  $partData{'count'}++;   $partData{'count'}++;
 # $r->print("<br>parts=$cache->{$sequence.':'.$problemID.':parts'}");  
                 $partData{$part.':order'}=$tempProblemOrder;                  $partData{$part.':order'}=$tempProblemOrder;
                 $partData{$part.':tries'}=0;                  $partData{$part.':tries'}=0;
                 $partData{$part.':code'}='-';                  $partData{$part.':code'}='-';
Line 261  sub ExtractStudentData { Line 313  sub ExtractStudentData {
                 }                  }
             }              }
   
 #$Apache::lonxml::debug=1;  
 #&Apache::lonhomework::showhash(%partData);  
 #$Apache::lonxml::debug=0;  
   
             # Loop through all the parts for the current problem in the               # Loop through all the parts for the current problem in the 
             # correct order and prepare the output              # correct order and prepare the output
     my $partCounter=0;      my $partCounter=0;
Line 282  sub ExtractStudentData { Line 330  sub ExtractStudentData {
                 if($partData{'count'} > 1) {                  if($partData{'count'} > 1) {
                     $ptr .= "*(part $_)";                      $ptr .= "*(part $_)";
                 }                  }
                 #if($partCounter > 1) {                  $discrim .= '&';
                     $discrim .= '&';  
                 #}  
   
  my ($pr_no,$dod)=split('&',$ptr);   my ($pr_no,$dod)=split('&',$ptr);
 # my $DoDiff=$DoDiff->{$dod};  # my $DoDiff=$DoDiff->{$dod};
Line 348  sub ExtractStudentData { Line 394  sub ExtractStudentData {
     }      }
 }  }
   
   sub NumericSort {
       $a <=> $b;
   }
   
 =pod  sub OrderedSort  {
 sub MySort {                if ($ENV{'form.order'} eq 'Descending') {
     if ( $Pos > 0 ) {   $b <=> $a;
  if ($ENV{'form.order'} eq 'Descending') {$b <=> $a;}      } else { 
  else { $a <=> $b; }   $a <=> $b;
     }  
     else {  
  if ($ENV{'form.order'} eq 'Descending') {$b cmp $a;}  
  else { $a cmp $b; }  
     }      }
 }  }
 =cut  
   
   
 sub BuildStatisticsTable {  sub BuildStatisticsTable {
     my ($cache,$upper,$lower,$list,$headings,$students,$r,$color)=@_;      my ($cache,$upper,$lower,$list,$headings,$students,$r,$color)=@_;
     my $NoElements = scalar @$list;      my $NoElements = scalar @$list;
     my @List=sort(@$list);      my @list=sort(@$list);
   
 #6666666  #6666666
 #    my $file="/home/httpd/perl/tmp/183d.txt";  #    my $file="/home/httpd/perl/tmp/183d.txt";
Line 386  sub BuildStatisticsTable { Line 431  sub BuildStatisticsTable {
     my $dummy;      my $dummy;
     my $p_val;      my $p_val;
     my $ResId;      my $ResId;
     my %GraphDat;      my %TempCache;
     my $cIdx=0;      my $cIdx=0;
   
     foreach my $sequence (split(':', $cache->{'orderedSequences'})) {      foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
Line 399  sub BuildStatisticsTable { Line 444  sub BuildStatisticsTable {
                                              $cache->{$sequence.':title'},                                                $cache->{$sequence.':title'}, 
                                              $headings,$r);                                               $headings,$r);
  my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,   my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,
                                                    $List[$cIdx]);                                                     $list[$cIdx]);
         my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);          my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);
  $sequence+=100;   $sequence+=100;
  while ($SqOrd==$sequence && $cIdx<$NoElements) {   while ($SqOrd==$sequence && $cIdx<$NoElements) {
Line 426  sub BuildStatisticsTable { Line 471  sub BuildStatisticsTable {
  elsif( $Code eq 'O' ) { $Override++; }   elsif( $Code eq 'O' ) { $Override++; }
  elsif( $Code eq '-' ) { $StdNo--; }   elsif( $Code eq '-' ) { $StdNo--; }
  ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,   ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,
                                                      $List[$cIdx]);                                                       $list[$cIdx]);
         ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);          ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);
     }      }
   
     $p_count++;      $p_count++;
     my $Dummy;      my $Dummy;
     ($ResId,$Dummy)=split(/\*/,$Temp);      ($ResId,$Dummy)=split(/\*/,$Temp);
   
 ######################  
     $Temp = '<a href="'.$cache->{$ResId.':source'}.      $Temp = '<a href="'.$cache->{$ResId.':source'}.
                 '" target="_blank">'.$cache->{$ResId.':title'}.$Dummy.'</a>';                  '" target="_blank">'.$cache->{$ResId.':title'}.$Dummy.'</a>';
   
     #$r->print('<br>rid='.$ResId);  #    my $urlres = $cache->{$sequence.':source'});
     #$r->print('<br>src='.$cache->{$ResId.':source'});  #check with Gerd
     #$r->print('<br>tit='.$cache->{$ResId.':title'});      #symb of the problem (already decluttered and cleaned)
       my $urlres = $cache->{$ResId.':problem'};
     my $res = &Apache::lonnet::declutter($cache->{$ResId.':source'});  
     my $urlres=$res;  
   
     $ResId=~/(\d+)\.(\d+)/;  
     my $Map = &Apache::lonnet::declutter( $cache->{'map_id_'.$1} );  
     $urlres=$Map;  
 #######################  
   
 #    $res = '<a href="'.$cache->{$ResId.':source'}.'">'.$res.'</a>';  
     #$Map = '<a href="'.$Map.'">'.$res.'</a>';  
   
 #------------------------ Compute the Average of Tries about one problem  #------------------------ Compute the Average of Tries about one problem
     my $Average = ($StdNo) ? $TotalTries/$StdNo : 0;      my $Average = ($StdNo) ? $TotalTries/$StdNo : 0;
Line 459  sub BuildStatisticsTable { Line 492  sub BuildStatisticsTable {
     $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time;      $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time;
     $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo;      $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo;
     $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average;      $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average;
      
 #-------------------------------- Compute percentage of Wrong tries  #-------------------------------- Compute percentage of Wrong tries
     my $Wrong = ( $StdNo ) ? 100 * ( $Incorrect / $StdNo ) : 0;      my $Wrong = ( $StdNo ) ? 100 * ( $Incorrect / $StdNo ) : 0;
   
Line 510  sub BuildStatisticsTable { Line 543  sub BuildStatisticsTable {
     my $SD = sprintf( "%.1f", $StdDev );      my $SD = sprintf( "%.1f", $StdDev );
     my $DoD = sprintf( "%.2f", $DoDiff );      my $DoD = sprintf( "%.2f", $DoDiff );
     my $Sk = sprintf( "%.1f", $Skewness );      my $Sk = sprintf( "%.1f", $Skewness );
     my $join = $Prob.'&'.$Temp.'&'.$StdNo.'&'.      my $join = $sequence.'@'.$pOrd.'&'.$Temp.'&'.$StdNo.'&'.
                        $TotalTries.'&'.$MxTries.'&'.$Avg.'&'.                         $TotalTries.'&'.$MxTries.'&'.$Avg.'&'.
                        $YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'.                         $YES.'&'.$Override.'&'.$Wrng.'&'.$DoD.'&'.
        $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.         $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.
                        $DiscNo.'&'.$Prob;                         $DiscNo.'&'.$Prob;
 ##8888    $CachData{($p_count-1)}=$join;  
       $TempCache{'CacheTable:'.($p_count-1)}=$join;
   
 #6666666  #6666666
 #    $r->print('<br>'.$out.'&'.$DoD);  #    $r->print('<br>'.$out.'&'.$DoD);
 #            print (OUT $out.'@'.$DoD.'&');  #            print (OUT $out.'@'.$DoD.'&');
 #6666666  #6666666
   
   #check with Gerd
     $urlres=~/^(\w+)\/(\w+)/;      $urlres=~/^(\w+)\/(\w+)/;
     if ($StdNo) {       if ($StdNo) { 
  &Apache::lonnet::put('resevaldata',\%storestats,$1,$2);    &Apache::lonnet::put('resevaldata',\%storestats,$1,$2); 
     }      }
 #-------------------------------- Row of statistical table  #-------------------------------- Row of statistical table
             &TableRow($cache,$join,$cIdx,($p_count-1),$r,$color,\%GraphDat);              &TableRow($cache,$join,$cIdx,($p_count-1),$r,$color,
                         \%TempCache);
  }   }
    $TempCache{'ProblemCount'}=$p_count;
  &CloseTable($cache,$r);   &CloseTable($cache,$r);
     }      }
 ###    &Close_PrgWin();  ###    &Close_PrgWin();
 #666666  #6666666
 #    close( OUT );  #    close( OUT );
 #666666  #666666
       return \%TempCache;
 }  }
   
 =pod  
 sub Cache_Statistics {  
     my ($cache,$color)=@_;  
     my @list = ();  
     my $Useful;  
     my $UnUseful;  
 #    $r->print('<input type="hidden" name="show" value="excel" />'."\n");   
     my %myHeader = reverse( %Header );  
     $Pos = $myHeader{$ENV{'form.sort'}};  
     if ($Pos > 0) {$Pos++;}  
     my $p_count = 0;  
     foreach my $key( keys %CachData) {   
  my @Temp=split(/\&/,$CachData{$key});  
  if ( $Pos == 0 ) {  
     ($UnUseful,$Useful)=split(/\>/,$Temp[$Pos]);  
  }  
  else {  
     $Useful = $Temp[$Pos];  
  }     
  $list[$p_count]=$Useful.'@'.$CachData{$key};  
         $p_count++;  
     }  
   
     @list = sort MySort (@list);  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;
   
     my $nIndex=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);
   
     if ( $Pos == 0 ) {      my ($tar)=split(/\&/,$list[$cIdx]);
  foreach (sort keys %mapsort) {      $tar=~s/\+//eg;
     my ($Hid,$pr)=split(/\:/,$mapsort{$_});      my ($SqOrd)=split(/\@/,$tar);
     &CreateProblemStatisticsTableHeading($cache,1,$Hid);      $sequence+=100;
     my @lpr=split(/\&/,$pr);      while ($SqOrd==$sequence && $cIdx<$p_count) {
     for (my $i=1; $i<=$#lpr; $i++) {   my($Pre, $Post) = split(/\+/,$list[$cIdx]); 
  my($Pre, $Post) = split(/\@/,$list[$nIndex]);    &TableRow($cache,$Post,$cIdx,$cIdx,$r,$color,\%TempCache);
  #$r->print('<br>'.$Pre.'---'.$Post);   $cIdx++;
  &TableRow($cache,$Post,$i,$nIndex,$color,\%GraphDat);   my ($tar)=split(/\&/,$list[$cIdx]);
  $nIndex++;   $tar=~s/\+//eg;
    ($SqOrd)=split(/\@/,$tar);
     }      }
     &CloseTable($cache);      &CloseTable($cache,$r);
  }   }
     }      }
     else {      else {
  &CreateProblemStatisticsTableHeading($cache,0);          &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, 
                                                'Sorted by: ',
        $headings->{$pos-1},
                                                $headings,$r);
  for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) {   for ( my $nIndex = 0; $nIndex < $p_count; $nIndex++ ) {
     my($Pre, $Post) = split(/\@/,$list[$nIndex]);       my($Pre, $Post) = split(/\+/,$list[$nIndex]);
     &TableRow($cache,$Post,$nIndex,$nIndex,$color,\%GraphDat);      &TableRow($cache,$Post,$nIndex,$nIndex,$r,$color,\%TempCache);
  }    } 
  &CloseTable($cache);   &CloseTable($cache,$r);
     }      }
   
       return \%TempCache;
 }  }
 =cut   
   
 sub TableRow {  sub TableRow {
     my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_;      my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_;
     my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override,      my($PrOrd,$Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,$Override,
        $Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str);         $Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str);
 #    $r->print('<br>'.$Str);  
     my $Ptr;      my $Ptr;
     if($cache->{'DisplayFormat'} eq 'Display CSV Format') {      if($cache->{'DisplayFormat'} eq 'Display CSV Format') {
         my ($ResId,$Dummy)=split(/\*/,$Prob);          my ($ResId,$Dummy)=split(/\*/,$Prob);
Line 619  sub TableRow { Line 672  sub TableRow {
     } else {      } else {
         $Ptr="\n".'<tr>'.          $Ptr="\n".'<tr>'.
              "\n".'<td>'.($RealIdx+1).'</td>'.               "\n".'<td>'.($RealIdx+1).'</td>'.
           #  "\n".'<td>'.$PrOrd.$Temp.'</td>'.  
              "\n".'<td>'.$Temp.'</td>'.               "\n".'<td>'.$Temp.'</td>'.
              "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$StdNo.'</td>'.               "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$StdNo.'</td>'.
              "\n".'<td bgcolor='.$color->{"yellow"}.'>'.$TotalTries.'</td>'.               "\n".'<td bgcolor='.$color->{"yellow"}.'>'.$TotalTries.'</td>'.
Line 636  sub TableRow { Line 688  sub TableRow {
              "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>';               "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>';
         $r->print("\n".$Ptr.'</tr>' );          $r->print("\n".$Ptr.'</tr>' );
     }      }
 #    $GraphDat->{$RealIdx}=$DoD.':'.$Wrng;      $GraphDat->{'GraphGif:'.$RealIdx}=$DoD.':'.$Wrng;
 }  }
   
   
Line 778  sub ProcessDiscriminant { Line 830  sub ProcessDiscriminant {
 #------- Creating Discimination factor     #------- Creating Discimination factor   
 sub Discriminant {  sub Discriminant {
     my ($discriminant,$r)=@_;      my ($discriminant,$r)=@_;
 #$Apache::lonxml::debug=1;  
 #&Apache::lonhomework::showhash(%$discriminant);  
 #$Apache::lonxml::debug=0;  
     my @discriminantKeys=keys(%$discriminant);      my @discriminantKeys=keys(%$discriminant);
     my $Count = scalar @discriminantKeys;      my $Count = scalar @discriminantKeys;
   
Line 816  sub Discriminant { Line 865  sub Discriminant {
   
 # ------------------------------------------- Prepare data for Graphical chart  # ------------------------------------------- Prepare data for Graphical chart
   
 sub BuildDiffGraph {  sub BuildGraphicChart {
     my ($r)=@_;      my ($ylab,$r,$cacheDB)=@_;
       my %cache;
       my $Col;
       my $data='';
       my $count = 0;
       my $Max = 0;
   
     my $graphData = &GetGraphData('DiffGraph', $r);      unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {
     $r->print('<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />');          return '<html><body>Unable to tie database.</body></html>';
       }
      
       my $p_count = $cache{'ProblemCount'};
   
     return;      for ( my $k=0; $k<$p_count;$k++) {
 }          my @Temp=split(/\:/,$cache{'GraphGif:'.$k});
           my $inf = $Temp[$Col]; 
    if ( $Max < $inf ) {$Max = $inf;}
         $data .= $inf.',';
           $count++;
       }
       untie(%cache);
   #    $r->print("<br>count=$p_count >>data= $data");
   
 sub BuildWrongGraph {      if ( $Max > 1 ) { 
     my ($r)=@_;   $Max += (10 - $Max % 10);
         $Max = int($Max);
       } else { $Max = 1; }
   
     my $graphData = &GetGraphData('WrongGraph', $r);      my $cid=$ENV{'request.course.id'};
     $r->print('<IMG src="/cgi-bin/graph.gif?'.$graphData.'" />');  
   
     return;      if ( $ylab eq 'DoDiff Graph' ) {
 }   $ylab = 'Degree-of-Difficulty';
    $Col = 0;
       } else {
    $ylab = 'Wrong-Percentage';
    $Col = 1;
       }
       my $Course = $ENV{'course.'.$cid.'.description'};
       $Course =~ s/\ /"_"/eg;
       my $GData=$Course.'&'.'Problems#'.'&'.$ylab.'&'.
         $Max.'&'.$count.'&'.$data;
   
       $r->print('<IMG src="/cgi-bin/graph.gif?'.$GData.'" />');
   
 sub GetGraphData {      return;
     my ($ylab,$r,%GraphDat)=@_;  
     my $Col;  
     my $data='';  
     my $count = 0;  
     my $Max = 0;  
     my $cid=$ENV{'request.course.id'};  
     my $GraphDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".  
                   "_$ENV{'user.domain'}_$cid\_graph.db";  
     foreach (keys %GraphDat) {delete $GraphDat{$_};}  
     if (-e "$GraphDB") {  
  if (tie(%GraphDat,'GDBM_File',"$GraphDB",&GDBM_READER,0640)) {  
     if ( $ylab eq 'DoDiff Graph' ) {  
  $ylab = 'Degree-of-Difficulty';  
  $Col = 0;  
     }  
     else {  
  $ylab = 'Wrong-Percentage';  
  $Col = 1;  
     }  
     foreach (sort NumericSort keys %GraphDat) {   
  my @Temp=split(/\:/,$GraphDat{$_});  
                 my $inf = $Temp[$Col];   
  if ( $Max < $inf ) {$Max = $inf;}  
  $data .= $inf.',';  
  $count++;  
     }  
     if ( $Max > 1 ) {   
  $Max += (10 - $Max % 10);  
  $Max = int($Max);  
     }  
     else { $Max = 1; }  
             untie(%GraphDat);  
     my $Course = $ENV{'course.'.$cid.'.description'};  
     $Course =~ s/\ /"_"/eg;  
     my $GData=$Course.'&'.'Problems'.'&'.$ylab.'&'.  
       $Max.'&'.$count.'&'.$data;  
  }  
  else {  
     $r->print("Unable to tie hash to db file");  
  }  
     }  
 }  }
   
   
 1;  1;
 __END__  __END__

Removed from v.1.10  
changed lines
  Added in v.1.16


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>