Diff for /loncom/interface/statistics/lonproblemanalysis.pm between versions 1.2 and 1.14

version 1.2, 2002/07/30 21:31:48 version 1.14, 2002/11/25 18:02:49
Line 26 Line 26
 # 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();
   use Apache::lonhtmlcommon();
 use GDBM_File;  use GDBM_File;
   
 my $jr;  my $jr;
   
 sub BuildProblemAnalysisPage {  sub BuildProblemAnalysisPage {
     my ($cacheDB)=@_;      my ($cacheDB, $r)=@_;
   
     my %cache;      my %cache;
     my $Str = '';      unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {          $r->print('Unable to tie database.');
         $Str .= '<html><body>Unable to tie database.</body></html>';          return;
         return $Str;  
     }      }
   
     $Str .= &IntervalOptions($cache{'Interval'});      my $Ptr = '';
     $Str .= &OptionResponseTable($cache{'OptionResponses'}, \%cache);      $Ptr .= '<table border="0"><tbody>';
       $Ptr .= '<tr><td align="right"><b>Select Sections</b>';
       $Ptr .= '</td>'."\n";
       $Ptr .= '<td align="left">'."\n";
       my @sectionsSelected = split(':',$cache{'sectionsSelected'});
       my @sections = split(':',$cache{'sectionList'});
       $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,
                                                             \@sectionsSelected,
                                                             'Statistics');
       $Ptr .= '</td></tr>'."\n";
       $Ptr .= '<tr><td align="right"><b>Intervals</b></td>'."\n";
       $Ptr .= '<td align="left">';
       $Ptr .= &IntervalOptions($cache{'Interval'});
       $Ptr .= '</td></tr></table><br>';
       $r->print($Ptr);
       $r->rflush();
       $r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache, $r));
   
     untie(%cache);      untie(%cache);
   
     return $Str;      return;
 }  }
   
 sub BuildAnalyzePage {  sub BuildAnalyzePage {
Line 69  sub BuildAnalyzePage { Line 81  sub BuildAnalyzePage {
   
     my $Str = '</form>';      my $Str = '</form>';
     my %cache;      my %cache;
     foreach (@$students) {  
         if($c->aborted) {      unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
             return $Str;          $Str .= 'Unable to tie database.';
         }          $r->print($Str);
         my $courseData =           return;
             &Apache::loncoursedata::DownloadCourseInformation($_,   
                                                               $courseID);  
         if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT,0640)) {  
             &Apache::loncoursedata::ProcessStudentData(\%cache,   
                                                        $courseData, $_);  
             untie(%cache);  
         } else {  
             last if($c->aborted());  
             next;  
         }  
     }      }
   
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {      # Remove students who don't have the proper section.
         $Str .= '<html><body>Unable to tie database.</body></html>';      my @sectionsSelected = split(':',$cache{'sectionsSelected'});
         return $Str;  
       my $studentCount = scalar @$students;
       for(my $studentIndex=$studentCount-1; $studentIndex>=0;
           $studentIndex--) {
           my $value = $cache{$students->[$studentIndex].':section'};
           my $found = 0;
           foreach (@sectionsSelected) {
               if($_ eq 'none') {
                   if($value eq '' || !defined($value) || $value eq ' ') {
                       $found = 1;
                       last;
                   }
               } else {
                   if($value eq $_) {
                       $found = 1;
                       last;
                   }
               }
           }
           if($found == 0) {
               splice(@$students, $studentIndex, 1);
           }
       }
       unless(untie(%cache)) {
           $r->print('Can not untie hash.');
           $r->rflush();
       }
       #if($status eq 'true')
       { &Apache::lonhtmlcommon::Close_PrgWin($r); }
   
   
   #    my $error =
   #        &Apache::loncoursedata::DownloadStudentCourseDataSeparate($students,
   #                                                                  'true',
   #                                                                  $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)) {
           $Str .= 'Unable to tie database.';
           $r->print($Str);
           return;
     }      }
   
     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 $title = 'LON-CAPA Statistics';
       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 .= 'Incorrect part requested.<br>';          $Str .= $analyzeData->{'error'}.'<br>Incorrect part requested.<br>';
         return $Str;          $r->print($Str);
           return;
     }      }
   
       $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'},
               \%ConceptData);                \%ConceptData);
   
     $title =~ s/\ /"_"/eg;      $title =~ s/\ /"_"/eg;
     $Str .= '<br><b>'.$uri.'</b>';      $Str .= '<br><b>'.$uri.'</b>';
            
       $r->print($Str);
       $Str = '';
       if($c->aborted()) {  untie(%cache); return; }
   
       &Apache::lonhtmlcommon::Create_PrgWin($r, $title, $heading);
   
       my $count=0;
     #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++) {
 # &Update_PrgWin($index);          if($c->aborted()) {  untie(%cache); return; }
 # &OpStatus($problem, $students->[$index], $courseID, \%ConceptData,          $count++;
 #                  $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);          my $displayString = $count.'/'.$studentCount.': '.$_;
  &OpStatus($problem, $students->[$index], \%ConceptData,           &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r);
                   $analyzeData->{'foil_to_concept'}, $analyzeData, \%cache);   &OpStatus($problemId, $students->[$index], \%ConceptData,
                     $analyzeData->{'foil_to_concept'}, $analyzeData,
     \%cache, $courseID);
     }      }
 #    &Close_PrgWin();      &Apache::lonhtmlcommon::Close_PrgWin($r);
   
     $Str .= '<br>';      $Str .= '<br>';
     for (my $k=0; $k<$interval; $k++ ) {      for (my $k=0; $k<$interval; $k++ ) {
  $Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'},           if($c->aborted()) {  untie(%cache); return $Str; }
    $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; }
  $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 155  sub IntervalOptions { Line 229  sub IntervalOptions {
         }          }
     }      }
   
     my $Ptr = '<br><b>Select number of intervals</b>'."\n".      my $Ptr = '<select name="Interval">'."\n";
              '<select name="Interval">'."\n";  
     for(my $n=1; $n<=7;$ n++) {      for(my $n=1; $n<=7;$ n++) {
  $Ptr .= '<option';   $Ptr .= '<option';
         if($interval == $n) {          if($interval == $n) {
Line 170  sub IntervalOptions { Line 243  sub IntervalOptions {
 }  }
   
 sub OptionResponseTable {  sub OptionResponseTable {
     my ($optionResponses,$cache)=@_;      my ($optionResponses,$cache,$r)=@_;
     my $Str = '';  
     $Str .= '<br><b> Option Response Problems in this course:</b>'."\n";  
     $Str .= '<br><br>'."\n";  
     $Str .= "<table border=2><tr><th> \# </th><th> Problem Title </th>";  
     $Str .= '<th> Resource </th><th> Analysis  </th></tr>'."\n";  
   
     my $number=1;  
     my @optionResponses=split(':::', $optionResponses);      my @optionResponses=split(':::', $optionResponses);
     my %partCount;      my %partCount;
     foreach (@optionResponses) {      my %sequences;
         my ($problemId, $part, undef)=split(':',$_);      my @orderedSequences=();
       foreach(@optionResponses) {
           my ($sequence, $problemId, $part, undef)=split(':',$_);
         $partCount{$problemId.':'.$part}++;          $partCount{$problemId.':'.$part}++;
           if(!defined($sequences{$sequence})) {
               push(@orderedSequences, $sequence);
               $sequences{$sequence} = $_;
           } else {
               $sequences{$sequence} .= ':::'.$_;
           }
     }      }
   
     foreach (@optionResponses) {      my $Str = '';
         my ($problemId, $part, $response)=split(':',$_);  
         my $uri = $cache->{$problemId.':source'};      foreach my $sequence (@orderedSequences) {
         my $title = $cache->{$problemId.':title'};          my @optionProblems = split(':::', $sequences{$sequence});
   
         my $Temp = '<a href="'.$uri.'" target="_blank">'.$title.'</a>';          $Str .= '<b>'.$cache->{$sequence.':title'}.'</b>'."\n";
         $Str .= '<tr>';          $Str .= "<table border=2><tr><th> \# </th><th> Problem Title </th>";
         $Str .= '<td> '.$number.' </td>';          $Str .= '<th> Resource </th><th> Analysis  </th></tr>'."\n";
         $Str .= '<td bgcolor="#DDFFDD">'.$Temp.'</td>';  
         $Str .= '<td bgcolor="#EEFFCC">'.$uri.'</td>';          my $count = 1;
         if($partCount{$problemId.':'.$part} < 2) {          foreach(@optionProblems) {
             $Str .= '<td><input type="submit" name="Analyze:::';              my (undef, $problemId, $part, $response)=
             $Str .= $problemId.':'.$part.'" value="';                  split(':',$optionProblems[$count-1]);
             $Str .= 'Part '.$part;  #                split(':',$sequences{$sequence});
             $Str .= '" /></td></tr>'."\n";              my $uri = $cache->{$problemId.':source'};
         } else {              my $title = $cache->{$problemId.':title'};
             $Str .= '<td><input type="submit" name="Analyze:::'.$_.'" value="';  
             $Str .= 'Part '.$part.' Response '.$response;              my $Temp = '<a href="'.$uri.'" target="_blank">'.$title.'</a>';
             $Str .= '" /></td></tr>'."\n";              $Str .= '<tr>';
               $Str .= '<td> '.$count.' </td>';
               $Str .= '<td bgcolor="#DDFFDD">'.$Temp.'</td>';
               $Str .= '<td bgcolor="#EEFFCC">'.$uri.'</td>';
               if($partCount{$problemId.':'.$part} < 2) {
                   $Str .= '<td><input type="submit" name="Analyze:::';
                   $Str .= $problemId.':'.$part.'" value="';
                   $Str .= 'Part '.$part;
                   $Str .= '" /></td></tr>'."\n";
               } else {
                   my $value = $problemId.':'.$part.':'.$response;
                   $Str .= '<td><input type="submit" name="Analyze:::'.$value;
                   $Str .= '" value="';
                   $Str .= 'Part '.$part.' Response '.$response;
                   $Str .= '" /></td></tr>'."\n";
               }
               $count++;
         }          }
         $number++;          $Str .= '</table><br>'."\n";
     }      }
     $Str .= '</table>'."\n";  
   
     return $Str;      return $Str;
 }  }
Line 217  sub OptionResponseTable { Line 307  sub OptionResponseTable {
 #---- Analyze Web Page -------------------------------------------------------  #---- Analyze Web Page -------------------------------------------------------
   
 #restore the student submissions and finding the result  #restore the student submissions and finding the result
   =pod
 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"})) {              my %submission=&Apache::lonnet::str2hash($Resp);
                 &Apache::lonxml::debug("skipping ");              foreach (keys(%submission)) {
                 next;                  if($submission{$_}) {
                       my $answer = $analyzeData->{$id.'.foil.value.'.$_};
                       if($submission{$_} eq $answer) {
                           &Decide("true", $foil_to_concept->{$_},
                                   $time, $ConceptData);
                       } else {
                           &Decide("false", $foil_to_concept->{$_},
                                   $time, $ConceptData);
                       }
                   }
             }              }
             my $Resp = $cache->{$student.':'.$version.':'.$problem.          }
                                 ':resource.'.$id.'.submission'};      }
   
       return;
   }
   =cut
   
   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;
   
   #    $jr->print("<br> ID= $problemID <br> student= $student<br> prob= $symb<br>");
   
       foreach my $id (@$ids) {
    my ($part, $response) = split(/\./, $id);
   #=pod
       my %reshash=&Apache::lonnet::restore($symb,$courseID,$udom,$uname);
       if ($reshash{'version'}) {
           my $tries=0;
    #&Apache::lonhomework::showhash(%$analyzeData);
    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);
                       }
       }
           }
       }
           }
       }
   #=cut
   =pod
           my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'};
    my @submissions = split(':::', $cache->{$student.':'.$problemID.':'.
                                                  $part.':'.$response.
                                                   ':submission'});
           foreach my $Resp (@submissions) {
             my %submission=&Apache::lonnet::str2hash($Resp);              my %submission=&Apache::lonnet::str2hash($Resp);
             foreach (keys(%submission)) {              foreach (keys(%submission)) {
                 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);
                     }                      }
                 }                  }
             }              }
         }          }
   =cut
     }      }
   
     return;      return;
 }  }
   
   =pod
   sub OpStatus {
       my ($rid,$student,$ConceptData,$foil_to_concept,$analyzeData,$cache)=@_;
       my ($uname,$udom)=split(/\:/,$student);
       my $code='U';
       $rid=~/(\d+)\.(\d+)/;
       my $symb=&Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'.
        &Apache::lonnet::declutter($hash{'src_'.$rid});
       my %reshash=&Apache::lonnet::restore($symb,$cid,$udom,$uname);
       my @True = ();
       my @False = ();
       my $flag=0;
       if ($reshash{'version'}) {
           my $tries=0;
    &Apache::lonhomework::showhash(%Answer);
    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 = $Answer{"$Id1.$Id2.foil.value.$_"};
    if ($submission{$_}) {
       if ($submission{$_} eq $Ansr) {
    &Decide("true",$_,$time );
       }
       else {&Decide("false",$_,$time );}
    }
       }
           }
       }
           }
       }
   }
   =cut
   
 sub DrawGraph {  sub DrawGraph {
     my ($k,$Src,$Concepts,$ConceptData)=@_;      my ($k,$Src,$Concepts,$ConceptData)=@_;
     my $Max=0;      my $Max=0;
     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 331  sub DrawTable { Line 536  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 388  sub InitAnalysis { Line 593  sub InitAnalysis {
                                         'grade_domain'   => $domain,                                          'grade_domain'   => $domain,
                                         'grade_courseid' => $courseID,                                          'grade_courseid' => $courseID,
                                         'grade_symb'     => $problem));                                          'grade_symb'     => $problem));
       my ($Answer)=&Apache::lonnet::str2hashref($Answ);
     my %Answer=();  
     %Answer=&Apache::lonnet::str2hash($Answ);  
   
     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 403  sub InitAnalysis { Line 606  sub InitAnalysis {
             }              }
         }          }
     } else {      } else {
         foreach (@{$Answer{'parts'}}) {          foreach (@{$Answer->{'parts'}}) {
             if($_ =~ /$part/) {              if($_ =~ /$part/) {
                 push(@parts, $_);                  push(@parts, $_);
                 $found = 1;                  $found = 1;
Line 420  sub InitAnalysis { Line 623  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};
                 }                  }
             }              }
         }          }
Line 459  sub Interval { Line 662  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.2  
changed lines
  Added in v.1.14


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