--- capa/capa51/GUITools/capastats.tcl 1999/09/28 21:25:37 1.1 +++ capa/capa51/GUITools/capastats.tcl 1999/11/02 19:10:44 1.6 @@ -41,9 +41,11 @@ proc runCapaTools { classDirConfigFile } # $utilsMenu add command -label "Email" -command "" # $utilsMenu add command -label "View Score File" -command "" $utilsMenu add command -label "View Submissions" -command "CTsubmissions $num" + $utilsMenu add command -label "Create a Class Report" -command "CTcreateReport $num" $utilsMenu add command -label "Analyze Class Report" -command "CTanalyzeReport $num" $utilsMenu add command -label "Analyze Responses" -command "CTanalyzeScorer $num" $utilsMenu add command -label "Graph a Responses Analysis" -command "CTgraphAnalyzeScorer $num" + $utilsMenu add command -label "Discussion Stats" -command "CTdiscussStats $num" $utilsMenu add command -label "Quit" -command "CTquit $num" $utilsMenu post 0 0 Centre_Dialog $utilsMenu default @@ -299,7 +301,7 @@ proc CTitemAnalysisStart { num } { unset gCT(cmd.$cmdnum) return } - if { [set sets [getSetRange $gCT($num) $gFile($num)]] == "" } { + if { [set sets [getSetRange $gCT($num) [lindex $select 1]]] == "" } { unset gCT(cmd.$cmdnum) return } @@ -337,7 +339,7 @@ proc CTitemCorrelationStart { num } { unset gCT(cmd.$cmdnum) return } - if { [set setId [getOneSet $gCT($num) $gFile($num)]] == "" } { + if { [set setId [getOneSet $gCT($num) [lindex $select 1]]] == "" } { unset gCT(cmd.$cmdnum) return } @@ -370,6 +372,19 @@ proc CTsubmissions { num } { } ########################################################### +# CTcreateReport +########################################################### +########################################################### +########################################################### +proc CTcreateReport { num } { + global gUniqueNumber gCT gFile + + set cmdnum [incr gUniqueNumber] + set gCT(cmd.$cmdnum) createreport + CTcreateReportDialog $num $cmdnum +} + +########################################################### # CTanalyzeReport ########################################################### ########################################################### @@ -672,6 +687,24 @@ proc CTgraphAnalyzeScorer { num } { } ########################################################### +# CTdiscussStats +########################################################### +########################################################### +########################################################### +proc CTdiscussStats { num } { + global gCT gUniqueNumber gFile + set cmdnum [incr gUniqueNumber] + set gCT(cmd.$cmdnum) discussstats + set file [file join $gFile($num) discussion logs access.log] + displayStatus "Generating discussion Stats" both $cmdnum + CTdiscussForum $cmdnum $file $gFile($num) discussData 0 + CTputsDiscussResults $cmdnum discussData + CToutput $num $cmdnum + removeStatus $cmdnum + unset gCT(cmd.$cmdnum) +} + +########################################################### # CTquit ########################################################### ########################################################### @@ -903,27 +936,27 @@ proc CTlogAnalysis2 { num cmdnum setId } set logFile [file join $gFile($num) records "log$setId.db"] if { [file exists $logFile] } { CTputs $cmdnum "Log analysis for telnet session log$setId.db\n" - CTscanLogDB $cmdnum $logFile l(Y) l(N) l(S) l(U) l(u) + CTscanLogDB $cmdnum $logFile l(Y) l(N) l(S) l(U) l(u) l(A) l(F) } else { - set l(Y) [set l(N) [set l(S) [set l(U) [set l(u) 0]]]] + set l(Y) [set l(N) [set l(S) [set l(U) [set l(u) [set l(A) [set l(F) 0]]]]]] } set webLogFile [file join $gFile($num) records "weblog$setId.db" ] if { [file exists $webLogFile] } { CTputs $cmdnum "===============================================\n" CTputs $cmdnum "Log analysis for web session weblog$setId.db\n" - CTscanLogDB $cmdnum $webLogFile w(Y) w(N) w(S) w(U) w(u) + CTscanLogDB $cmdnum $webLogFile w(Y) w(N) w(S) w(U) w(u) w(A) w(F) } else { - set w(Y) [set w(N) [set w(S) [set w(U) [set w(u) 0]]]] + set w(Y) [set w(N) [set w(S) [set w(U) [set w(u) [set w(A) [set w(F) 0]]]]]] } - set telnet_total [expr $l(Y)+$l(N)+$l(S)+$l(U)+$l(u)] - set web_total [expr $w(Y)+$w(N)+$w(S)+$w(U)+$w(u)] + set telnet_total [expr $l(Y)+$l(N)+$l(S)+$l(U)+$l(u)+$l(A)+$l(F)] + set web_total [expr $w(Y)+$w(N)+$w(S)+$w(U)+$w(u)+$w(A)+$w(F)] CTputs $cmdnum "============== SUMMARY ====================\n" - CTputs $cmdnum " #Y #N #S #U #u Total\n" - CTputs $cmdnum [format "telnet: %6d %6d %6d %6d %6d %6d\n" \ - $l(Y) $l(N) $l(S) $l(U) $l(u) $telnet_total ] - CTputs $cmdnum [format " web: %6d %6d %6d %6d %6d %6d\n" \ - $w(Y) $w(N) $w(S) $w(U) $w(u) $web_total] - foreach v { Y N S U u } { + CTputs $cmdnum " #Y #N #S #U #u #A #F Total\n" + CTputs $cmdnum [format "telnet: %6d %6d %6d %6d %6d %6d %6d %6d\n" \ + $l(Y) $l(N) $l(S) $l(U) $l(u) $l(A) $l(F) $telnet_total ] + CTputs $cmdnum [format " web: %6d %6d %6d %6d %6d %6d %6d %6d\n" \ + $w(Y) $w(N) $w(S) $w(U) $w(u) $w(A) $w(F) $web_total] + foreach v { Y N S U u A F} { set sum($v) [expr $l($v) + $w($v)] if { $sum($v) > 0 } { set ratio($v) [expr 100.0*$w($v)/double($sum($v))] @@ -937,8 +970,8 @@ proc CTlogAnalysis2 { num cmdnum setId } } else { set ratio(web) 0.0 } - CTputs $cmdnum [format " %%web: % 6.1f % 6.1f % 6.1f % 6.1f % 6.1f % 6.1f\n" \ - $ratio(Y) $ratio(N) $ratio(S) $ratio(U) $ratio(u) $ratio(web) ] + CTputs $cmdnum [format " %%web: % 6.1f % 6.1f % 6.1f % 6.1f % 6.1f % 6.1f % 6.1f % 6.1f\n" \ + $ratio(Y) $ratio(N) $ratio(S) $ratio(U) $ratio(u) $ratio(A) $ratio(F) $ratio(web) ] } @@ -947,12 +980,14 @@ proc CTlogAnalysis2 { num cmdnum setId } ########################################################### ########################################################### ########################################################### -proc CTscanLogDB { num file Y_lVar N_lVar S_lVar U_lVar u_lVar } { +proc CTscanLogDB { num file Y_lVar N_lVar S_lVar U_lVar u_lVar A_lVar F_lVar } { upvar $Y_lVar Y_l upvar $N_lVar N_l upvar $S_lVar S_l upvar $U_lVar U_l upvar $u_lVar u_l + upvar $A_lVar A_l + upvar $F_lVar F_l set line_cnt 0 @@ -972,10 +1007,12 @@ proc CTscanLogDB { num file Y_lVar N_lVa if { ! [info exists count] } { for { set i 0 } { $i < [llength $ans_char] } { incr i } { set count(Y.$i) 0; set count(N.$i) 0; set count(S.$i) 0 - set count(U.$i) 0; set count(u.$i) 0 + set count(U.$i) 0; set count(u.$i) 0; set count(A.$i) 0 + set count(F.$i) 0 } set count(Y.total) 0; set count(N.total) 0; set count(S.total) 0 - set count(U.total) 0; set count(u.total) 0 + set count(U.total) 0; set count(u.total) 0; set count(A.total) 0 + set count(F.total) 0 } set i -1 foreach char $ans_char { @@ -983,7 +1020,8 @@ proc CTscanLogDB { num file Y_lVar N_lVa if { $char == "-" } { continue } if { [catch {incr count($char.$i)}] } { set count(Y.$i) 0; set count(N.$i) 0; set count(S.$i) 0 - set count(U.$i) 0; set count(u.$i) 0 + set count(U.$i) 0; set count(u.$i) 0; set count(A.$i) 0 + set count(F.$i) 0 incr count($char.$i) } incr count($char.total) @@ -992,19 +1030,23 @@ proc CTscanLogDB { num file Y_lVar N_lVa } close $fileId removeStatus $num - CTputs $num "Prob #: #Y #N #S #U #u\n" + CTputs $num "Prob #: #Y #N #S #U #u #A #F\n" for { set i 0 } { $i < [llength $ans_char] } { incr i } { - CTputs $num [format " %2d: %6d %6d %6d %6d %6d\n" [expr $i + 1] \ - $count(Y.$i) $count(N.$i) $count(S.$i) $count(U.$i) $count(u.$i) ] + CTputs $num [format " %2d: %6d %6d %6d %6d %6d %6d %6d\n" [expr $i + 1] \ + $count(Y.$i) $count(N.$i) $count(S.$i) $count(U.$i) $count(u.$i) \ + $count(A.$i) $count(F.$i) ] } CTputs $num "===========================================\n" - CTputs $num [format " Total: %6d %6d %6d %6d %6d\n" $count(Y.total) $count(N.total) \ - $count(S.total) $count(U.total) $count(u.total) ] + CTputs $num [format " Total: %6d %6d %6d %6d %6d %6d %6d\n" $count(Y.total) \ + $count(N.total) $count(S.total) $count(U.total) $count(u.total) \ + $count(A.total) $count(F.total) ] set Y_l $count(Y.total) set N_l $count(N.total) set S_l $count(S.total) set U_l $count(U.total) set u_l $count(u.total) + set A_l $count(A.total) + set F_l $count(F.total) return } @@ -1483,11 +1525,11 @@ proc CTitemCorrelation { num classpath s updateStatusBar [expr {$line_cnt/double($maxLine)}] $num } if { $line_cnt == 2 } { - set aline [string trim $aline] + set aline [string trimright $aline] set weights [split $aline {}] } if { $line_cnt > 3} { - set aline [string trim $aline] + set aline [string trimright $aline] set data [string range $aline 10 end] set ans_str [lindex [split $data ","] 0] set ans_char_list [split $ans_str {} ] @@ -1548,9 +1590,10 @@ proc CTitemCorrelation { num classpath s close $fileId removeStatus $num # print out the correlation matrix -# parray sum_x -# parray sum_y -# parray prod_xy + #parray sum_x + #parray sum_y + #parray prod_xy + #puts $question_cnt CTputs $num " " for { set ii 1 } { $ii < $question_cnt } { incr ii } { CTputs $num [format " %2d" [expr {$ii+1}] ] @@ -2180,11 +2223,11 @@ proc CTdrawBargraph { num } { if { [set color [lindex $datum 3]] == "" } {set color $gBarGraph($num.color)} if { $gBarGraph($num.bucketscores) && ($i % $howoften == $when) } { if { $i == $when } { - puts "$value-$which-$howoften" +# puts "$value-$which-$howoften" $canvas create rectangle $textwidth \ $y1 $x2 $y2 -fill $color -tag $tag } else { - puts "$value:$which:$howoften" +# puts "$value:$which:$howoften" $canvas create rectangle [expr {$eachwidth*($i-$howoften+1)+$textwidth}]\ $y1 $x2 $y2 -fill $color -tag $tag } @@ -2605,3 +2648,268 @@ proc CTcreateSubset { num cmdnum day set catch {unset answerArray} catch {unset exist} } + +########################################################### +# CTdiscussForum +########################################################### +########################################################### +########################################################### +proc CTdiscussForum { num file dir resultVar {specificSet 0}} { + global gCT + upvar $resultVar result + + if { $specificSet == 0 } { + set start 1 + } else { + set start $specificSet + } + set fileId [open $file r] + set maxLine [lindex [exec wc $file] 0] + set aline [gets $fileId] + set last 0 + set line_cnt 0 + while {![eof $fileId]} { + incr line_cnt + if { ($line_cnt%20) == 0 } { updateStatusBar [expr $line_cnt/double($maxLine)] $num } + foreach {stunum capaid name email action set prob date time} [split $aline "|"] {} + if {$specificSet && ($specificSet == $set)} {set aline [gets $fileId];continue} + if { $action == "ViewProblem" } { + if { [catch {incr count($set,$prob)}]} { + set count($set,$prob) 1 + if { $set > $last } { set last $set } + if { [catch {set max($set)}]} { set max($set) 0 } + if { $prob > $max($set)} { set max($set) $prob } + if { [catch {set posts($set,$prob) [llength [glob $dir/discussion/$set/[format "%06d" $prob]-*-*-*.msg]]}]} { set posts($set,$prob) 0 } + } + set ever($name) 1 + set names($set,$name) 1 + set nameprob($set,$prob,$name) 1 + } + set aline [gets $fileId] + } + + updateStatusMessage "Summarizing Data" $num + updateStatusBar 0 $num + for {set i 1} { $i <= $last } { incr i } { + updateStatusBar [expr $i/$last] $num + set total($i) 0 + for {set j 1} { $j <= $max($i) } { incr j } { + set message "" + if {[catch { set result($num.$i.$j.posts) $posts($i,$j) }]} { + set result($num.$i.$j.posts) 0 + } + if {[catch {set result($num.$i.$j.views) $count($i,$j)}]} { + set result($num.$i.$j.views) 0 + } + catch {incr total($i) $count($i,$j)} + if { [catch { set result($num.$i.$j.ratio) \ + [expr $result($num.$i.$j.views)/double($result($num.$i.$j.posts))]} error]} { + set result($num.$i.$j.ratio) 0.0 + } + set result($num.$i.$j.viewers) [llength [array names nameprob $i,$j,*]] + } + set result($num.$i.views) $total($i) + set result($num.$i.max) $max($i) + } + + for {set i 1} { $i<=$last } { incr i } { + set result($num.$i.viewers) [llength [array names names $i,*]] + } + close $fileId + set result($num.viewers) [llength [array names ever]] + set result($num.last) $last + #IDEAS: stick into capastats + # : howmany viws are repeats + # : Student Course Profile, add #ViewProblems #Posts + # : add some portion of these stats to analyze log files? +} + +########################################################### +# CTputsDiscussResults +########################################################### +########################################################### +proc CTputsDiscussResults { num resultsVar } { + upvar $resultsVar result + for {set i 1} { $i <= $result($num.last) } { incr i } { + CTputs $num "For Set $i #Visitors:$result($num.$i.viewers) did #views:$result($num.$i.views)\n" + CTputs $num "Prob# #Posts #Views Ratio #UniqueStu\n" + CTputs $num "------------------------------------\n" + for {set j 1} { $j <= $result($num.$i.max)} { incr j } { + CTputs $num [format "%5d %6d %6d %5s %6d\n" $j \ + $result($num.$i.$j.posts) $result($num.$i.$j.views) \ + [if {$result($num.$i.$j.ratio) == 0.0} {set temp " "} \ + {format %.1f $result($num.$i.$j.ratio)}] \ + $result($num.$i.$j.viewers)] + } + } + CTputs $num "Overall Unique #viewers: $result($num.viewers)\n" +} + +########################################################### +# CTcreateReportDialog +########################################################### +########################################################### +########################################################### +proc CTcreateReportDialog { num cmdnum } { + global gCT gFile + + + set gCT(summary.section.$cmdnum) 1 + set gCT(summary.set.$cmdnum) 1 + + set summary [toplevel $gCT($num).summary] + set whoFrame [frame $summary.whoFrame -borderwidth 4 -relief groove] + set whichFrame [frame $summary.whichFrame -borderwidth 4 -relief groove] + set sortFrame [frame $summary.sortFrame] + set file2Frame [frame $summary.file2Frame] + set buttonFrame [frame $summary.buttonFrame] + pack $whoFrame $whichFrame $sortFrame $file2Frame $buttonFrame -side top + pack configure $whoFrame $whichFrame -padx 10 -pady 10 + + set sectionFrame [frame $whoFrame.section] + set allFrame [frame $whoFrame.all] + pack $sectionFrame $allFrame -side top + + set gCT(summary.who.$cmdnum) section + + radiobutton $sectionFrame.section -text \ + "For students in default section:" -variable gCT(summary.who.$cmdnum) \ + -value section + entry $sectionFrame.entry -textvariable gCT(summary.section.$cmdnum) -width 3 + pack $sectionFrame.section $sectionFrame.entry -side left + + radiobutton $allFrame.all -text "For all students in the class" \ + -variable gCT(summary.who.$cmdnum) -value all + pack $allFrame.all + + set sectionFrame [frame $whichFrame.section] + set allFrame [frame $whichFrame.all] + pack $sectionFrame $allFrame -side top + + set gCT(summary.which.$cmdnum) specific + + radiobutton $sectionFrame.section -text "For set:" \ + -variable gCT(summary.which.$cmdnum) -value specific + entry $sectionFrame.entry -textvariable gCT(summary.set.$cmdnum) -width 3 + pack $sectionFrame.section $sectionFrame.entry -side left + + radiobutton $allFrame.all -text "For all sets up to:" -variable \ + gCT(summary.which.$cmdnum) -value upto + entry $allFrame.entry -textvariable gCT(summary.set.$cmdnum) -width 3 + pack $allFrame.all $allFrame.entry -side left + + set firstFrame [frame $sortFrame.firstFrame -borderwidth 4 -relief groove] + set secondFrame [frame $sortFrame.secondFrame -borderwidth 4 \ + -relief groove] + pack $firstFrame $secondFrame -side left + + set gCT(summary.first.$cmdnum) name + + label $firstFrame.label -text "Sorting Order - Primary" + radiobutton $firstFrame.name -text "Student Name" -variable \ + gCT(summary.first.$cmdnum) -value name + radiobutton $firstFrame.number -text "Student Number" -variable \ + gCT(summary.first.$cmdnum) -value number + radiobutton $firstFrame.section -text "Section" -variable \ + gCT(summary.first.$cmdnum) -value section + radiobutton $firstFrame.grade -text "Grade" -variable gCT(summary.first.$cmdnum) \ + -value grade + pack $firstFrame.label $firstFrame.name $firstFrame.number \ + $firstFrame.section $firstFrame.grade -side top -anchor w + + set gCT(summary.second.$cmdnum) number + + label $secondFrame.label -text "Sorting Order - Secondary" + radiobutton $secondFrame.name -text "Student Name" -variable \ + gCT(summary.second.$cmdnum) -value name + radiobutton $secondFrame.number -text "Student Number" -variable \ + gCT(summary.second.$cmdnum) -value number + radiobutton $secondFrame.section -text "Section" -variable \ + gCT(summary.second.$cmdnum) -value section + radiobutton $secondFrame.grade -text "Grade" -variable gCT(summary.second.$cmdnum) \ + -value grade + pack $secondFrame.label $secondFrame.name $secondFrame.number \ + $secondFrame.section $secondFrame.grade -side top -anchor w + + set defaultFrame [frame $file2Frame.defaultFrame] + set fileFrame [frame $file2Frame.fileFrame] + pack $defaultFrame $fileFrame -side top + + set gCT(summary.filename.$cmdnum) default + + radiobutton $defaultFrame.default -text "Grader Chooses File Name" \ + -variable gCT(summary.filename.$cmdnum) -value default + pack $defaultFrame.default + + radiobutton $fileFrame.label -text "Specified Output File:" \ + -variable gCT(summary.filename.$cmdnum) -value specified + set entryFrame [frame $fileFrame.entryFrame] + button $fileFrame.select -text "Select File" \ + -command "selectOutputFile" + pack $fileFrame.label $entryFrame $fileFrame.select -side left + entry $entryFrame.entry -textvariable gCT(summary.file.$cmdnum) \ + -xscrollcommand "$entryFrame.scroll set" + scrollbar $entryFrame.scroll -orient h -command \ + "$entryFrame.entry xview" + pack $entryFrame.entry $entryFrame.scroll + pack configure $entryFrame.scroll -fill x + + button $buttonFrame.create -text "Create" -command \ + "removeWindowEntry Summary + destroy $summary + CTcreateSummaryReport $num $cmdnum" + button $buttonFrame.cancel -text "Cancel" -command \ + "removeWindowEntry Summary + destroy $summary" + pack $buttonFrame.create $buttonFrame.cancel -side left + + Centre_Dialog $summary default +} + +########################################################### +# CTcreateSummaryReport +########################################################### +########################################################### +########################################################### +proc CTcreateSummaryReport { num cmdnum } { + global gCT gFile + + displayStatus "Opening File" both $cmdnum + + switch $gCT(summary.who.$cmdnum) { + all { + set file ClassSet$gCT(summary.set.$cmdnum).rpt + } + section { + set file Sec$gCT(summary.section.$cmdnum)Set$gCT(summary.set.$cmdnum).rpt + } + default { + displayError "An error has occured while creating a summary \ + report $gCT(summary.section.$cmdnum)" + return + } + } + + if { $gCT(summary.filename.$cmdnum) == "specified" } { + set file $gCT(summary.file.$cmdnum) + } + if { $file == "" } { + removeStatus + displayError "Must specify a valid filename" + return + } + updateStatusMessage "Creating Summary" $cmdnum + + set cwd [pwd] + cd $gFile($num) + set error [ catch {CTcreateSummary $file $cmdnum} ] + cd $cwd + + removeStatus $cmdnum + + if {!$error && "Yes" == [makeSure "Created summary file $file, would you like to see it?"]} { + set fileId [open [file join $gFile($num) $file] r] + CTputs $cmdnum [read $fileId] + CToutput $num $cmdnum + } +} \ No newline at end of file 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.