version 1.7, 2002/08/14 16:18:55
|
version 1.23, 2003/09/29 21:09:27
|
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(); |
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
use GDBM_File; |
use Apache::loncoursedata(); |
|
use Apache::lonstatistics; |
my $jr; |
use Apache::lonlocal; |
|
|
sub BuildProblemAnalysisPage { |
sub BuildProblemAnalysisPage { |
my ($cacheDB, $r)=@_; |
my ($r,$c)=@_; |
|
$r->print(&mt('<h2>Option Response Problem Analysis</h2>')); |
my %cache; |
if (exists($ENV{'form.problemchoice'})) { |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
# This is me getting around my own cleverness: |
$r->print('Unable to tie database.'); |
&Apache::lonstatistics::MapSelect('Maps','multiple,all',5, |
return; |
undef); |
} |
# |
|
my ($symb,$id) = &get_problem_symb( |
my $Ptr = ''; |
&Apache::lonnet::unescape($ENV{'form.problemchoice'}) |
$Ptr .= '<table border="0"><tbody>'; |
); |
$Ptr .= '<tr><td align="right"><b>Select Sections</b>'; |
$r->print('<hr />'); |
$Ptr .= '</td>'."\n"; |
my $resource = &get_resource_from_symb($symb); |
$Ptr .= '<td align="left">'."\n"; |
if (defined($resource)) { |
my @sectionsSelected = split(':',$cache{'sectionsSelected'}); |
$r->print('<table bgcolor="ffffff"><tr><td>'. |
my @sections = split(':',$cache{'sectionList'}); |
# Oh this is dumb! Need to rewrite relative links |
$Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections, |
# otherwise images (for example) will not show. |
\@sectionsSelected, |
&Apache::lonnet::ssi_body($resource->{'src'}). |
'Statistics'); |
'</td></tr></table>'); |
$Ptr .= '</td></tr>'."\n"; |
} else { |
$Ptr .= '<tr><td align="right"><b>Intervals</b></td>'."\n"; |
$r->print('resource is undefined'); |
$Ptr .= '<td align="left">'; |
|
$Ptr .= &IntervalOptions($cache{'Interval'}); |
|
$Ptr .= '</td></tr></table><br>'; |
|
$r->print($Ptr); |
|
$r->rflush(); |
|
$r->print(&OptionResponseTable($cache{'OptionResponses'}, \%cache)); |
|
|
|
untie(%cache); |
|
|
|
return; |
|
} |
|
|
|
sub BuildAnalyzePage { |
|
my ($cacheDB, $students, $courseID,$r)=@_; |
|
|
|
$jr = $r; |
|
my $c = $r->connection; |
|
|
|
my $Str = '</form>'; |
|
my %cache; |
|
|
|
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { |
|
$Str .= 'Unable to tie database.'; |
|
$r->print($Str); |
|
return; |
|
} |
|
|
|
# Remove students who don't have the proper section. |
|
my @sectionsSelected = split(':',$cache{'sectionsSelected'}); |
|
for(my $studentIndex=((scalar @$students)-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); |
|
} |
} |
} |
$r->print('<ol>'); |
untie(%cache); |
$r->print("<li />render problem\n"); |
|
$r->print("<li />image tag for plot\n"); |
if(&Apache::loncoursedata::DownloadStudentCourseDataSeparate($students, |
$r->print("<li />plot key\n"); |
'true', |
$r->print('</ol>'); |
$cacheDB, |
$r->print("<pre>\nProblem choice = $symb $id\n</pre>\n"); |
'true', |
$r->print('<hr />'); |
'true', |
} |
$courseID, |
$r->print('<input type="hidden" name="analysisfirstcall" value="no" />'); |
$r, |
$r->print(&CreateInterface()); |
$c) ne 'OK') { |
if (! exists($ENV{'form.analysisfirstcall'})) { |
$r->print($Str); |
|
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 $uri = $cache{$problemId.':source'}; |
|
my $problem = $cache{$problemId.':problem'}; |
|
my $title = $cache{$problemId.':title'}; |
|
my $interval = $cache{'Interval'}; |
|
|
|
my %ConceptData; |
|
$ConceptData{"Interval"} = $interval; |
|
|
|
#Initialize the option response true answers |
|
my ($analyzeData) = &InitAnalysis($uri, $part, $responseId, $problem, |
|
$students->[0], $courseID); |
|
if(defined($analyzeData->{'error'})) { |
|
$Str .= $analyzeData->{'error'}.'<br>Incorrect part requested.<br>'; |
|
$r->print($Str); |
|
return; |
return; |
} |
} |
|
# Okay, they asked for data, so make sure we get the latest data. |
$r->print($Str); |
&Apache::lonnet::logthis('got here for some reason'); |
$Str = ''; |
# &Apache::lonstatistics::Gather_Full_Student_Data($r); |
if($c->aborted()) { untie(%cache); return; } |
$r->print(&OptionResponseProblemSelector()); |
|
|
#compute the intervals |
|
&Interval($part, $problem, $interval, $analyzeData->{'concepts'}, |
|
\%ConceptData); |
|
|
|
$title =~ s/\ /"_"/eg; |
|
$Str .= '<br><b>'.$uri.'</b>'; |
|
|
|
$r->print($Str); |
|
$Str = ''; |
|
if($c->aborted()) { untie(%cache); return; } |
|
|
|
#Java script Progress window |
|
for(my $index=0; $index<(scalar @$students); $index++) { |
|
if($c->aborted()) { untie(%cache); return; } |
|
&OpStatus($problemId, $students->[$index], \%ConceptData, |
|
$analyzeData->{'foil_to_concept'}, $analyzeData, \%cache); |
|
} |
|
|
|
$Str .= '<br>'; |
|
for (my $k=0; $k<$interval; $k++ ) { |
|
if($c->aborted()) { untie(%cache); return $Str; } |
|
$Str .= &DrawGraph($k, $title, $analyzeData->{'concepts'}, |
|
\%ConceptData); |
|
$r->print($Str); |
|
$Str = ''; |
|
} |
|
for (my $k=0; $k<$interval; $k++ ) { |
|
if($c->aborted()) { untie(%cache); return $Str; } |
|
$Str .= &DrawTable($k, $analyzeData->{'concepts'}, \%ConceptData); |
|
$r->print($Str); |
|
$Str = ''; |
|
} |
|
my $Answ=&Apache::lonnet::ssi($uri); |
|
$Str .= '<br><b>Here you can see the Problem:</b><br>'.$Answ; |
|
$Str .= '<form>'; |
|
$r->print($Str); |
|
|
|
untie(%cache); |
|
|
|
return; |
|
} |
} |
|
|
#---- Problem Analysis Web Page ---------------------------------------------- |
sub get_problem_symb { |
|
my $problemstring = shift(); |
sub IntervalOptions { |
my ($symb,$id) = ($problemstring=~ /^(.*):([^:]*)$/); |
my ($selectedInterval)=@_; |
return ($symb,$id); |
|
|
my $interval = 1; |
|
for(my $n=1; $n<=7; $n++) { |
|
if($selectedInterval == $n) { |
|
$interval = $n; |
|
} |
|
} |
|
|
|
my $Ptr = '<select name="Interval">'."\n"; |
|
for(my $n=1; $n<=7;$ n++) { |
|
$Ptr .= '<option'; |
|
if($interval == $n) { |
|
$Ptr .= ' selected'; |
|
} |
|
$Ptr .= '>'.$n."</option>"."\n"; |
|
} |
|
$Ptr .= '</select>'."\n"; |
|
|
|
return $Ptr; |
|
} |
} |
|
|
sub OptionResponseTable { |
sub CreateInterface { |
my ($optionResponses,$cache)=@_; |
|
|
|
my @optionResponses=split(':::', $optionResponses); |
|
my %partCount; |
|
my %sequences; |
|
foreach(@optionResponses) { |
|
my ($sequence, $problemId, $part, undef)=split(':',$_); |
|
$partCount{$problemId.':'.$part}++; |
|
if(!defined($sequences{$sequence})) { |
|
$sequences{$sequence} = $_; |
|
} else { |
|
$sequences{$sequence} .= ':::'.$_; |
|
} |
|
} |
|
|
|
my $Str = ''; |
my $Str = ''; |
|
$Str .= '<table cellspacing="5">'."\n"; |
foreach my $sequence (sort(keys(%sequences))) { |
$Str .= '<tr>'; |
my @optionProblems = split(':::', $sequences{$sequence}); |
$Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>'; |
|
$Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>'; |
$Str .= '<b>'.$cache->{$sequence.':title'}.'</b>'."\n"; |
$Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>'; |
$Str .= "<table border=2><tr><th> \# </th><th> Problem Title </th>"; |
$Str .= '</tr>'."\n"; |
$Str .= '<th> Resource </th><th> Analysis </th></tr>'."\n"; |
# |
|
$Str .= '<tr><td align="center">'."\n"; |
my $count = 1; |
$Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); |
foreach(@optionProblems) { |
$Str .= '</td><td align="center">'; |
my (undef, $problemId, $part, $response)= |
$Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5); |
split(':',$sequences{$sequence}); |
$Str .= '</td><td align="center">'; |
my $uri = $cache->{$problemId.':source'}; |
my $only_seq_with_assessments = sub { |
my $title = $cache->{$problemId.':title'}; |
my $s=shift; |
|
if ($s->{'num_assess'} < 1) { |
my $Temp = '<a href="'.$uri.'" target="_blank">'.$title.'</a>'; |
return 0; |
$Str .= '<tr>'; |
} else { |
$Str .= '<td> '.$count.' </td>'; |
return 1; |
$Str .= '<td bgcolor="#DDFFDD">'.$Temp.'</td>'; |
} |
$Str .= '<td bgcolor="#EEFFCC">'.$uri.'</td>'; |
}; |
if($partCount{$problemId.':'.$part} < 2) { |
$Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5, |
$Str .= '<td><input type="submit" name="Analyze:::'; |
$only_seq_with_assessments); |
$Str .= $problemId.':'.$part.'" value="'; |
$Str .= '</td></tr>'."\n"; |
$Str .= 'Part '.$part; |
$Str .= '</table>'."\n"; |
$Str .= '" /></td></tr>'."\n"; |
$Str .= '<input type="submit" name="ProblemAnalysis" value="'. |
} else { |
&mt('Analyze Problem').'" />'; |
my $value = $problemId.':'.$part.':'.$response; |
$Str .= ' 'x5; |
$Str .= '<td><input type="submit" name="Analyze:::'.$value; |
$Str .= '<input type="submit" name="ClearCache" value="'. |
$Str .= '" value="'; |
&mt('Clear Caches').'" />'; |
$Str .= 'Part '.$part.' Response '.$response; |
$Str .= ' 'x5; |
$Str .= '" /></td></tr>'."\n"; |
return ($Str); |
} |
} |
$count++; |
|
} |
sub OptionResponseProblemSelector { |
$Str .= '</table><br>'."\n"; |
my $Str; |
} |
$Str = "\n<table>\n"; |
|
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
return $Str; |
next if ($seq->{'num_assess'}<1); |
} |
my $seq_str = ''; |
|
foreach my $res (@{$seq->{'contents'}}) { |
#---- END Problem Analysis Web Page ------------------------------------------ |
# &Apache::lonnet::logthis('checking '.$res->{'title'}); |
|
# next if ($res->{'type'} ne 'assessment'); |
#---- Analyze Web Page ------------------------------------------------------- |
foreach my $part (@{$res->{'parts'}}) { |
|
my $partdata = $res->{'partdata'}->{$part}; |
#restore the student submissions and finding the result |
if (! exists($partdata->{'option'}) || |
sub OpStatus { |
$partdata->{'option'} == 0) { |
my ($problemID, $student, $ConceptData, $foil_to_concept, |
next; |
$analyzeData, $cache)=@_; |
} |
|
for (my $i=0;$i<scalar(@{$partdata->{'ResponseTypes'}});$i++){ |
my $ids = $analyzeData->{'parts'}; |
my $respid = $partdata->{'ResponseIds'}->[$i]; |
my @True = (); |
my $resptype = $partdata->{'ResponseTypes'}->[$i]; |
my @False = (); |
if ($resptype eq 'option') { |
my $flag=0; |
my $value = &Apache::lonnet::escape($res->{'symb'}.':'.$respid); |
|
my $checked = ''; |
my $tries=0; |
if ($ENV{'form.problemchoice'} eq $value) { |
|
$checked = 'checked '; |
foreach my $id (@$ids) { |
} |
my ($part, $response) = split(/\./, $id); |
$seq_str .= '<tr><td>'. |
my $time=$cache->{$student.':'.$problemID.':'.$part.':timestamp'}; |
'<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'. |
my @submissions = split(':::', $cache->{$student.':'.$problemID.':'. |
'</td><td>'. |
$part.':'.$response. |
'<a href="'.$res->{'src'}.'">'.$res->{'title'}.'</a> '; |
':submission'}); |
if ($partdata->{'option'} > 1) { |
foreach my $Resp (@submissions) { |
$seq_str .= &mt('response').' '.$respid; |
my %submission=&Apache::lonnet::str2hash($Resp); |
} |
foreach (keys(%submission)) { |
$seq_str .= "</td></tr>\n"; |
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); |
|
} |
} |
} |
} |
} |
} |
} |
} |
} |
if ($seq_str ne '') { |
|
$Str .= '<tr><td> </td><td><b>'.$seq->{'title'}.'</b></td>'. |
return; |
"</tr>\n".$seq_str; |
} |
|
|
|
sub DrawGraph { |
|
my ($k,$Src,$Concepts,$ConceptData)=@_; |
|
my $Max=0; |
|
my @data1; |
|
my @data2; |
|
|
|
# Adjust Data and find the Max |
|
for (my $n=0; $n<(scalar @$Concepts); $n++ ) { |
|
my $tmp=$Concepts->[$n]; |
|
$data1[$n]=$ConceptData->{$tmp.'.'.$k.'.true'}; |
|
$data2[$n]=$ConceptData->{$tmp.'.'.$k.'.false'}; |
|
my $Sum=$data1[$n]+$data2[$n]; |
|
if($Max < $Sum) { |
|
$Max=$Sum; |
|
} |
} |
} |
} |
for (my $n=0; $n<(scalar @$Concepts); $n++ ) { |
$Str .= "</table>\n"; |
if ($data1[$n]+$data2[$n]<$Max) { |
return $Str; |
$data2[$n]+=$Max-($data1[$n]+$data2[$n]); |
|
} |
|
} |
|
my $P_No = (scalar @data1); |
|
|
|
if($Max > 1) { |
|
$Max += (10 - $Max % 10); |
|
$Max = int($Max); |
|
} else { |
|
$Max = 1; |
|
} |
|
|
|
my $Titr=($ConceptData->{'Interval'}>1) ? $Src.'_interval_'.($k+1) : $Src; |
|
# $GData=$Titr.'&Concepts'.'&'.'Answers'.'&'.$Max.'&'.$P_No.'&'.$data1.'&'.$data2; |
|
my $GData = ''; |
|
$GData = $Titr.'&Concepts&Answers&'.$Max.'&'.$P_No.'&'; |
|
$GData .= (join(',',@data1)).'&'.(join(',',@data2)); |
|
|
|
return '<IMG src="/cgi-bin/graph.gif?'.$GData.'" border=1/>'; |
|
} |
} |
|
|
sub DrawTable { |
sub get_resource_from_symb { |
my ($k,$Concepts,$ConceptData)=@_; |
my ($symb) = @_; |
my $Max=0; |
&Apache::lonnet::logthis('target symb = :'.$symb.':'); |
my @data1; |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
my @data2; |
foreach my $res (@{$seq->{'contents'}}) { |
my $Correct=0; |
&Apache::lonnet::logthis('symb = :'.$res->{'symb'}.':'); |
my $Wrong=0; |
if ($res->{'symb'} eq $symb) { |
for(my $n=0; $n<(scalar @$Concepts); $n++ ) { |
return $res; |
my $tmp=$Concepts->[$n]; |
} |
$data1[$n]=$ConceptData->{$tmp.'.'.$k.'.true'}; |
|
$Correct+=$data1[$n]; |
|
$data2[$n]=$ConceptData->{$tmp.'.'.$k.'.false'}; |
|
$Wrong+=$data2[$n]; |
|
my $Sum=$data1[$n]+$data2[$n]; |
|
if($Max < $Sum) { |
|
$Max=$Sum; |
|
} |
} |
} |
} |
for(my $n=0; $n<(scalar @$Concepts); $n++ ) { |
return undef; |
if ($data1[$n]+$data2[$n]<$Max) { |
|
$data2[$n]+=$Max-($data1[$n]+$data2[$n]); |
|
} |
|
} |
|
my $P_No = (scalar @data1); |
|
my $Str = ''; |
|
# $Str .= '<br><b>From: ['.localtime($ConceptData->{'Int.'.($k-1)}); |
|
# $Str .= '] To: ['.localtime($ConceptData->{"Int.$k"}).']</b>'; |
|
$Str .= "\n".'<table border=2>'. |
|
"\n".'<tr>'. |
|
"\n".'<th> # </th>'. |
|
"\n".'<th> Concept </th>'. |
|
"\n".'<th> Correct </th>'. |
|
"\n".'<th> Wrong </th>'. |
|
"\n".'</tr>'; |
|
|
|
for(my $n=0; $n<(scalar @$Concepts); $n++ ) { |
|
$Str .= '<tr>'."\n"; |
|
$Str .= '<td>'.($n+1).'</td>'."\n"; |
|
my ($currentConcept) = split('::',$Concepts->[$n]); |
|
$Str .= '<td bgcolor="EEFFCC">'.$currentConcept; |
|
$Str .= '</td>'."\n"; |
|
$Str .= '<td bgcolor="DDFFDD">'.$data1[$n].'</td>'."\n"; |
|
$Str .= '<td bgcolor="FFDDDD">'.$data2[$n].'</td>'."\n"; |
|
$Str .= '</tr>'."\n"; |
|
} |
|
$Str .= '<td></td><td><b>From:['.localtime($ConceptData->{'Int.'.$k}); |
|
$Str .= '] To: ['.localtime($ConceptData->{'Int.'.($k+1)}-1); |
|
$Str .= ']</b></td><td>'.$Correct.'</td><td>'.$Wrong.'</td>'; |
|
$Str .= '</table>'."\n"; |
|
|
|
return $Str; |
|
#$Apache::lonxml::debug=1; |
|
#&Apache::lonhomework::showhash(%ConceptData); |
|
#$Apache::lonxml::debug=0; |
|
} |
} |
|
|
#---- END Analyze Web Page ---------------------------------------------- |
=pod |
|
|
sub Decide { |
sub InitAnalysis { |
#deciding the true or false answer belongs to each interval |
my ($resource,$sname,$sdom)=@_; |
my ($type,$concept,$time,$ConceptData)=@_; |
my $symb = $resource-> |
my $k=0; |
my $URI = $hash{'src_'.$rid}; |
while($time > $ConceptData->{'Int.'.($k+1)} && |
|
$k < $ConceptData->{'Interval'}) { |
|
$k++; |
|
} |
|
$ConceptData->{$concept.'.'.$k.'.'.$type}++; |
|
|
|
return; |
my $Answ=&Apache::lonnet::ssi($URI,('grade_target' => 'analyze', |
} |
'grade_username' => $sname, |
|
'grade_domain' => $sdom, |
|
'grade_courseid' => $cid, |
|
'grade_symb' => $symb)); |
|
# my $Answ=&Apache::lonnet::ssi($URI,('grade_target' => 'analyze')); |
|
|
sub InitAnalysis { |
(my $garbage,$Answ)=split(/_HASH_REF__/,$Answ,2); |
my ($uri,$part,$responseId,$problem,$student,$courseID)=@_; |
%Answer=(); |
my ($name,$domain)=split(/\:/,$student); |
%Answer=&Apache::lonnet::str2hash($Answ); |
|
|
my %analyzeData; |
my $parts=''; |
# Render the student's view of the problem. $Answ is the problem |
foreach my $elm (@{$Answer{"parts"}}) { |
# Stringafied |
$parts.="$elm,"; |
my $Answ=&Apache::lonnet::ssi($uri,('grade_target' => 'analyze', |
|
'grade_username' => $name, |
|
'grade_domain' => $domain, |
|
'grade_courseid' => $courseID, |
|
'grade_symb' => $problem)); |
|
my ($Answer)=&Apache::lonnet::str2hashref($Answ); |
|
|
|
my $found = 0; |
|
my @parts=(); |
|
if(defined($responseId)) { |
|
foreach (@{$Answer->{'parts'}}) { |
|
if($_ eq $part.'.'.$responseId) { |
|
push(@parts, $_); |
|
$found = 1; |
|
last; |
|
} |
|
} |
|
} else { |
|
foreach (@{$Answer->{'parts'}}) { |
|
if($_ =~ /$part/) { |
|
push(@parts, $_); |
|
$found = 1; |
|
last; |
|
} |
|
} |
|
} |
} |
|
chop($parts); |
if($found == 0) { |
my $conc=''; |
$analyzeData{'error'} = 'No parts matching selected values'; |
foreach my $elm (@{$Answer{"$parts.concepts"}}) { |
return \%analyzeData; |
$conc.="$elm@"; |
} |
} |
|
chop($conc); |
|
|
my @Concepts=(); |
@Concepts=split(/\@/,$conc); |
my %foil_to_concept; |
foreach my $concept (@{$Answer{"$parts.concepts"}}) { |
foreach my $currentPart (@parts) { |
foreach my $foil (@{$Answer{"$parts.concept.$concept"}}) { |
if(defined($Answer->{$currentPart.'.concepts'})) { |
$foil_to_concept{$foil} = $concept; |
foreach my $concept (@{$Answer->{$currentPart.'.concepts'}}) { |
#$ConceptData{$foil} = $Answer{"$parts.foil.value.$foil"}; |
push(@Concepts, $concept); |
|
foreach my $foil (@{$Answer->{$currentPart.'.concept.'. |
|
$concept}}) { |
|
$analyzeData{$currentPart.'.foil.value.'.$foil} = |
|
$Answer->{$currentPart.'.foil.value.'.$foil}; |
|
$foil_to_concept{$foil} = $concept; |
|
} |
|
} |
|
} else { |
|
foreach (keys(%$Answer)) { |
|
if(/$currentPart.foil\.value\.(.*)$/) { |
|
push(@Concepts, $1); |
|
$foil_to_concept{$1} = $1; |
|
$analyzeData{$currentPart.'.foil.value.'.$1} = |
|
$Answer->{$currentPart.'.foil.value.'.$1}; |
|
} |
|
} |
|
} |
} |
} |
} |
|
return $symb; |
$analyzeData{'parts'} = \@parts; |
|
$analyzeData{'concepts'} = \@Concepts; |
|
$analyzeData{'foil_to_concept'} = \%foil_to_concept; |
|
|
|
return \%analyzeData; |
|
} |
} |
|
|
sub Interval { |
=cut |
my ($part,$symb,$interval,$Concepts,$ConceptData)=@_; |
|
my $Int=$interval; |
|
my $due = &Apache::lonnet::EXT('resource.'.$part.'.duedate',$symb); |
|
my $opn = &Apache::lonnet::EXT('resource.'.$part.'.opendate',$symb); |
|
my $add=int(($due-$opn)/$Int); |
|
$ConceptData->{'Int.0'}=$opn; |
|
for(my $i=1; $i<$Int; $i++) { |
|
$ConceptData->{'Int.'.$i}=$opn+$i*$add; |
|
} |
|
$ConceptData->{'Int.'.$Int}=$due; |
|
for(my $i=0; $i<$Int; $i++) { |
|
for(my $n=0; $n<(scalar @$Concepts); $n++ ) { |
|
my $tmp=$Concepts->[$n]; |
|
$ConceptData->{$tmp.'.'.$i.'.true'}=0; |
|
$ConceptData->{$tmp.'.'.$i.'.false'}=0; |
|
} |
|
} |
|
} |
|
1; |
1; |
|
|
__END__ |
__END__ |