Files
sics/site_ansto/instrument/config/scan/scan_common_1.tcl
Ferdi Franceschini d49a7be3bb Create single entry nexus files for scans with instrument state in 1D arrays indexed by scan point.
Use putslab and sics data objects to grow arrays.

r1725 | ffr | 2007-03-27 08:04:19 +1000 (Tue, 27 Mar 2007) | 3 lines
2012-11-15 13:10:24 +11:00

336 lines
11 KiB
Tcl

#TODO Define bmon and hmm scan commands in separate namespaces
MakeScanCommand hmscan bm $cfPath(scan)/scan_common_1.hdd recover.bin
MakeScanCommand bmonscan bm $cfPath(scan)/scan_common_1.hdd recover.bin
MakeScanCommand scan2 bm $cfPath(scan)/scan_common_1.hdd recover.bin
namespace eval scancommand {
# List of counts
variable bmoncounts_array
variable bmoncounts_axis
variable bmonscanvar_axis_hpath
# hpath to values from bmoncounts_array
# we use this to get auto-notification on update of bmonscancounts_array_hpath
variable bmonscancounts_array_hpath
# bmonscan setup parameters and feedback variables.
VarMake bmonscan_var_name Text User
VarMake bmonscan_var_value Float User
VarMake bmonscan_var_start Float User
VarMake bmonscan_var_step Float User
VarMake bmonscan_mode Text User
VarMake bmonscan_preset Float User
VarMake bmonscan_np_target Int User
VarMake bmonscan_point_current Int User
VarMake bmonscan_counts Int User
VarMake bmonscan_numchannels Int User
VarMake bmonscan_channel Int User
# bmonscan graphdata variables.
VarMake bmonscan_np_graphics_target Int User
VarMake bmonscan_point_graphics_current Int User
VarMake bmonscan_var_graphics_value Float User
VarMake hmscan_var_name Text User
VarMake hmscan_var_value Float User
VarMake hmscan_var_start Float User
VarMake hmscan_var_step Float User
VarMake hmscan_mode Text User
VarMake hmscan_preset Float User
VarMake hmscan_np_target Int User
VarMake hmscan_point_current Int User
VarMake hmscan_numchannels Int User
VarMake hmscan_channel Int User
variable scanVariable scan_var scanVarStart 0 scanVarStep 1
proc scan_collect {sobj uobj point} {
}
proc hmm_scan_prepare {sobj uobj} {
variable scanVarStart;
variable scanVarStep;
variable scanVariable;
nxcreatefile nexus_hmscan.dic;
nxclosefile;
# stdscan prepare $sobj $uobj;
hmscan_np_target [SplitReply [$sobj np]]
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];
hmscan_var_name $scanVariable
hmscan_var_start $scanVarStart
hmscan_var_step $scanVarStep
::histogram_memory::prepare
}
proc hmm_count {sobj uobj point mode preset} {
variable scan_pt_start_time
set scan_pt_start_time [sicstime]
hmscan_point_current $point;
hmscan_mode $mode;
hmscan_preset $preset;
set scanvar [SplitReply [hmscan_var_name]]
hmscan_var_value [SplitReply [$scanvar]]
::histogram_memory::count_bm_controlled $mode $preset;
}
proc hmm_scan_finish {sobj uobj} {
::histogram_memory::finish;
nxreopenfile;
nxclosefile;
}
proc bm_scan_finish {sobj uobj} {
# stdscan finish $sobj $uobj;
nxreopenfile;
nxclosefile;
}
#proc hmm_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;
$nxentryCmd nxscript entry1 $point $scanVariable $scanVarPos $scanVarStep $scan_pt_start_time;
nxclosefile;
}
proc bm_writepoint {sobj uobj pt} {
variable bmoncounts_array
set bmoncounts_array [string map {\{ "" \} ""} [SplitReply [bmonscan getcounts]]];
write_nxentry bm_addnxscanentry $pt;
bmonscan_counts [SplitReply [bm getcounts]]
bmonscan_np_graphics_target [SplitReply [bmonscan_np_target]]
bmonscan_point_graphics_current [SplitReply [bmonscan_point_current]]
bmonscan_var_graphics_value [SplitReply [bmonscan_var_value]]
}
#TODO Feedback for Histogram memory scan
proc hmm_writepoint {sobj uobj pt} {
write_nxentry hmm_addnxscanentry $pt;
}
proc donothing {args} {}
proc bm_count {sobj uobj point mode preset} {
variable scan_pt_start_time
set scan_pt_start_time [sicstime]
bmonscan_point_current $point
bmonscan_mode $mode;
bmonscan_preset $preset;
set scanvar [SplitReply [bmonscan_var_name]]
bmonscan_var_value [SplitReply [$scanvar]]
bm setmode $mode
bm count $preset;
}
proc bm_scan_prepare {sobj uobj} {
variable scanVarStart;
variable scanVarStep;
variable scanVariable;
variable bmoncounts_array;
variable bmoncounts_axis;
set bmoncounts_array [list]
#TODO Parameterise varindex in some way
set varindex 0;
nxcreatefile nexus_bmonscan.dic;
nxclosefile;
bmonscan_np_target [SplitReply [$sobj np]];
set vlist [split [$sobj getvarpar $varindex] = ];
set scanVariable [string trim [lindex [split [lindex $vlist 0] . ] 1]];
set scanVarStart [lindex $vlist 1];
set scanVarStep [lindex $vlist 2];
set scanvar_pts [SplitReply [$sobj getvardata $varindex]]
set bmoncounts_axis [string map {\{ "" \} ""} $scanvar_pts]
bmonscan_var_name $scanVariable
bmonscan_var_start $scanVarStart
bmonscan_var_step $scanVarStep
#stdscan prepare $sobj $uobj;
}
proc init {} {
variable bmoncounts_array;
variable bmoncounts_axis;
bmonscan_numchannels [SplitReply [bmonscan getnumchan]];
bmonscan_channel 0;
bmonscan_np_target 0;
bmonscan_point_current 0;
hmscan_numchannels [SplitReply [hmscan getnumchan]];
hmscan_channel 0;
hmscan_np_target 0;
hmscan_point_current 0;
set bmoncounts_array [list];
set bmoncounts_axis [list];
}
proc commands_hpath_setup {parent} {
set feedbackPath $parent/bmonscan/feedback
hcommand $parent/bmonscan hdb_bmonscan
hsetprop $parent/bmonscan type command
hsetprop $parent/bmonscan priv user
hattach $parent/bmonscan bmonscan_var_name scan_variable
hsetprop $parent/bmonscan/scan_variable argtype drivable
hattach $parent/bmonscan bmonscan_var_start scan_start
hsetprop $parent/bmonscan/scan_start argtype float
hattach $parent/bmonscan bmonscan_var_step scan_increment
hsetprop $parent/bmonscan/scan_increment argtype float
hattach $parent/bmonscan/ bmonscan_np_target NP
hsetprop $parent/bmonscan/NP argtype int
hmake $parent/bmonscan/mode user text
hsetprop $parent/bmonscan/mode argtype text
hsetprop $parent/bmonscan/mode values monitor,timer
hmake $parent/bmonscan/preset user float
hsetprop $parent/bmonscan/preset argtype float
hattach $parent/bmonscan/ bmonscan_channel channel
hsetprop $parent/bmonscan/channel argtype int
hsetprop $parent/bmonscan/channel min 0
hsetprop $parent/bmonscan/channel max [SplitReply [bmonscan getnumchan]]
# Optional feedback node
hmake $feedbackPath spy none
hattach $feedbackPath dataFileName filename
hattach $feedbackPath bmonscan_mode mode
hattach $feedbackPath bmonscan_preset preset
hmake $feedbackPath/scan_variable spy none
hattach $feedbackPath/scan_variable bmonscan_var_value value
hmake $feedbackPath/NP spy none
hattach $feedbackPath/NP bmonscan_point_current current
hattach $feedbackPath bmonscan_counts counts;
foreach fbNode [hlist $feedbackPath] {
hsetprop $feedbackPath/$fbNode privilege READ_ONLY;
}
#TODO Histogram memory scan command
}
proc graphics_hpath_setup {parent} {
variable bmonscanvar_axis_hpath
variable bmonscancounts_array_hpath
variable bmoncounts_array
variable bmoncounts_axis
set bmonscanvar_axis_hpath $parent/beam_monitor_scan/axis
set bmonscancounts_array_hpath $parent/beam_monitor_scan/data
set defdim 100
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_graphics_target dim;
hattach $parent/beam_monitor_scan bmonscan_point_graphics_current point;
hattach $parent/beam_monitor_scan bmonscan_var_graphics_value lastaxis
hattach $parent/beam_monitor_scan bmonscan_counts lastdata
hmakescript $bmonscanvar_axis_hpath "set ::scancommand::bmoncounts_axis" hdbReadOnly floatvarar $defdim
hsetprop $bmonscanvar_axis_hpath type axis
sicspoll del $bmonscanvar_axis_hpath
hmakescript $bmonscancounts_array_hpath "set ::scancommand::bmoncounts_array" hdbReadOnly floatvarar $defdim
hsetprop $bmonscancounts_array_hpath type data
sicspoll del $bmonscancounts_array_hpath
#TODO histogram_memory_scan
# hmake $parent/histogram_memory_scan spy none;
# hsetprop $parent/histogram_memory_scan type graphdata;
# hsetprop $parent/histogram_memory_scan viewer default;
# hsetprop $parent/histogram_memory_scan rank 2;
# hattach $parent/histogram_memory_scan hmscan_np_target dim0;
# hattach $parent/histogram_memory_scan hmscan_np_target dim1;
# hattach $parent/histogram_memory_scan hmscan_point_current point;
}
}
publish ::scancommand::scan_collect user
publish ::scancommand::write_nxentry user
publish ::scancommand::hmm_count user
publish ::scancommand::hmm_scan_prepare user
publish ::scancommand::hmm_scan_finish user
publish ::scancommand::hmm_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::bm_count user
bmonscan configure script
bmonscan function writeheader ::scancommand::donothing
bmonscan function writepoint ::scancommand::bm_writepoint
bmonscan function count ::scancommand::bm_count
#bmonscan function collect ::scancommand::scan_collect
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::hmm_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.
#
scan2 configure script
#scan2 function prepare ::histogram_memory::prepare
scan2 function count ::histogram_memory::hs_count_hs_controlled
#scan2 function collect ::histogram_memory::hs_collect
scan2 function finish ::histogram_memory::hs_finish
#
# That's all, folks...
hmscan configure script
#hmscan function prepare hdbprepare
#hmscan function collect hdbcollect
hmscan function writeheader ::scancommand::donothing
hmscan function writepoint ::scancommand::hmm_writepoint
hmscan function count ::scancommand::hmm_count
#hmscan function collect ::scancommand::scan_collect
bmonscan function prepare ::scancommand::bm_scan_prepare
hmscan function prepare ::scancommand::hmm_scan_prepare
hmscan function finish ::scancommand::hmm_scan_finish
# Wombat proc hdb_hmscan {scanvar scanstart scanincr scanend mode preset} {
proc hdb_bmonscan {scanvar scanstart scanincr np mode preset channel} {
bmonscan clear
# bmonscan configure script
bmonscan add $scanvar $scanstart $scanincr
bmonscan setchannel $channel;
set status [catch {bmonscan run $np $mode $preset} msg]
# bmonscan configure soft
if {$status == 0} {
return $msg
} else {
clientput "hdb_bmonscan ERROR: $msg"
error $msg
}
}
publish hdb_bmonscan user