Diff for /loncom/interface/statistics/lonproblemanalysis.pm between versions 1.4 and 1.5

version 1.4, 2002/08/05 20:53:38 version 1.5, 2002/08/13 00:37:18
Line 41  use strict; Line 41  use strict;
 use Apache::lonnet();  use Apache::lonnet();
 use GDBM_File;  use GDBM_File;
   
 #my $jr;  my $jr;
   
 sub BuildProblemAnalysisPage {  sub BuildProblemAnalysisPage {
     my ($cacheDB, $r)=@_;      my ($cacheDB, $r)=@_;
Line 64  sub BuildProblemAnalysisPage { Line 64  sub BuildProblemAnalysisPage {
 sub BuildAnalyzePage {  sub BuildAnalyzePage {
     my ($cacheDB, $students, $courseID,$r)=@_;      my ($cacheDB, $students, $courseID,$r)=@_;
   
 #    $jr = $r;      $jr = $r;
     my $c = $r->connection;      my $c = $r->connection;
   
     my $Str = '</form>';      my $Str = '</form>';
     my %cache;      my %cache;
     &Create_PrgWin($r);      if(&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students, 'true', 
     my $count=0;                                                                   $cacheDB, 'true', 
     foreach (@$students) {                                                                   'true', $courseID, 
         &Update_PrgWin(scalar(@$students),$count,$_,$r);                                                                   $r, $c) ne 'OK') {
         if($c->aborted) {          $r->print($Str);
             return $Str;          return;
         }  
         my $downloadTime='';  
         if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {  
             $downloadTime = $cache{$_.':lastDownloadTime'};  
             untie(%cache);  
         }  
         if($downloadTime eq 'Not downloaded') {  
             my $courseData =   
                 &Apache::loncoursedata::DownloadCourseInformation($_,   
                                                                   $courseID);  
             if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) {  
                 &Apache::loncoursedata::ProcessStudentData(\%cache,   
                                                            $courseData, $_);  
                 untie(%cache);  
             } else {  
                 next;  
             }  
         }  
         $count++;  
     }      }
     &Close_PrgWin($r);  
   
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {      unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
         $Str .= '<html><body>Unable to tie database.</body></html>';          $Str .= '<html><body>Unable to tie database.</body></html>';
         return $Str;          $r->print($Str);
           return;
     }      }
   
     my ($problemId, $part, $responseId)=split(':',$cache{'AnalyzeInfo'});      my ($problemId, $part, $responseId)=split(':',$cache{'AnalyzeInfo'});
Line 115  sub BuildAnalyzePage { Line 97  sub BuildAnalyzePage {
     my ($analyzeData) = &InitAnalysis($uri, $part, $responseId, $problem,       my ($analyzeData) = &InitAnalysis($uri, $part, $responseId, $problem, 
                                       $students->[0], $courseID);                                        $students->[0], $courseID);
     if(defined($analyzeData->{'error'})) {      if(defined($analyzeData->{'error'})) {
         $Str .= 'Incorrect part requested.<br>';          $Str .= $analyzeData->{'error'}.'<br>Incorrect part requested.<br>';
         return $Str;          $r->print($Str);
           return;
     }      }
   
     if($c->aborted()) {  untie(%cache); return $Str; }      $r->print($Str);
       $Str = '';
       if($c->aborted()) {  untie(%cache); return; }
   
     #compute the intervals      #compute the intervals
     &Interval($part, $problem, $interval, $analyzeData->{'concepts'},       &Interval($part, $problem, $interval, $analyzeData->{'concepts'}, 
Line 128  sub BuildAnalyzePage { Line 113  sub BuildAnalyzePage {
     $title =~ s/\ /"_"/eg;      $title =~ s/\ /"_"/eg;
     $Str .= '<br><b>'.$uri.'</b>';      $Str .= '<br><b>'.$uri.'</b>';
   
     if($c->aborted()) {  untie(%cache); return $Str; }      $r->print($Str);
       $Str = '';
       if($c->aborted()) {  untie(%cache); return; }
                     
     #Java script Progress window      #Java script Progress window
 #    &Create_PrgWin();  
 #    &Update_PrgWin("Starting-to-analyze-problem");  
     for(my $index=0; $index<(scalar @$students); $index++) {      for(my $index=0; $index<(scalar @$students); $index++) {
         if($c->aborted()) {  untie(%cache); return $Str; }          if($c->aborted()) {  untie(%cache); return; }
 # &Update_PrgWin($index);   &OpStatus($problemId, $students->[$index], \%ConceptData, 
 # &OpStatus($problem, $students->[$index], $courseID, \%ConceptData,  
 #                  $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);  
  &OpStatus($problem, $students->[$index], \%ConceptData,   
                   $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);                    $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);
     }      }
 #    &Close_PrgWin();  
   
     $Str .= '<br>';      $Str .= '<br>';
     for (my $k=0; $k<$interval; $k++ ) {      for (my $k=0; $k<$interval; $k++ ) {
         if($c->aborted()) {  untie(%cache); return $Str; }          if($c->aborted()) {  untie(%cache); return $Str; }
  $Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'},    $Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'}, 
                            \%ConceptData);                             \%ConceptData);
           $r->print($Str);
           $Str = '';
     }      }
     for (my $k=0; $k<$interval; $k++ ) {      for (my $k=0; $k<$interval; $k++ ) {
         if($c->aborted()) {  untie(%cache); return $Str; }          if($c->aborted()) {  untie(%cache); return $Str; }
  $Str .= &DrawTable($k, $analyzeData->{'concepts'}, \%ConceptData);   $Str .= &DrawTable($k, $analyzeData->{'concepts'}, \%ConceptData);
           $r->print($Str);
           $Str = '';
     }      }
     my $Answ=&Apache::lonnet::ssi($uri);      my $Answ=&Apache::lonnet::ssi($uri);
     $Str .= '<br><b>Here you can see the Problem:</b><br>'.$Answ;      $Str .= '<br><b>Here you can see the Problem:</b><br>'.$Answ;
       $Str .= '<form>';
       $r->print($Str);
   
     untie(%cache);      untie(%cache);
   
     return $Str.'<form>';      return;
 }  }
   
 #---- Problem Analysis Web Page ----------------------------------------------  #---- Problem Analysis Web Page ----------------------------------------------
Line 230  sub OptionResponseTable { Line 217  sub OptionResponseTable {
     return $Str;      return $Str;
 }  }
   
 # 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();   
 }  
    
 #---- END Problem Analysis Web Page ------------------------------------------  #---- END Problem Analysis Web Page ------------------------------------------
   
 #---- Analyze Web Page -------------------------------------------------------  #---- Analyze Web Page -------------------------------------------------------
   
 #restore the student submissions and finding the result  #restore the student submissions and finding the result
 sub OpStatus {  sub OpStatus {
     my ($problem, $student, $ConceptData, $foil_to_concept,       my ($problemID, $student, $ConceptData, $foil_to_concept, 
         $analyzeData, $cache)=@_;          $analyzeData, $cache)=@_;
   
     my $ids = $analyzeData->{'parts'};      my $ids = $analyzeData->{'parts'};
     my @True = ();      my @True = ();
     my @False = ();      my @False = ();
     my $flag=0;      my $flag=0;
     my $latestVersion = $cache->{$student.':version:'.$problem};  
     if(!$latestVersion) {  
         return;  
     }  
   
     my $tries=0;      my $tries=0;
     for(my $version=1; $version<=$latestVersion; $version++) {  
         my $time=$cache->{$student.':'.$version.':'.$problem.':timestamp'};  
   
         foreach my $id (@$ids) {      foreach my $id (@$ids) {
             my ($currentPart, undef) = split(/\./, $id);          my ($part, $response) = split(/\./, $id);
             #check if this is a repeat submission, if so skip it          my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'};
             next if($cache->{$student.':'.$version.':'.$problem.          my @submissions = split(':::', $cache->{$student.':'.$problemID.':'.
                              ':resource.'.$currentPart.'.previous'});                                                  $part.':'.$response.
             #if no solved this wasn't a real submission, ignore it                                                  ':submission'});
             if(!defined($cache->{"$student:$version:$problem".          foreach my $Resp (@submissions) {
                                  ":resource.$currentPart.solved"})) {  
                 &Apache::lonxml::debug("skipping ");  
                 next;  
             }  
             my $Resp = $cache->{$student.':'.$version.':'.$problem.  
                                 ':resource.'.$id.'.submission'};  
             my %submission=&Apache::lonnet::str2hash($Resp);              my %submission=&Apache::lonnet::str2hash($Resp);
             foreach (keys(%submission)) {              foreach (keys(%submission)) {
                 if($submission{$_}) {                  if($submission{$_}) {
Line 441  sub InitAnalysis { Line 381  sub InitAnalysis {
                                         'grade_domain'   => $domain,                                          'grade_domain'   => $domain,
                                         'grade_courseid' => $courseID,                                          'grade_courseid' => $courseID,
                                         'grade_symb'     => $problem));                                          'grade_symb'     => $problem));
       my ($a)=&Apache::lonnet::str2hashref($Answ);
     my %Answer=();      my %b;
     %Answer=&Apache::lonnet::str2hash($Answ);      foreach (keys(%$a)) {
           $b{&Apache::lonnet::unescape($_)} = $a->{$_};
       }
       my $Answer=\%b;
   
     my $found = 0;      my $found = 0;
     my @parts=();      my @parts=();
     if(defined($responseId)) {      if(defined($responseId)) {
         foreach (@{$Answer{'parts'}}) {          foreach (@{$Answer->{'parts'}}) {
             if($_ eq $part.'.'.$responseId) {              if($_ eq $part.'.'.$responseId) {
                 push(@parts, $_);                  push(@parts, $_);
                 $found = 1;                  $found = 1;
Line 456  sub InitAnalysis { Line 399  sub InitAnalysis {
             }              }
         }          }
     } else {      } else {
         foreach (@{$Answer{'parts'}}) {          foreach (@{$Answer->{'parts'}}) {
             if($_ =~ /$part/) {              if($_ =~ /$part/) {
                 push(@parts, $_);                  push(@parts, $_);
                 $found = 1;                  $found = 1;
Line 473  sub InitAnalysis { Line 416  sub InitAnalysis {
     my @Concepts=();      my @Concepts=();
     my %foil_to_concept;      my %foil_to_concept;
     foreach my $currentPart (@parts) {      foreach my $currentPart (@parts) {
         if(defined($Answer{$currentPart.'.concepts'})) {          if(defined($Answer->{$currentPart.'.concepts'})) {
             foreach my $concept (@{$Answer{$currentPart.'.concepts'}}) {              foreach my $concept (@{$Answer->{$currentPart.'.concepts'}}) {
                 push(@Concepts, $concept);                  push(@Concepts, $concept);
                 foreach my $foil (@{$Answer{$currentPart.'.concept.'.                  foreach my $foil (@{$Answer->{$currentPart.'.concept.'.
                                             $concept}}) {                                              $concept}}) {
                     $analyzeData{$currentPart.'.foil.value.'.$foil} =                      $analyzeData{$currentPart.'.foil.value.'.$foil} =
                         $Answer{$currentPart.'.foil.value.'.$foil};                          $Answer->{$currentPart.'.foil.value.'.$foil};
                     $foil_to_concept{$foil} = $concept;                      $foil_to_concept{$foil} = $concept;
                 }                  }
             }              }
         } else {          } else {
             foreach (keys(%Answer)) {              foreach (keys(%$Answer)) {
                 if(/$currentPart.foil\.value\.(.*)$/) {                  if(/$currentPart.foil\.value\.(.*)$/) {
                     push(@Concepts, $1);                      push(@Concepts, $1);
                     $foil_to_concept{$1} = $1;                      $foil_to_concept{$1} = $1;
                     $analyzeData{$currentPart.'.foil.value.'.$1} =                      $analyzeData{$currentPart.'.foil.value.'.$1} =
                         $Answer{$currentPart.'.foil.value.'.$1};                          $Answer->{$currentPart.'.foil.value.'.$1};
                 }                  }
             }              }
         }          }

Removed from v.1.4  
changed lines
  Added in v.1.5


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