Diff for /loncom/interface/statistics/lonproblemanalysis.pm between versions 1.65 and 1.68

version 1.65, 2004/02/10 19:49:54 version 1.68, 2004/02/16 20:50:03
Line 99  sub BuildProblemAnalysisPage { Line 99  sub BuildProblemAnalysisPage {
     }      }
     $r->rflush();      $r->rflush();
     #      #
       my $problem_types = '(option|radiobutton|numerical)';
     if (exists($ENV{'form.problemchoice'}) &&       if (exists($ENV{'form.problemchoice'}) && 
         ! exists($ENV{'form.SelectAnother'})) {          ! exists($ENV{'form.SelectAnother'})) {
         foreach my $button (@SubmitButtons) {          foreach my $button (@SubmitButtons) {
Line 120  sub BuildProblemAnalysisPage { Line 121  sub BuildProblemAnalysisPage {
         #          #
         my ($prev,$curr,$next) =           my ($prev,$curr,$next) = 
             &Apache::lonstathelpers::get_prev_curr_next($current_problem,              &Apache::lonstathelpers::get_prev_curr_next($current_problem,
                                                      '(option|radiobutton)',                                                          $problem_types,
                                                      'response',                                                          'response',
                                                         );                                                          );
         if (exists($ENV{'form.PrevProblemAnalysis'}) && defined($prev)) {          if (exists($ENV{'form.PrevProblemAnalysis'}) && defined($prev)) {
             $current_problem = $prev;              $current_problem = $prev;
Line 157  sub BuildProblemAnalysisPage { Line 158  sub BuildProblemAnalysisPage {
                 &RadioResponseAnalysis($r,$current_problem,                  &RadioResponseAnalysis($r,$current_problem,
                                        $ProblemData,                                         $ProblemData,
                                        \@Students);                                         \@Students);
               } elsif ($current_problem->{'resptype'} eq 'numerical') {
                   &NumericalResponseAnalysis($r,$current_problem,
                                              $ProblemData,\@Students);
             } else {              } else {
                 $r->print('<h2>This analysis is not supported</h2>');                  $r->print('<h2>This analysis is not supported</h2>');
             }              }
Line 168  sub BuildProblemAnalysisPage { Line 172  sub BuildProblemAnalysisPage {
         $r->print('&nbsp;'x5);          $r->print('&nbsp;'x5);
         $r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>');          $r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>');
         $r->print(&Apache::lonstathelpers::ProblemSelector          $r->print(&Apache::lonstathelpers::ProblemSelector
                   ('(option|radiobutton)'));                    ($problem_types));
     }      }
 }  }
   
   #########################################################
   #########################################################
   ##
   ##      Numerical Response Routines
   ##
   #########################################################
   #########################################################
   sub NumericalResponseAnalysis {
       my ($r,$problem,$ProblemData,$Students) = @_;
       $r->print('<h2>This analysis is not yet supported</h2>');
       my ($resource,$respid) = ($problem->{'resource'},
                                 $problem->{'respid'});
       my $analysis_html;
       my $PerformanceData = 
           &Apache::loncoursedata::get_response_data
           ($Students,$resource->{'symb'},$respid);
       if (! defined($PerformanceData) || 
           ref($PerformanceData) ne 'ARRAY' ) {
           $analysis_html = '<h2>'.
               &mt('There is no submission data for this resource').
               '</h2>';
           $r->print($analysis_html);
           return;
       }
       my ($max,$min) = &GetStudentAnswers($r,$problem,$Students);
       $r->print('Maximum = '.$max.' Minimum = '.$min);
       my $max_students = 0;
       my %Data;
       foreach my $student (@$Students) {
           my $answer = $student->{'answer'};
           $Data{$answer}++;
           if ($max_students < $Data{$answer}) {
               $max_students = $Data{$answer};
           }
       }
       foreach (5,10,20,25,50,75,100,150,200,250,500,1000,1500,2000,2500,5000) {
           if ($max_students < $_) {
               $max_students = $_;
               last;
           }
       }
       my @Labels = sort {$a <=> $b } keys(%Data);
       $r->print('number of labels = '.scalar(@Labels));
       my @PlotData = @Data{@Labels};
       $r->print('number of PlotData = '.scalar(@PlotData));
       my $graph = 
           &Apache::loncommon::DrawXYGraph('Correct Answer Distribution',
                                           'Correct Answer',
                                           'Number of students',
                                           $max_students,
                                           undef,
                                           \@Labels,
                                           [\@PlotData],
                                           (xskip=>10));
       $r->print($graph);
       return;
   }
   
   sub GetStudentAnswers {
       my ($r,$problem,$Students) = @_;
       my %Answers;
       my ($resource,$partid,$respid) = ($problem->{'resource'},
                                         $problem->{'part'},
                                         $problem->{'respid'});
       # Open progress window
       my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
           ($r,'Student Answer Compilation Status',
            'Student Answer Compilation Progress', scalar(@$Students));
       $r->print("<table>\n");
       $r->rflush();
       my ($min,$max);
       foreach my $student (@$Students) {
           my $sname = $student->{'username'};
           my $sdom = $student->{'domain'};
           my $answer = analyze_problem_as_student($resource,
                                                   $sname,$sdom,
                                                   $partid,$respid);
           if (! defined($min) || $min > $answer) {
               $min = $answer;
           }
           if (! defined($max) || $max < $answer) {
               $max = $answer;
           }
   #        $r->print('<tr>'.
   #                  '<td>'.$sname.'</td>'.
   #                  '<td>'.$sdom.'</td>'.
   #                  '<td>'.$answer.'</td>'.
   #                  '</tr>'."\n");
           &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
                                                    &mt('last student'));
           $student->{'answer'} = $answer;
       }
       $r->print("</table>\n");
       $r->rflush();
       &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
       # close progress window
       return ($max,$min);
   }
   
   sub build_student_data_worksheet {
       my ($workbook,$format) = @_;
       my $rows_output = 3;
       my $cols_output = 0;
       my $worksheet  = $workbook->addworksheet('Student Data');
       $worksheet->write($rows_output++,0,'Student Data',$format->{'h3'});
       my @Headers = ('full name','username','domain','section',
                      "student\nnumber",'identifier');
       $worksheet->write_row($rows_output++,0,\@Headers,$format->{'header'});
       my @Students = @Apache::lonstatistics::Students;
       my $studentrows = &Apache::loncoursedata::get_student_data(\@Students);
       my %ids;
       foreach my $row (@$studentrows) {
           my ($mysqlid,$student) = @$row;
           $ids{$student}=$mysqlid;
       }
       foreach my $student (@Students) {
           my $name_domain = $student->{'username'}.':'.$student->{'domain'};
           $worksheet->write_row($rows_output++,0,
                             [$student->{'fullname'},
                              $student->{'username'},$student->{'domain'},
                              $student->{'section'},$student->{'id'},
                              $ids{$name_domain}]);
       }
       return $worksheet;
   }
   
 #########################################################  #########################################################
 #########################################################  #########################################################
Line 183  sub BuildProblemAnalysisPage { Line 312  sub BuildProblemAnalysisPage {
 sub RadioResponseAnalysis {  sub RadioResponseAnalysis {
     my ($r,$problem,$ProblemData,$Students) = @_;      my ($r,$problem,$ProblemData,$Students) = @_;
     my ($resource,$respid) = ($problem->{'resource'},      my ($resource,$respid) = ($problem->{'resource'},
                                     $problem->{'respid'});                                $problem->{'respid'});
     my $analysis_html;      my $analysis_html;
     my $PerformanceData =       my $PerformanceData = 
         &Apache::loncoursedata::get_response_data          &Apache::loncoursedata::get_response_data
Line 1268  sub build_foil_index { Line 1397  sub build_foil_index {
         my $a1 = lc($a);           my $a1 = lc($a); 
         my $b1 = lc($b);          my $b1 = lc($b);
         if (exists($Numbers{$a1})) {          if (exists($Numbers{$a1})) {
             $a = $Numbers{$a1};              $a1 = $Numbers{$a1};
         }          }
         if (exists($Numbers{$b1})) {          if (exists($Numbers{$b1})) {
             $b = $Numbers{$b1};              $b1 = $Numbers{$b1};
         }          }
         if (($a =~/^\d+$/) && ($b =~/^\d+$/)) {          if (($a1 =~/^\d+$/) && ($b1 =~/^\d+$/)) {
             return $a <=> $b;              return $a1 <=> $b1;
         } else {          } else {
             return $a cmp $b;              return $a1 cmp $b1;
         }          }
     };      };
     my @Concepts;      my @Concepts;
Line 1552  sub Process_OR_Row { Line 1681  sub Process_OR_Row {
     return %RowData;      return %RowData;
 }  }
   
   
   sub analyze_problem_as_student {
       my ($resource,$sname,$sdom,$partid,$respid) = @_;
       my $url = $resource->{'src'};
       my $symb = $resource->{'symb'};
       my $courseid = $ENV{'request.course.id'};
       my $Answ=&Apache::lonnet::ssi($url,('grade_target' => 'analyze',
                                           'grade_domain' => $sdom,
                                           'grade_username' => $sname,
                                           'grade_symb' => $symb,
                                           'grade_courseid' => $courseid));
       (my $garbage,$Answ)=split(/_HASH_REF__/,$Answ,2);
       my %Answer=&Apache::lonnet::str2hash($Answ);
       my $key = $partid.'.'.$respid.'.answer';
       my $student_answer = $Answer{$key}->[0];
       if (! defined($student_answer)) {
           $student_answer = $Answer{$key}->[1];
       }
       return ($student_answer);
   }
   
 ##  ##
 ## get problem data and put it into a useful data structure.  ## get problem data and put it into a useful data structure.
 ## note: we must force each foil and option to not begin or end with  ## note: we must force each foil and option to not begin or end with
Line 1566  sub get_problem_data { Line 1716  sub get_problem_data {
     my %Partdata;      my %Partdata;
     foreach my $part (@{$Answer{'parts'}}) {      foreach my $part (@{$Answer{'parts'}}) {
         while (my($key,$value) = each(%Answer)) {          while (my($key,$value) = each(%Answer)) {
               #
               # Logging code:
               if (0) {
                   &Apache::lonnet::logthis($part.' got key "'.$key.'"');
                   if (ref($value) eq 'ARRAY') {
                       &Apache::lonnet::logthis('    '.join(',',@$value));
                   } else {
                       &Apache::lonnet::logthis('    '.$value);
                   }
               }
               # End of logging code
             next if ($key !~ /^$part/);              next if ($key !~ /^$part/);
             $key =~ s/^$part\.//;              $key =~ s/^$part\.//;
             if (ref($value) eq 'ARRAY') {              if (ref($value) eq 'ARRAY') {
Line 1579  sub get_problem_data { Line 1740  sub get_problem_data {
                         $Partdata{$part}->{'_Foils'}->{$foil}->{'_Concept'}=                          $Partdata{$part}->{'_Foils'}->{$foil}->{'_Concept'}=
                                                                       $concept;                                                                        $concept;
                     }                      }
                   } elsif ($key =~ /^(incorrect|answer|ans_low|ans_high)$/) {
                       $Partdata{$part}->{$key}=$value;
                 }                  }
             } else {              } else {
                 if ($key=~ /^foil\.text\.(.*)$/) {                  if ($key=~ /^foil\.text\.(.*)$/) {
Line 1599  sub get_problem_data { Line 1762  sub get_problem_data {
 1;  1;
   
 __END__  __END__
   
 #####  
 # partdata{part}->{_Foils}->{foilid}->{'name'}     = $  
 #                                   ->{'text'}     = $  
 #                                   ->{'value'}    = $  
 #                                   ->{'_Concept'} = $  
 # partdata{part}->{_Options}  = @  
 # partdata{part}->{_Concepts} = @  

Removed from v.1.65  
changed lines
  Added in v.1.68


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