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

version 1.12, 2002/08/05 18:10:08 version 1.16, 2002/08/06 17:38:26
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)) {
Line 95  sub BuildProblemStatisticsPage { Line 101  sub BuildProblemStatisticsPage {
   
     my $state=$ENV{'form.ProblemStatisticsHeading'};       my $state=$ENV{'form.ProblemStatisticsHeading'}; 
   
 #    my $state=&Apache::lonstatistics::CheckFormElement(\%cache,  
 #                                                  'ProblemStatisticsHeading',  
 #                                                  'ProblemStatisticsHeading',  
 #                                                  'Homework Sets Order');   
     $r->print("<br>state=".$state);  
   
     my $TempCache;      my $TempCache;
   
     if ($state) {      if ($state) {
Line 113  sub BuildProblemStatisticsPage { Line 113  sub BuildProblemStatisticsPage {
  my $index=0;   my $index=0;
  foreach (@$students) {   foreach (@$students) {
     $index++;      $index++;
     #&Apache::lonstatistics::Update_PrgWin(++$index,$r);  
     &ExtractStudentData(\%cache, $_, \@list,\%Discuss, $r,      &ExtractStudentData(\%cache, $_, \@list,\%Discuss, $r,
                                 \%discriminant);                                  \%discriminant);
  }   }
  #&Apache::lonstatistics::Close_PrgWin($r);  
  my ($upper, $lower) = &Discriminant(\%discriminant,$r);   my ($upper, $lower) = &Discriminant(\%discriminant,$r);
  $TempCache= &BuildStatisticsTable(\%cache, $upper, $lower,    $TempCache= &BuildStatisticsTable(\%cache, $upper, $lower, 
    \@list, \%Header, $students,     \@list, \%Header, $students,
Line 140  sub BuildProblemStatisticsPage { Line 138  sub BuildProblemStatisticsPage {
   
 #---- Problem Statistics Web Page ---------------------------------------  #---- Problem Statistics Web Page ---------------------------------------
   
   
 sub NumericSort {            
     $a <=> $b;  
 }  
   
   
 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 153  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 178  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 204  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 238  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 290  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 311  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 377  sub ExtractStudentData { Line 394  sub ExtractStudentData {
     }      }
 }  }
   
   sub NumericSort {
       $a <=> $b;
   }
   
   sub OrderedSort  {
 sub MySort {      if ($ENV{'form.order'} eq 'Descending') {
     my $pos=shift;   $b <=> $a;
     if ( $pos > 0 ) {      } else { 
  if ($ENV{'form.order'} eq 'Descending') {$b <=> $a;}   $a <=> $b;
  else { $a <=> $b; }  
     }  
     else {  
 # if ($ENV{'form.order'} eq 'Descending') {$b cmp $a;}  
 # else { $a cmp $b; }  
  $a cmp $b;  
     }      }
 }  }
   
Line 464  sub BuildStatisticsTable { Line 478  sub BuildStatisticsTable {
     $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 490  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 547  sub BuildStatisticsTable { Line 549  sub BuildStatisticsTable {
        $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.         $SD.'&'.$Sk.'&'.$_D1.'&'.$_D2.'&'.
                        $DiscNo.'&'.$Prob;                         $DiscNo.'&'.$Prob;
   
 #####{$sequence.'@'.$pOrd}  
     $TempCache{'CacheTable:'.($p_count-1)}=$join;      $TempCache{'CacheTable:'.($p_count-1)}=$join;
   
 #6666666  #6666666
Line 555  sub BuildStatisticsTable { Line 556  sub BuildStatisticsTable {
 #            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,              &TableRow($cache,$join,$cIdx,($p_count-1),$r,$color,
                       \%TempCache);                        \%TempCache);
Line 567  sub BuildStatisticsTable { Line 569  sub BuildStatisticsTable {
  &CloseTable($cache,$r);   &CloseTable($cache,$r);
     }      }
 ###    &Close_PrgWin();  ###    &Close_PrgWin();
 #666666  #6666666
 #    close( OUT );  #    close( OUT );
 #666666  #666666
     return \%TempCache;      return \%TempCache;
Line 575  sub BuildStatisticsTable { Line 577  sub BuildStatisticsTable {
   
   
 sub CacheStatisticsTable {  sub CacheStatisticsTable {
     my ($state,$cache,$Header,$r,$color)=@_;      my ($state,$cache,$headings,$r,$color)=@_;
     my @list = ();      my @list = (); 
     my $Useful;  
     my $UnUseful;   
     my %TempCache;      my %TempCache;
     my %myHeader = reverse( %$Header );      my %myHeader = reverse( %$headings );
     my $pos = $myHeader{$state};      my $pos = $myHeader{$state};
     if ($pos > 0) {$pos++;}      if ($pos > 0) {$pos++;}
     my $p_count = $cache->{'ProblemCount'};      my $p_count = $cache->{'ProblemCount'};
Line 588  sub CacheStatisticsTable { Line 588  sub CacheStatisticsTable {
     for ( my $k=0; $k<$p_count;$k++) {      for ( my $k=0; $k<$p_count;$k++) {
  my $key=$cache->{'CacheTable:'.$k};   my $key=$cache->{'CacheTable:'.$k};
  my @Temp=split(/\&/,$key);   my @Temp=split(/\&/,$key);
  if ( $pos == 0 ) {   $list[$k]=$Temp[$pos].'+'.$key;
     ($UnUseful,$Useful)=split(/\>/,$Temp[$pos]);  
  }  
  else {  
     $Useful = $Temp[$pos];  
  }     
  $list[$k]=$Useful.'@'.$key;  
  $r->print('<br>'.$list[$k]);  
     }      }
       
       if ($pos>0) {
           @list = sort OrderedSort (@list);
       } else {
           @list = sort (@list);
       }
       my $cIdx=0;
   
       if ( $pos == 0 ) {
     @list = sort MySort (@list);  
   
     my $nIndex=0;  
   
     return \%TempCache;  
 }  
   
   
 =pod  
   
     if ( $Pos == 0 ) {  
  foreach my $sequence (split(':', $cache->{'orderedSequences'})) {   foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
     if($cache->{'ProblemStatisticsMaps'} ne 'All Maps'  &&      if($cache->{'ProblemStatisticsMaps'} ne 'All Maps'  &&
        $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {         $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {
  next;   next;
     }      }
       if ($cIdx==$p_count) {
    return \%TempCache;
       }
     &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'},       &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, 
                                              $cache->{$sequence.':source'},                                               $cache->{$sequence.':source'},
                                              $cache->{$sequence.':title'},                                                $cache->{$sequence.':title'}, 
                                              $headings,$r);                                               $headings,$r);
   
     my ($tar,$Tries,$Wrongs,$Code,$Disc)=split(/\&/,      my ($tar)=split(/\&/,$list[$cIdx]);
                                                        $list[$cIdx]);      $tar=~s/\+//eg;
     my ($SqOrd,$PrOrd,$Prob)=split(/\:/,$tar);      my ($SqOrd)=split(/\@/,$tar);
     $sequence+=100;      $sequence+=100;
  while ($SqOrd==$sequence && $cIdx<$NoElements) {      while ($SqOrd==$sequence && $cIdx<$p_count) {
     my %storestats=();   my($Pre, $Post) = split(/\+/,$list[$cIdx]); 
     my @lpr=split(/\&/,$pr);   &TableRow($cache,$Post,$cIdx,$cIdx,$r,$color,\%TempCache);
     for (my $i=1; $i<=$#lpr; $i++) {   $cIdx++;
  my($Pre, $Post) = split(/\@/,$list[$nIndex]);    my ($tar)=split(/\&/,$list[$cIdx]);
  #$r->print('<br>'.$Pre.'---'.$Post);   $tar=~s/\+//eg;
  &TableRow($cache,$Post,$i,$nIndex,$color,\%GraphDat);   ($SqOrd)=split(/\@/,$tar);
  $nIndex++;  
     }      }
     &CloseTable($cache);      &CloseTable($cache,$r);
  }   }
     }      }
     else {      else {
         &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'},           &CreateProblemStatisticsTableHeading($cache->{'DisplayFormat'}, 
                                              $cache->{$sequence.':source'},                                               'Sorted by: ',
                                              $cache->{$sequence.':title'},        $headings->{$pos-1},
                                              $headings,$r);                                               $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;      return \%TempCache;
 }  }
   
 =cut  
   
   
 sub TableRow {  sub TableRow {
     my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_;      my ($cache,$Str,$Idx,$RealIdx,$r,$color,$GraphDat)=@_;
Line 683  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 700  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->{'graph_gif:'.$RealIdx}=$DoD.':'.$Wrng;      $GraphDat->{'GraphGif:'.$RealIdx}=$DoD.':'.$Wrng;
 }  }
   
   
Line 842  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 880  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.12  
changed lines
  Added in v.1.16


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