#TODO Define bmon and hmm scan commands in separate namespaces namespace eval scancommand { VarMake bmonscan_np Int User VarMake bmonscan_point Int User variable scanVariable scan_var scanVarStart 0 scanVarStep 1 proc scan_prepare {sobj uobj} { variable scanVarStart; variable scanVarStep; variable scanVariable; nxcreatefile nexus_hmscan.dic; nxclosefile; # stdscan prepare $sobj $uobj; set vlist [split [$sobj getvarpar 0] = ]; set scanVariable [string trim [lindex [split [lindex $vlist 0] . ] 1]]; set scanVarStart [lindex $vlist 1]; set scanVarStep [lindex $vlist 2]; ::histogram_memory::hs_prepare $sobj $uobj } proc hm_count {sobj uobj point mode preset} { variable scan_pt_start_time set scan_pt_start_time [sicstime] ::histogram_memory::hs_count_bm_controlled $sobj $uobj $point $mode $preset; } proc hm_scan_finish {sobj uobj} { ::histogram_memory::hs_finish $sobj $uobj; nxreopenfile; nxclosefile; } proc bm_scan_finish {sobj uobj} { # stdscan finish $sobj $uobj; nxreopenfile; nxclosefile; } #proc hm_scan_finish {sobj uobj} { # nxclosefile; #} # Add an nxentry for the current scan point proc write_nxentry {nxentryCmd point} { variable scanVarStart; variable scanVarStep; variable scanVariable; variable scan_pt_start_time; set scanVarPos [expr {$scanVarStart + $point * $scanVarStep} ]; nxreopenfile; $nxentryCmd nxscript scan_[format "%05d" $point] $scanVariable $scanVarPos $scanVarStep $scan_pt_start_time; nxclosefile; } proc bm_writepoint {sobj uobj pt} { write_nxentry bm_addnxscanentry $pt; } proc hm_writepoint {sobj uobj pt} { write_nxentry addnxscanentry $pt; } proc donothing {args} {} proc bmcount {sobj uobj pt mode preset} { variable scan_pt_start_time set scan_pt_start_time [sicstime] bmonscan_point $pt bm setmode $mode bm count $preset; } proc bm_scan_prepare {sobj uobj} { variable scanVarStart; variable scanVarStep; variable scanVariable; nxcreatefile nexus_bmonscan.dic; nxclosefile; set vlist [split [$sobj getvarpar 0] = ]; set scanVariable [string trim [lindex [split [lindex $vlist 0] . ] 1]]; set scanVarStart [lindex $vlist 1]; set scanVarStep [lindex $vlist 2]; #stdscan prepare $sobj $uobj; } proc init {} { #TODO HSET bmonscan_np IN SCAN FUNCTION bmonscan_np 1; bmonscan_point 0; } proc hpath_setup {parent} { hmake $parent/beam_monitor_scan spy none; hsetprop $parent/beam_monitor_scan type graphdata; hsetprop $parent/beam_monitor_scan viewer default; hsetprop $parent/beam_monitor_scan rank 1; hattach $parent/beam_monitor_scan bmonscan_np dim; hattach $parent/beam_monitor_scan bmonscan_point point; } } publish ::scancommand::write_nxentry user publish ::scancommand::hm_count user publish ::scancommand::scan_prepare user publish ::scancommand::hm_scan_finish user publish ::scancommand::hm_writepoint user publish ::scancommand::donothing user publish ::scancommand::bm_scan_prepare user publish ::scancommand::bm_scan_finish user publish ::scancommand::bm_writepoint user publish ::scancommand::bmcount user MakeScanCommand bmonscan bm $cfPath(scan)/scan_common_1.hdd recover.bin bmonscan configure script bmonscan function writeheader ::scancommand::donothing bmonscan function writepoint ::scancommand::bm_writepoint bmonscan function count ::scancommand::bmcount bmonscan function prepare ::scancommand::bm_scan_prepare bmonscan function finish ::scancommand::bm_scan_finish #scan2 function writeheader ::scancommand::donothing #scan2 function writepoint ::scancommand::nxaddpoint #scan2 function prepare ::scancommand::scan_prepare # Configure script mode, then we can configure all the scan callbacks. # The scan list command can be used to check that the callbacks # are properly defined. # A different count callback is defined in the two cases. # MakeScanCommand hmscan bm $cfPath(scan)/scan_common_1.hdd recover.bin hmscan configure script #hmscan function prepare hs_prepare MakeScanCommand scan2 bm $cfPath(scan)/scan_common_1.hdd recover.bin scan2 configure script # # That's all, folks... #hmscan function prepare hdbprepare #hmscan function collect hdbcollect hmscan function writeheader ::scancommand::donothing hmscan function writepoint ::scancommand::hm_writepoint hmscan function count ::scancommand::hm_count hmscan function prepare ::scancommand::scan_prepare hmscan function finish ::scancommand::hm_scan_finish # Wombat proc hdb_hmscan {scanvar scanstart scanincr scanend mode preset} { proc hdb_hmscan {scanvar scanstart scanincr np mode preset} { hmscan clear # hmscan configure script hmscan add $scanvar $scanstart $scanincr set status [catch {hmscan run $np $mode $preset} msg] hmscan configure soft if {$status == 0} { return $msg } else { error $msg } } publish hdb_hmscan user