Diff for /loncom/interface/statistics/lonproblemanalysis.pm between versions 1.7 and 1.21

version 1.7, 2002/08/14 16:18:55 version 1.21, 2003/03/03 22:00:03
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # (Publication Handler  
 #  #
 # $Id$  # $Id$
 #  #
Line 26 Line 25
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (Navigate problems for statistical reports  # (Navigate problems for statistical reports
 # YEAR=2001  
 # 5/5,7/9,7/25/1,8/11,9/13,9/26,10/5,10/9,10/22,10/26 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  # 5/12,7/26,9/7,11/22 Behrouz Minaei
 # 5/12,5/14,5/15,5/19,5/26,7/16  Behrouz Minaei  
 #  #
 ###  ###
   
 package Apache::lonproblemanalysis;   package Apache::lonproblemanalysis;
   
 use strict;  use strict;
 use Apache::lonnet();  use Apache::lonnet();
Line 60  sub BuildProblemAnalysisPage { Line 55  sub BuildProblemAnalysisPage {
     $Ptr .= '<td align="left">'."\n";      $Ptr .= '<td align="left">'."\n";
     my @sectionsSelected = split(':',$cache{'sectionsSelected'});      my @sectionsSelected = split(':',$cache{'sectionsSelected'});
     my @sections = split(':',$cache{'sectionList'});      my @sections = split(':',$cache{'sectionList'});
     $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,      $Ptr .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
                                                           \@sectionsSelected,  
                                                           'Statistics');  
     $Ptr .= '</td></tr>'."\n";      $Ptr .= '</td></tr>'."\n";
     $Ptr .= '<tr><td align="right"><b>Intervals</b></td>'."\n";      $Ptr .= '<tr><td align="right"><b>Intervals</b></td>'."\n";
     $Ptr .= '<td align="left">';      $Ptr .= '<td align="left">';
Line 70  sub BuildProblemAnalysisPage { Line 63  sub BuildProblemAnalysisPage {
     $Ptr .= '</td></tr></table><br>';      $Ptr .= '</td></tr></table><br>';
     $r->print($Ptr);      $r->print($Ptr);
     $r->rflush();      $r->rflush();
     $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache));  #   $r->print($cache{'OptionResponses'}.'<br>');
       $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache, $r));
   
     untie(%cache);      untie(%cache);
   
