Diff for /loncom/interface/statistics/lonproblemanalysis.pm between versions 1.66 and 1.70

version 1.66, 2004/02/13 18:25:57 version 1.70, 2004/02/18 19:16:55
Line 159  sub BuildProblemAnalysisPage { Line 159  sub BuildProblemAnalysisPage {
                                        $ProblemData,                                         $ProblemData,
                                        \@Students);                                         \@Students);
             } elsif ($current_problem->{'resptype'} eq 'numerical') {              } elsif ($current_problem->{'resptype'} eq 'numerical') {
                 &NumericalResponseAnalysis($r,$current_problem,  #                if (exists($ENV{'form.ExcelOutput'})) {
                                            $ProblemData,\@Students);                      &prepare_excel_output($r,$current_problem,
                                             $ProblemData,\@Students);
   #                } else {
   #                    &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 176  sub BuildProblemAnalysisPage { Line 181  sub BuildProblemAnalysisPage {
     }      }
 }  }
   
   
   #########################################################
   #########################################################
   ##
   ##      Excel output of student answers and correct answers
   ##
   #########################################################
   #########################################################
   sub prepare_excel_output {
       my ($r,$problem,$ProblemData,$Students) = @_;
       my ($resource,$respid,$partid) = ($problem->{'resource'},
                                         $problem->{'respid'},
                                         $problem->{'part'});
       $r->print('<h2>'.
                 &mt('Preparing Excel spreadsheet of student responses').
                 '</h2>');
       #
       &GetStudentAnswers($r,$problem,$Students);
       #
       my @Columns = ( 'username','domain','attempt','time',
                       'submission','correct', 'grading','awarded','weight',
                       'score');
       my $awarded_col = 7;
       my $weight_col  = 8;
       #
       # Create excel worksheet
       my $filename = '/prtspool/'.
           $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
           time.'_'.rand(1000000000).'.xls';
       my $workbook  = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
       if (! defined($workbook)) {
           $r->log_error("Error creating excel spreadsheet $filename: $!");
           $r->print('<p>'.&mt("Unable to create new Excel file.  ".
                               "This error has been logged.  ".
                               "Please alert your LON-CAPA administrator").
                     '</p>');
           return undef;
       }
       #
       $workbook->set_tempdir('/home/httpd/perl/tmp');
       #
       my $format = &Apache::loncommon::define_excel_formats($workbook);
       my $worksheet  = $workbook->addworksheet('Student Submission Data');
       #
       # Make sure we get new weight data instead of data on a 10 minute delay
       &Apache::lonnet::clear_EXT_cache_status();
       #
       # Put on the standard headers and whatnot
       my $rows_output=0;
       $worksheet->write($rows_output++,0,$resource->{'title'},$format->{'h1'});
       $worksheet->write($rows_output++,0,$resource->{'src'},$format->{'h3'});
       $rows_output++;
       $worksheet->write_row($rows_output++,0,\@Columns,$format->{'bold'});
       #
       # Populate the worksheet with the student data
       foreach my $student (@$Students) {
           my $results = &Apache::loncoursedata::get_response_data_by_student
               ($student,$resource->{'symb'},$respid);
           my %row;
           $row{'username'} = $student->{'username'};
           $row{'domain'}   = $student->{'domain'};
           $row{'correct'} = $student->{'answer'};
           $row{'weight'} = &Apache::lonnet::EXT
               ('resource.'.$partid.'.weight',$resource->{'symb'},
                undef,undef,undef);
           if (! defined($results) || ref($results) ne 'ARRAY') {
               $row{'score'} = '='.
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                       ($rows_output,$awarded_col)
                   .'*'.
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                       ($rows_output,$weight_col);
               my $cols_output = 0;
               foreach my $col (@Columns) {
                   if (! exists($row{$col})) {
                       $cols_output++;
                       next;
                   }
                   $worksheet->write($rows_output,$cols_output++,$row{$col});
               }
               $rows_output++;
           } else {
               foreach my $response (@$results) {
                   delete($row{'time'});
                   delete($row{'attempt'});
                   delete($row{'submission'});
                   delete($row{'awarded'});
                   delete($row{'grading'});
                   delete($row{'score'});
                   my %row_format;
                   #
                   # Time is handled differently
                   $row{'time'} = &calc_serial(
                        $response->[&Apache::loncoursedata::RDs_timestamp()]);
                   $row_format{'time'}=$format->{'date'};
                   #
                   $row{'attempt'}  = $response->[
                        &Apache::loncoursedata::RDs_tries()];
                   $row{'submission'} = $response->[
                        &Apache::loncoursedata::RDs_submission()];
                   $row{'grading'} = $response->[
                        &Apache::loncoursedata::RDs_awarddetail()];
                   $row{'awarded'} = $response->[
                        &Apache::loncoursedata::RDs_awarded()];
                   $row{'score'} = '='.
                       &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                           ($rows_output,$awarded_col)
                       .'*'.
                       &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                           ($rows_output,$weight_col);
                   my $cols_output = 0;
                   foreach my $col (@Columns) {
                       $worksheet->write($rows_output,$cols_output++,$row{$col},
                                         $row_format{$col});
                   }
                   $rows_output++;
               }
           } # End of else clause on if (! defined($results) ....
       }
       #
       # Close the excel file
       $workbook->close();
       #
       # Write a link to allow them to download it
       $r->print('<p><a href="'.$filename.'">'.
                 &mt('Your Excel spreadsheet.').
                 '</a></p>'."\n");
   
   }
   
   
 #########################################################  #########################################################
 #########################################################  #########################################################
 ##  ##
