server_init now calls ::counter::isc_initialize, ::histogram_memory::isc_initialize and ::scan::isc_initialize scan.c SICS-158 Restrict bmonscan and hmscan to only one scan variable count_common.tcl Create a mulicounter which uses the available monitors as channels. The multicounter is used in bmonscans hipadaba_configuration_common.tcl Use _link as the suffix for the nxvgroup name when making nexus file links. hmm_configuration_common.tcl SICS-190 Create hdb entries for bm_counts, bm_event_rate, bm_status SICS-164 Allow running histmem in simulated mode. hmm_cylindrical_detector_configuration.tcl Only refer to detector SICSVariables when necessary, otherwise we get dependency problems. nxscripts_common_1.tcl Separate histmem_filtype_spec from bmon_filetype_spec so that we can use the histem_filetyp_spec names to restrict the histmem scan filetypes. Close the data file on error in proc ::nexus::save Allow int and text types when saving macro data scan_common_1.tcl SICS-173 Allow users to force a scan when the instrument isn't ready Added ic_initialize proc so we can make dependencies explicit in the init_server proc SICS-186 Allow monitor modes for histmem scans Allow selection of histmem file policies from runscan command echidna, wombat, kowari, quokka and platypus component and server configurations Added instrument specific configuration initialisation functions in the component configuration files. Add a catch block to the top-level instrument server configuration file and printout the errorContext and callStack r2641 | ffr | 2008-07-01 17:02:26 +1000 (Tue, 01 Jul 2008) | 34 lines
375 lines
11 KiB
Tcl
375 lines
11 KiB
Tcl
##
|
|
# @brief We can't change the coordinate scheme at runtime because this would require
|
|
# restructuring the hdb tree, but we should save it.
|
|
foreach {var lname nxname} {
|
|
VelSelCoordScheme VelSelCoordScheme coordinate_scheme
|
|
SApCoordScheme SApCoordScheme coordinate_scheme
|
|
EApCoordScheme EApCoordScheme coordinate_scheme
|
|
SampleCoordScheme SampleCoordScheme coordinate_scheme
|
|
DetCoordScheme DetCoordScheme coordinate_scheme
|
|
BeamstopCoordScheme BeamstopCoordScheme coordinate_scheme
|
|
CollCoordScheme CollCoordScheme coordinate_scheme
|
|
} {
|
|
::utility::mkVar $var text readonly $lname true @none false true
|
|
$var Cartesian
|
|
$var lock
|
|
}
|
|
|
|
##
|
|
# @brief User privilege text variables
|
|
#
|
|
# TODO SICS-117 Redo as get/set macros like the "kind=command" macros but kind=getset and it is saveable
|
|
# The set parameter will have a domain. If the param is readonly then the hdb privilege is readonly
|
|
# Pros, GumTree will know the data type of the parameter (text params will have a list of valid values).
|
|
# Cons, There is no "instant" feedback, macros are polled on the hdb tree.
|
|
foreach {var lname nxname priv klass} {
|
|
SApShape SApShape shape user parameter
|
|
BSShape BSShape shape user parameter
|
|
} {
|
|
::utility::mkVar $var text $priv $lname true $klass true true
|
|
}
|
|
|
|
# The velocity selector position is used as the reference for other instrument
|
|
# component positions. For simplicity we set it as the origin x=y=z=0.
|
|
foreach {var lname nxname units klass} {
|
|
VelSelPosXmm VelSelPosXmm x mm @none
|
|
VelSelPosYmm VelSelPosYmm y mm @none
|
|
VelSelPosZmm VelSelPosZmm z mm @none
|
|
EndFacePosYmm EndFacePosYmm y mm parameter
|
|
RotApPosYmm RotApPosYmm y mm @none
|
|
} {
|
|
::utility::mkVar $var float readonly $lname true $klass true true
|
|
if {$units != 1} {
|
|
sicslist setatt $var units $units
|
|
}
|
|
}
|
|
|
|
::utility::mkVar SampleNum int readonly changer_position true parameter true true
|
|
|
|
# Parameter SicsVariables
|
|
foreach {var lname nxname units priv } {
|
|
LambdaA LambdaA wavelength nm user
|
|
LambdaResFWHM% LambdaResFWHM% wavelength_spread 1 user
|
|
VSdeg VSdeg twist degrees user
|
|
VSrpm VSrpm rotation_speed rpm user
|
|
EApYmm EApYmm y mm user
|
|
EApPosYmm EApPosYmm y mm user
|
|
SApXmm SApXmm x mm user
|
|
SApZmm SApZmm z mm user
|
|
SApPosXmm SApPosXmm x mm user
|
|
SApPosYmm SApPosYmm y mm user
|
|
SApPosZmm SApPosZmm z mm user
|
|
SamplePosXmm SamplePosXmm x mm user
|
|
SamplePosYmm SamplePosYmm y mm user
|
|
SamplePosZmm SamplePosZmm z mm user
|
|
DetPosYOffsetmm DetPosYOffsetmm detposyoffset mm user
|
|
BSXmm BSXmm x mm user
|
|
BSZmm BSZmm z mm user
|
|
} {
|
|
::utility::mkVar $var float $priv $lname true parameter true true
|
|
if {$units != 1} {
|
|
sicslist setatt $var units $units
|
|
}
|
|
}
|
|
|
|
# Derived Parameter SicsVariables
|
|
foreach {var type lname units depends} {
|
|
AttFactor float AttFactor 1 AttRotDeg,LambdaA,LambdaResFWHM%
|
|
PleXmm float PleXmm mm AttRotDeg
|
|
EApXmm float EApXmm mm RotApDeg
|
|
EApZmm float EApZmm mm RotApDeg
|
|
RotApXmm float RotApXmm mm RotApDeg
|
|
RotApZmm float RotApZmm mm RotApDeg
|
|
EApShape text EApShape 1 RotApDeg
|
|
RotApShape text RotApShape 1 RotApDeg
|
|
} {
|
|
::utility::mkVar $var $type user $lname true derived_parameter true true
|
|
sicslist setatt $var depends $depends
|
|
if {$units != 1} {
|
|
sicslist setatt $var units $units
|
|
}
|
|
}
|
|
proc sicsmsgfmt {args} {return "[info level -1] = $args"}
|
|
::utility::macro::getset float L1mm {} {
|
|
set efpy [SplitReply [EndFacePosYmm]]
|
|
set sapy [SplitReply [SApPosYmm]]
|
|
set eapy [SplitReply [EApPosYmm]]
|
|
return [sicsmsgfmt [expr {$efpy + $sapy - $eapy}]]
|
|
}
|
|
sicslist setatt L1mm long_name L1mm
|
|
sicslist setatt L1mm klass derived_parameter
|
|
sicslist setatt L1mm units mm
|
|
sicslist setatt L1mm depends EndFacePosYmm,SApPosYmm,EApPosYmm
|
|
|
|
::utility::macro::getset float L2mm {} {
|
|
set detpy [SplitReply [DetPosYmm]]
|
|
set detpyos [SplitReply [DetPosYOffsetmm]]
|
|
set sapy [SplitReply [SamplePosYmm]]
|
|
return [sicsmsgfmt [expr {$detpyos + $detpyos - $sapy}]]
|
|
}
|
|
sicslist setatt L2mm long_name L2mm
|
|
sicslist setatt L2mm klass derived_parameter
|
|
sicslist setatt L2mm units mm
|
|
sicslist setatt L2mm depends DetPosYmm,DetPosYOffsetmm,SamplePosYmm
|
|
|
|
# Derive motor parameters
|
|
foreach {pname motor units} {
|
|
DetPosXmm detoff mm
|
|
DetPosYmm det mm
|
|
BSPosXmm bsx mm
|
|
BSPosZmm bsz mm
|
|
SampleTiltXDeg samphi degrees
|
|
SampleTiltYDeg samchi degrees
|
|
SampleRotDeg samthet degrees
|
|
} {
|
|
::utility::macro::getset float $pname {} [subst -nocommands {
|
|
return [sicsmsgfmt [SplitReply [$motor]]]
|
|
}]
|
|
sicslist setatt $pname units $units
|
|
sicslist setatt $pname long_name $pname
|
|
sicslist setatt $pname klass derived_parameter
|
|
# sicslist setatt $pname depends $motor
|
|
}
|
|
|
|
foreach {pname motor units} {
|
|
AttRotDeg att degrees
|
|
} {
|
|
::utility::macro::getset float $pname {args} [subst -nocommands {
|
|
# TODO AttFactor
|
|
if {[set args] == ""} {
|
|
return [sicsmsgfmt [SplitReply [$motor]]]
|
|
} else {
|
|
set target [lindex [set args] 0]
|
|
Plexmm -1
|
|
drive $motor \$target
|
|
set motpos [SplitReply [$motor]]
|
|
set tolerance [SplitReply [$motor precision] ]
|
|
if {[expr abs(\$motpos - \$target)] > \$tolerance} {
|
|
error "ERROR: failed to set $pname target \$target"
|
|
} else {
|
|
Plexmm [::optics::AttRotLookup \$target]
|
|
}
|
|
}
|
|
}]
|
|
sicslist setatt $pname units $units
|
|
sicslist setatt $pname long_name $pname
|
|
sicslist setatt $pname klass derived_parameter
|
|
# sicslist setatt $pname depends $motor
|
|
}
|
|
|
|
foreach {pname motor units} {
|
|
RotApDeg srce degrees
|
|
} {
|
|
::utility::macro::getset float $pname {args} [subst -nocommands {
|
|
if {[set args] == ""} {
|
|
return [sicsmsgfmt [SplitReply [$motor]]]
|
|
} else {
|
|
set target [lindex [set args] 0]
|
|
RotApXmm 0
|
|
RotApZmm 0
|
|
RotApShape "UNKNOWN"
|
|
EApXmm 0
|
|
EApZmm 0
|
|
EApShape "UNKNOWN"
|
|
drive $motor \$target
|
|
set motpos [SplitReply [$motor]]
|
|
set tolerance [SplitReply [$motor precision] ]
|
|
if {[expr abs(\$motpos - \$target)] > \$tolerance} {
|
|
error "ERROR: failed to set $pname target \$target"
|
|
} else {
|
|
set size [::optics::EApLookUp \$target "size"]
|
|
set shape [::optics::EApLookUp \$target "shape"]
|
|
RotApXmm \$size
|
|
RotApZmm \$size
|
|
RotApShape \$shape
|
|
EApXmm \$size
|
|
EApZmm \$size
|
|
EApShape \$shape
|
|
}
|
|
}
|
|
}]
|
|
sicslist setatt $pname units $units
|
|
sicslist setatt $pname long_name $pname
|
|
sicslist setatt $pname klass derived_parameter
|
|
# sicslist setatt $pname depends $motor
|
|
}
|
|
################################################################################
|
|
##
|
|
# @brief This is the position of the velocity selector bunker face. It is used
|
|
# as the reference for other positions. x=y=z=0.
|
|
::hdb::MakeVelocity_Selector velocity_selector {
|
|
wavelength LambdaA
|
|
wavelength_spread LambdaResFWHM%
|
|
coordinate_scheme VelSelCoordScheme
|
|
position {VelSelPosXmm VelSelPosYmm VelSelPosZmm}
|
|
}
|
|
|
|
::hdb::MakeAperture sample_aperture {
|
|
shape SApShape
|
|
size {SApXmm SApZmm}
|
|
coordinate_scheme SApCoordScheme
|
|
position {SApPosXmm SApPosYmm SApPosZmm}
|
|
refpos {VelSelPosXmm EndFacePosYmm VelSelPosZmm}
|
|
}
|
|
|
|
::hdb::MakeAperture entrance_aperture {
|
|
shape EApShape
|
|
size {EApXmm EApYmm EApZmm}
|
|
coordinate_scheme EApCoordScheme
|
|
position EApPosYmm
|
|
refpos VelSelPosYmm
|
|
}
|
|
|
|
::hdb::MakeAperture rotary_aperture {
|
|
shape RotApShape
|
|
size {RotApXmm RotApZmm}
|
|
position RotApPosYmm
|
|
orientation RotApDeg
|
|
refpos VelSelPosYmm
|
|
}
|
|
|
|
#::hdb::MakeGeometry sample_geometry sample {
|
|
# coordinate_scheme SampleCoordScheme
|
|
# position {SamplePosXmm SamplePosYmm SamplePosZmm}
|
|
# orientation {SampleTiltXDeg SampleTiltYDeg SampleRotDeg}
|
|
# refpos {VelSelPosXmm EndFacePosYmm VelSelPosZmm}
|
|
#}
|
|
|
|
::hdb::MakeGeometry detector_geometry detector {
|
|
coordinate_scheme DetCoordScheme
|
|
position {DetPosXmm DetPosYmm}
|
|
offset DetPosYOffsetmm
|
|
refpos {VelSelPosXmm EndFacePosYmm}
|
|
}
|
|
|
|
::hdb::MakeGeometry collimator_geometry collimator {
|
|
coordinate_scheme CollCoordScheme
|
|
position EndFacePosYmm
|
|
refpos VelSelPosYmm
|
|
}
|
|
|
|
::hdb::MakeGeometry beamstop_geometry beam_stop {
|
|
shape BSShape
|
|
position {BSPosXmm BSPosZmm}
|
|
size {BSXmm BSZmm}
|
|
}
|
|
|
|
# INITIALISE PARAMETERS
|
|
# The collimation system aperture positions
|
|
# Reference position is outer wall of velocity selector bunker, ie VelSelPosYmm
|
|
array set collapposmm {
|
|
inputguide 633
|
|
apwheel 675
|
|
ap1 4929
|
|
ap2 6934
|
|
ap3 8949
|
|
ap4 10955
|
|
ap5 12943
|
|
ap6 14970
|
|
ap7 16971
|
|
ap9 19925
|
|
}
|
|
|
|
VelSelPosXmm 0.0
|
|
VelSelPosYmm 0.0
|
|
VelSelPosZmm 0.0
|
|
EndFacePosYmm 20095
|
|
RotApPosYmm 675
|
|
|
|
################################################################################
|
|
# Check Config
|
|
namespace eval parameters {
|
|
set paramlist {
|
|
AttFactor
|
|
AttRotDeg
|
|
BS1
|
|
BS2
|
|
BS3
|
|
BS4
|
|
BS5
|
|
BSPosXmm
|
|
BSPosZmm
|
|
BSShape
|
|
BSXmm
|
|
BSZmm
|
|
C1
|
|
C2
|
|
C3
|
|
C4
|
|
C5
|
|
C6
|
|
C7
|
|
C8
|
|
C9
|
|
DetPosXmm
|
|
DetPosYmm
|
|
DetPosYOffsetmm
|
|
EApPosYmm
|
|
EApShape
|
|
EApShape
|
|
EApXmm
|
|
EApYmm
|
|
EApZmm
|
|
EndFacePosYmm
|
|
L1mm
|
|
L2mm
|
|
LambdaA
|
|
LambdaResFWHM%
|
|
Pent
|
|
Plexmm
|
|
RotApDeg
|
|
RotApShape
|
|
RotApXmm
|
|
RotApZmm
|
|
SampleAttributes
|
|
SampleComments
|
|
SampleName
|
|
SampleNum
|
|
SamplePosXmm
|
|
SamplePosYmm
|
|
SamplePosYmm
|
|
SamplePosZmm
|
|
SampleRotDeg
|
|
SampleTiltXDeg
|
|
SampleTiltYDeg
|
|
SampleTitle
|
|
SApPosXmm
|
|
SApPosYmm
|
|
SApPosYmm
|
|
SApPosZmm
|
|
SApShape
|
|
SApXmm
|
|
SApZmm
|
|
VSdeg
|
|
VSrpm
|
|
}
|
|
}
|
|
##
|
|
# @brief List undefined parameters
|
|
proc ::parameters::missingparams {} {
|
|
variable paramlist
|
|
set num 0
|
|
foreach param $paramlist {
|
|
if {[sicslist match $param] == " "} {
|
|
clientput $param
|
|
incr num
|
|
}
|
|
}
|
|
if {$num > 0} {
|
|
clientput "There are $num missing parameters"
|
|
} else {
|
|
clientput "OK"
|
|
}
|
|
}
|
|
|
|
##
|
|
# @brief Check list
|
|
proc check {args} {
|
|
switch $args {
|
|
"missing" {
|
|
::parameters::missingparams
|
|
}
|
|
}
|
|
}
|
|
publish check user
|