Line 94  sub BuildAnalyzePage { Line 88  sub BuildAnalyzePage {
   
     # Remove students who don't have the proper section.      # Remove students who don't have the proper section.
     my @sectionsSelected = split(':',$cache{'sectionsSelected'});      my @sectionsSelected = split(':',$cache{'sectionsSelected'});
     for(my $studentIndex=((scalar @$students)-1); $studentIndex>=0;  
       my $studentCount = scalar @$students;
       for(my $studentIndex=$studentCount-1; $studentIndex>=0;
         $studentIndex--) {          $studentIndex--) {
         my $value = $cache{$students->[$studentIndex].':section'};          my $value = $cache{$students->[$studentIndex].':section'};
         my $found = 0;          my $found = 0;
Line 115  sub BuildAnalyzePage { Line 111  sub BuildAnalyzePage {
             splice(@$students, $studentIndex, 1);              splice(@$students, $studentIndex, 1);
         }          }
     }      }
     untie(%cache);      unless(untie(%cache)) {
           $r->print('Can not untie hash.');
     if(&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students,           $r->rflush();
                                                                  'true',       }
                                                                  $cacheDB,   
                                                                  'true',       &Apache::lonhtmlcommon::Close_PrgWin($r);
                                                                  'true',   
                                                                  $courseID,   ### jason code for checing is there data in cache
                                                                  $r,   #    my $error =
                                                                  $c) ne 'OK') {  #        &Apache::loncoursedata::DownloadStudentCourseDataSeparate($students,
         $r->print($Str);  #                                                                  'true',
         return;  #                                                                  $cacheDB,
     }  #                                                                  'true',
   #                                                                  'true',
   #                                                                  $courseID,
   #                                                                  $r, $c);
   #    if($error ne 'OK') {
   #        $r->print($error.'<br>Error downloading course data<br>');
   #        return;
   #    }
   
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {      unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
         $Str .= 'Unable to tie database.';          $Str .= 'Unable to tie database.';
Line 138  sub BuildAnalyzePage { Line 140  sub BuildAnalyzePage {
   
     my ($problemId, $part, $responseId)=split(':',$cache{'AnalyzeInfo'});      my ($problemId, $part, $responseId)=split(':',$cache{'AnalyzeInfo'});
     my $uri      = $cache{$problemId.':source'};      my $uri      = $cache{$problemId.':source'};
     my $problem  = $cache{$problemId.':problem'};       my $problem  = $cache{$problemId.':problem'};
     my $title    = $cache{$problemId.':title'};      my $title    = $cache{$problemId.':title'};
     my $interval = $cache{'Interval'};      my $interval = $cache{'Interval'};
       my $heading = 'Restore this particular Option Response Problem '.
                     'Results, Please wait...';
   
     my %ConceptData;      my %ConceptData;
     $ConceptData{"Interval"} = $interval;      $ConceptData{"Interval"} = $interval;
   
     #Initialize the option response true answers      #Initialize the option response true answers
     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 .= $analyzeData->{'error'}.'<br>Incorrect part requested.<br>';          $Str .= $analyzeData->{'error'}.'<br>Incorrect part requested.<br>';
Line 159  sub BuildAnalyzePage { Line 163  sub BuildAnalyzePage {
     if($c->aborted()) {  untie(%cache); return; }      if($c->aborted()) {  untie(%cache); return; }
   
     #compute the intervals      #compute the intervals
     &Interval($part, $problem, $interval, $analyzeData->{'concepts'},       &Interval($part, $problem, $interval, $analyzeData->{'concepts'},
               \%ConceptData);                \%ConceptData);
   
     $title =~ s/\ /"_"/eg;      $title =~ s/\ /"_"/eg;
Line 168  sub BuildAnalyzePage { Line 172  sub BuildAnalyzePage {
     $r->print($Str);      $r->print($Str);
     $Str = '';      $Str = '';
     if($c->aborted()) {  untie(%cache); return; }      if($c->aborted()) {  untie(%cache); return; }
            
   
       my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r, $title,
         $heading,$#$students+1);
   
     #Java script Progress window      #Java script Progress window
     for(my $index=0; $index<(scalar @$students); $index++) {      for(my $index=0; $index<(scalar @$students); $index++) {
         if($c->aborted()) {  untie(%cache); return; }          if($c->aborted()) {  untie(%cache); return; }
  &OpStatus($problemId, $students->[$index], \%ConceptData,    &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
                   $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);   'last student '.$students->[$index]);
    &OpStatus($problemId, $students->[$index], \%ConceptData,
                     $analyzeData->{'foil_to_concept'}, $analyzeData,
     \%cache, $courseID);
     }      }
       &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
   
     $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);          $r->print($Str);
         $Str = '';          $Str = '';
Line 226  sub IntervalOptions { Line 238  sub IntervalOptions {
 }  }
   
 sub OptionResponseTable {  sub OptionResponseTable {
     my ($optionResponses,$cache)=@_;      my ($optionResponses,$cache,$r)=@_;
   
     my @optionResponses=split(':::', $optionResponses);      my @optionResponses=split(':::', $optionResponses);
     my %partCount;      my %partCount;
     my %sequences;      my %sequences;
       my @orderedSequences=();
     foreach(@optionResponses) {      foreach(@optionResponses) {
         my ($sequence, $problemId, $part, undef)=split(':',$_);          my ($sequence, $problemId, $part, undef)=split(':',$_);
         $partCount{$problemId.':'.$part}++;          $partCount{$problemId.':'.$part}++;
         if(!defined($sequences{$sequence})) {          if(!defined($sequences{$sequence})) {
               push(@orderedSequences, $sequence);
             $sequences{$sequence} = $_;              $sequences{$sequence} = $_;
         } else {          } else {
             $sequences{$sequence} .= ':::'.$_;              $sequences{$sequence} .= ':::'.$_;
Line 243  sub OptionResponseTable { Line 257  sub OptionResponseTable {
   
     my $Str = '';      my $Str = '';
   
     foreach my $sequence (sort(keys(%sequences))) {      foreach my $sequence (@orderedSequences) {
         my @optionProblems = split(':::', $sequences{$sequence});          my @optionProblems = split(':::', $sequences{$sequence});
   
         $Str .= '<b>'.$cache->{$sequence.':title'}.'</b>'."\n";          $Str .= '<b>'.$cache->{$sequence.':title'}.'</b>'."\n";
Line 253  sub OptionResponseTable { Line 267  sub OptionResponseTable {
         my $count = 1;          my $count = 1;
         foreach(@optionProblems) {          foreach(@optionProblems) {
             my (undef, $problemId, $part, $response)=              my (undef, $problemId, $part, $response)=
                 split(':',$sequences{$sequence});                  split(':',$optionProblems[$count-1]);
   #                split(':',$sequences{$sequence});
             my $uri = $cache->{$problemId.':source'};              my $uri = $cache->{$problemId.':source'};
             my $title = $cache->{$problemId.':title'};              my $title = $cache->{$problemId.':title'};
   
Line 286  sub OptionResponseTable { Line 301  sub OptionResponseTable {
   
 #---- Analyze Web Page -------------------------------------------------------  #---- Analyze Web Page -------------------------------------------------------
   
 #restore the student submissions and finding the result  # Joson code for reading data from cache
   =pod
 sub OpStatus {  sub OpStatus {
     my ($problemID, $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;
Line 299  sub OpStatus { Line 316  sub OpStatus {
     my $tries=0;      my $tries=0;
   
     foreach my $id (@$ids) {      foreach my $id (@$ids) {
         my ($part, $response) = split(/\./, $id);   my ($part, $response) = split(/\./, $id);
         my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'};          my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'};
         my @submissions = split(':::', $cache->{$student.':'.$problemID.':'.          my @submissions = split(':::', $cache->{$student.':'.$problemID.':'.
                                                 $part.':'.$response.                                                  $part.':'.$response.
Line 310  sub OpStatus { Line 327  sub OpStatus {
                 if($submission{$_}) {                  if($submission{$_}) {
                     my $answer = $analyzeData->{$id.'.foil.value.'.$_};                      my $answer = $analyzeData->{$id.'.foil.value.'.$_};
                     if($submission{$_} eq $answer) {                      if($submission{$_} eq $answer) {
                         &Decide("true", $foil_to_concept->{$_},                           &Decide("true", $foil_to_concept->{$_},
                                 $time, $ConceptData);                                  $time, $ConceptData);
                     } else {                      } else {
                         &Decide("false", $foil_to_concept->{$_},                           &Decide("false", $foil_to_concept->{$_},
                                 $time, $ConceptData);                                  $time, $ConceptData);
                     }                      }
                 }                  }
Line 323  sub OpStatus { Line 340  sub OpStatus {
   
     return;      return;
 }  }
   =cut
   
   
   #restore the student submissions and finding the result
   
   sub OpStatus {
       my ($problemID, $student, $ConceptData, $foil_to_concept,
           $analyzeData, $cache, $courseID)=@_;
   
       my $ids = $analyzeData->{'parts'};
       my ($uname,$udom)=split(/\:/,$student);
       my $symb  = $cache->{$problemID.':problem'};
   
       my @True = ();
       my @False = ();
       my $flag=0;
       my $tries=0;
   
       foreach my $id (@$ids) {
    my ($part, $response) = split(/\./, $id);
       my %reshash=&Apache::lonnet::restore($symb,$courseID,$udom,$uname);
       if ($reshash{'version'}) {
               my $tries=0;
               for (my $version=1;$version<=$reshash{'version'};$version++) {
        my $time=$reshash{"$version:timestamp"};
        foreach my $key (sort(split(/\:/,$reshash{$version.':keys'}))) {
                       if (($key=~/\.(\w+)\.(\w+)\.submission$/)) {
           my $Id1 = $1; my $Id2 = $2;
           #check if this is a repeat submission, if so skip it
                    if ($reshash{"$version:resource.$Id1.previous"}) { next; }
           #if no solved this wasn't a real submission, ignore it
           if (!defined($reshash{"$version:resource.$Id1.solved"})) {
       &Apache::lonxml::debug("skipping ");
       next;
           }
           my $Resp = $reshash{"$version:$key"};
           my %submission=&Apache::lonnet::str2hash($Resp);
           foreach (keys %submission) {
       my $Ansr = $analyzeData->{"$Id1.$Id2.foil.value.$_"};
                          if($submission{$_} eq $Ansr) {
                           &Decide("true", $foil_to_concept->{$_},
                                   $time, $ConceptData);
                          } else {
                           &Decide("false", $foil_to_concept->{$_},
    $time, $ConceptData);
                          }
           }
               }
           }
               }
           }
       }
   
       return;
   }
   
   
 sub DrawGraph {  sub DrawGraph {
     my ($k,$Src,$Concepts,$ConceptData)=@_;      my ($k,$Src,$Concepts,$ConceptData)=@_;
Line 330  sub DrawGraph { Line 403  sub DrawGraph {
     my @data1;      my @data1;
     my @data2;      my @data2;
   
     # Adjust Data and find the Max       # Adjust Data and find the Max
     for (my $n=0; $n<(scalar @$Concepts); $n++ ) {      for (my $n=0; $n<(scalar @$Concepts); $n++ ) {
  my $tmp=$Concepts->[$n];   my $tmp=$Concepts->[$n];
  $data1[$n]=$ConceptData->{$tmp.'.'.$k.'.true'};   $data1[$n]=$ConceptData->{$tmp.'.'.$k.'.true'};
Line 360  sub DrawGraph { Line 433  sub DrawGraph {
     $GData  = $Titr.'&Concepts&Answers&'.$Max.'&'.$P_No.'&';      $GData  = $Titr.'&Concepts&Answers&'.$Max.'&'.$P_No.'&';
     $GData .= (join(',',@data1)).'&'.(join(',',@data2));      $GData .= (join(',',@data1)).'&'.(join(',',@data2));
   
     return '<IMG src="/cgi-bin/graph.gif?'.$GData.'" border=1/>';      return '<IMG src="/cgi-bin/graph.png?'.$GData.'" border=1/>';
 }  }
   
 sub DrawTable {  sub DrawTable {
Line 389  sub DrawTable { Line 462  sub DrawTable {
     my $P_No = (scalar @data1);      my $P_No = (scalar @data1);
     my $Str = '';      my $Str = '';
 #    $Str .= '<br><b>From: ['.localtime($ConceptData->{'Int.'.($k-1)});  #    $Str .= '<br><b>From: ['.localtime($ConceptData->{'Int.'.($k-1)});
 #    $Str .= '] To: ['.localtime($ConceptData->{"Int.$k"}).']</b>';   #    $Str .= '] To: ['.localtime($ConceptData->{"Int.$k"}).']</b>';
     $Str .= "\n".'<table border=2>'.      $Str .= "\n".'<table border=2>'.
             "\n".'<tr>'.              "\n".'<tr>'.
             "\n".'<th> # </th>'.              "\n".'<th> # </th>'.
Line 515  sub Interval { Line 588  sub Interval {
     for(my $i=1; $i<$Int; $i++) {      for(my $i=1; $i<$Int; $i++) {
  $ConceptData->{'Int.'.$i}=$opn+$i*$add;   $ConceptData->{'Int.'.$i}=$opn+$i*$add;
     }      }
     $ConceptData->{'Int.'.$Int}=$due;           $ConceptData->{'Int.'.$Int}=$due;
     for(my $i=0; $i<$Int; $i++) {      for(my $i=0; $i<$Int; $i++) {
  for(my $n=0; $n<(scalar @$Concepts); $n++ ) {   for(my $n=0; $n<(scalar @$Concepts); $n++ ) {
     my $tmp=$Concepts->[$n];      my $tmp=$Concepts->[$n];

Removed from v.1.7  
changed lines
  Added in v.1.21


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