Line 185  sub BuildProblemAnalysisPage { Line 321  sub BuildProblemAnalysisPage {
 #########################################################  #########################################################
 sub NumericalResponseAnalysis {  sub NumericalResponseAnalysis {
     my ($r,$problem,$ProblemData,$Students) = @_;      my ($r,$problem,$ProblemData,$Students) = @_;
       $r->print('<h2>This analysis is not yet supported</h2>');
     my ($resource,$respid) = ($problem->{'resource'},      my ($resource,$respid) = ($problem->{'resource'},
                               $problem->{'respid'});                                $problem->{'respid'});
     my $analysis_html;      my $analysis_html;
Line 199  sub NumericalResponseAnalysis { Line 336  sub NumericalResponseAnalysis {
         $r->print($analysis_html);          $r->print($analysis_html);
         return;          return;
     }      }
     my $Answers = &GetStudentAnswers($r,$problem,$Students);      my ($max,$min) = &GetStudentAnswers($r,$problem,$Students);
           $r->print('Maximum = '.$max.' Minimum = '.$min);
     $r->print('<h2>This analysis is not yet supported</h2>');      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 {  sub GetStudentAnswers {
Line 219  sub GetStudentAnswers { Line 385  sub GetStudentAnswers {
     foreach my $student (@$Students) {      foreach my $student (@$Students) {
         my $sname = $student->{'username'};          my $sname = $student->{'username'};
         my $sdom = $student->{'domain'};          my $sdom = $student->{'domain'};
         my $answer = analyze_problem_as_student($resource,          my $answer = &analyze_problem_as_student($resource,
                                                 $sname,$sdom,                                                   $sname,$sdom,
                                                 $partid,$respid);                                                   $partid,$respid);
         $r->print('<tr>'.  
                   '<td>'.$sname.'</td>'.  
                   '<td>'.$sdom.'</td>'.  
                   '<td>'.$answer.'</td>'.  
                   '</tr>'."\n");  
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,          &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
                                                  &mt('last student'));                                                   &mt('last student'));
         $Answers{$sname.':'.$sdom}=$answer;          $student->{'answer'} = $answer;
     }      }
     $r->print("</table>\n");      $r->print("</table>\n");
     $r->rflush();      $r->rflush();
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);  
     # close progress window      # close progress window
     return \%Answers;      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
       return;
   }
   
   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 935  sub OR_excel_sheet { Line 1123  sub OR_excel_sheet {
     }      }
     #      #
     $workbook->set_tempdir('/home/httpd/perl/tmp');      $workbook->set_tempdir('/home/httpd/perl/tmp');
     #      my $format = &Apache::loncommon::define_excel_formats($workbook);
     # Define some potentially useful formats  
     my $format;  
     $format->{'header'} = $workbook->add_format(bold      => 1,   
                                                 bottom    => 1,  
                                                 align     => 'center');  
     $format->{'bold'} = $workbook->add_format(bold=>1);  
     $format->{'h1'}   = $workbook->add_format(bold=>1, size=>18);  
     $format->{'h2'}   = $workbook->add_format(bold=>1, size=>16);  
     $format->{'h3'}   = $workbook->add_format(bold=>1, size=>14);  
     $format->{'date'} = $workbook->add_format(num_format=>  
                                               'mmm d yyyy hh:mm AM/PM');  
     #      #
     # Create and populate main worksheets      # Create and populate main worksheets
     my $problem_data_sheet  = $workbook->addworksheet('Problem Data');      my $problem_data_sheet  = $workbook->addworksheet('Problem Data');
     my $student_data_sheet  = $workbook->addworksheet('Student Data');      my $student_data_sheet = &build_student_data_worksheet($workbook,$format);
     my $response_data_sheet = $workbook->addworksheet('Response Data');      my $response_data_sheet = $workbook->addworksheet('Response Data');
     foreach my $sheet ($problem_data_sheet,$student_data_sheet,      foreach my $sheet ($problem_data_sheet,$student_data_sheet,
                        $response_data_sheet) {                         $response_data_sheet) {
Line 964  sub OR_excel_sheet { Line 1141  sub OR_excel_sheet {
     if ($result ne 'okay') {      if ($result ne 'okay') {
         # Do something useful          # Do something useful
     }      }
     $result = &OR_build_student_data_worksheet($student_data_sheet,$format);  
     if ($result ne 'okay') {  
         # Do something useful  
     }  
     $result = &OR_build_response_data_worksheet($response_data_sheet,$format,      $result = &OR_build_response_data_worksheet($response_data_sheet,$format,
                                              $PerformanceData,$Foils,                                               $PerformanceData,$Foils,
                                              $ORdata);                                               $ORdata);
Line 1056  sub OR_build_problem_data_worksheet { Line 1229  sub OR_build_problem_data_worksheet {
     return 'okay';      return 'okay';
 }  }
   
 sub OR_build_student_data_worksheet {  
     my ($worksheet,$format) = @_;  
     my $rows_output = 3;  
     my $cols_output = 0;  
     $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;  
 }  
   
 sub OR_build_response_data_worksheet {  sub OR_build_response_data_worksheet {
     my ($worksheet,$format,$PerformanceData,$Foils,$ORdata)=@_;      my ($worksheet,$format,$PerformanceData,$Foils,$ORdata)=@_;
     my $rows_output = 3;      my $rows_output = 3;
Line 1333  sub build_foil_index { Line 1480  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;

Removed from v.1.66  
changed lines
  Added in v.1.70


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