##################################

SICS-226

util/utility.tcl
Added set_chopper_attributes to set hdb metadata on chopperadapters

server_config.tcl
Set hdb metadata on chopperadapters

hipadaba_configuration_common.tcl
:hdb::sobjadd can now add chopperadapters to the hdb tree
::hdb::cmd_par now preserves case when adding command parameters.

instdict_specification.tcl
Added chopperadapter sicstype and disk_chopper class

nxscripts_common_1.tcl
Added chopperadapter save and sdsinfo commands.

reflectometer/config/chopper/chopper.tcl
Set units on chopperadapters.

 ##################################

hipd,hrpd,rsd, /config/commands.tcl
Add instrument specific initialisation procedure for commands

reflectometer/config/commands.tcl
Created omega_2theta and set_mode commands from Andrew Nelson's procs in extraconfig.tcl

reflectometer/.../motor_configuration.tcl
Added ds and rs prefix to the two_theta drive and read scripts to prevent name collision with the two_theta procs in commans.tcl

SICS-108 reflectometer/../parameters.tcl
Added parameters for guide, slit and chopper distances and elements.

SICS-108 common_instrument_dictionary.tcl
Make parameters saveable

r2678 | ffr | 2008-08-18 13:01:29 +1000 (Mon, 18 Aug 2008) | 40 lines
This commit is contained in:
Ferdi Franceschini
2008-08-18 13:01:29 +10:00
committed by Douglas Clowes
parent 348bd3aed1
commit 8090104407
13 changed files with 429 additions and 24 deletions

View File

@@ -38,6 +38,7 @@ if {$sim_mode == "true"} {
ChopperAdapter ch3phase chopperController phase_3 0 180
ChopperAdapter ch4phase chopperController phase_4 0 180
##
# @brief Return TCL_ERROR if chopper is in a state which disallows data acquisition.
# This is useful for aborting scans or batch files.
@@ -61,3 +62,8 @@ if {$sim_mode == "true"} {
}
}
}
sicslist setatt chspeed units "rpm"
sicslist setatt ch2phase units "degrees"
sicslist setatt ch3phase units "degrees"
sicslist setatt ch4phase units "degrees"

View File

@@ -4,3 +4,266 @@ namespace eval motor {
# is_homing_list = comma separated list of motors which are safe to send "home"
variable is_homing_list ""
}
namespace eval exp_mode {
variable valid_modes
variable guide_for_mode ;#guide element for a specific mode
variable c1ht_pos
#0=polarisation
#1=mt
#2=focussing
#3=DB
#4=Single
variable c1ht_pos
set valid_modes [list SB DB FOC MT POL]
set c1ht_pos [list 1057 806.7 557.1 200 200]
command set_mode "text=[join $valid_modes ,] arg " { ;#need to change all softzero's
global ::exp_mode::valid_modes
if {[lsearch $::exp_mode::valid_modes $arg] == -1} {
Clientput "Mode is: $::exp_mode::valid_modes - (polarisation,mt,focussing,DB,single)"
return -code error "Mode is: $::exp_mode::valid_modes - (polarisation,mt,focussing,DB,single)"
} else {
if { [catch {::exp_mode::set_guide_element $arg} errMsg] } {
Clientput $errMsg
return -code error $errMsg
}
mode $arg
}
omega -1
twotheta -1
return -code ok
}
command omega_2theta { float arg1 float arg2 } {
#need to set omega first. This is because
#for Single bounce the twotheta positions depend on the angle of incidence
if {[catch {::exp_mode::set_omega $arg1} errMsg]} {return -code error $errMsg}
if {[catch {::exp_mode::set_two_theta $arg2} errMsg]} {return -code error $errMsg}
return -code ok
}
}
##
# @brief Drive c1ht and set guide_element parameter
#
# @param arg is the user mode
proc ::exp_mode::set_guide_element { arg } {
global ::exp_mode::c1ht_pos
global ::exp_mode::valid_modes
if {[lsearch $::exp_mode::valid_modes $arg] == -1} {
Clientput "Mode is: $::exp_mode::valid_modes - (polarisation,mt,focussing,DB,single)"
return -code error "Mode is: $::exp_mode::valid_modes - (polarisation,mt,focussing,DB,single)"
}
if {[catch {::exp_mode::checkMotionAndDrive c1ht [lindex $c1ht_pos [lsearch $::exp_mode::valid_modes $arg]]} errMsg]} {
return -code error $errMsg
} else {
guide_element $arg
return -code ok
}
}
proc ::exp_mode::set_omega { arg } {
set expmode [SplitReply [mode]]
if {[lsearch $::exp_mode::valid_modes $expmode] == -1} {
Clientput "Please set the mode first"
return -code error "Please set the mode first"
}
if {$arg<0} {
return -code error "omega must be greater than 1"
}
if {[catch {::exp_mode::set_guide_element $expmode} errMsg]} {
return -code error $errMsg ;#make sure the guide element is moved.
}
set argrad [deg2rad $arg] ;#position in radians
switch $expmode {
SB {
if {[catch {::exp_mode::checkMotionAndDrive m1ro [expr $arg/2.]} errMsg]} {return -code error $errMsg}
set d1 [expr [SplitReply [slit3_distance]] - [SplitReply [guide1_distance]]]
set d2 [expr [SplitReply [sample_distance]] - [SplitReply [guide1_distance]]]
set h1 [expr -1. * $d1 * tan($argrad)]
set h2 [expr -1. * $d2 * tan($argrad)]
if {[catch {checkMotionAndDrive st3vt $h1} errMsg]} {return -code error $errMsg}
if {[catch {checkMotionAndDrive sz $h2} errMsg]} {return -code error $errMsg}
}
DB {
return -code error "ERROR: set_omega not yet defined for DB"
set temp [deg2rad 2.4]
set offset [expr 600*sin($temp)]
set arg 4.8 ;#fixed angle
set d1 [expr [SplitReply [slit3_distance]] - [SplitReply [guide2_distance]]]
set d2 [expr [SplitReply [sample_distance]] - [SplitReply [guide2_distance]]]
set h1 [expr -1. * $d1 * tan($argrad) - $offset]
set h2 [expr -1. * $d1 * tan($argrad) - $offset]
if { [catch {checkMotionAndDrive st3vt $h1} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive sz $h2} errMsg]} {return -code error $errMsg}
}
FOC {
if { [catch {checkMotionAndDrive sth $arg} errMsg]} {return -code error $errMsg}
}
MT {
if { [catch {checkMotionAndDrive sth $arg} errMsg]} {return -code error $errMsg}
}
default {
return -code error "omega driving not specified for that mode"
}
}
omega $arg
return -code ok
}
publish ::exp_mode::set_omega user
proc ::exp_mode::set_two_theta { arg } {
set expmode [SplitReply [mode]]
set expomega [SplitReply [omega]]
if {[lsearch $::exp_mode::valid_modes $expmode] == -1} {
return -code error "please set the mode and omega first"
}
if {$expomega == "NaN"} {
return -code error "please set omega first"
}
if {$arg<0} {
return -code error "two_theta is less than 0"
}
set argrad [deg2rad $arg] ;#position in radians
set omegarad [deg2rad $expomega]
Clientput $expmode
switch $expmode {
SB {
set d1 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [guide1_distance]]]
set h1 [expr -1. * $d2 * tan($omegarad)]
set b [expr $d1 / cos($omegarad)]
set c [expr $d1 / cos($argrad-$omegarad)]
set h2 [expr sqrt(pow($b,2) + pow($c,2) - 2*$b*$c*cos($argrad))]
set d3 [expr [SplitReply [dy]]]
set d4 [expr [SplitReply [dy]] + [SplitReply [sample_distance]] - [SplitReply [guide1_distance]]]
set h3 [expr -1. * $d4 * tan($omegarad)]
set b [expr $d3 / cos($omegarad)]
set c [expr $d3 / cos($argrad-$omegarad)]
set h4 [expr sqrt(pow($b,2) + pow($c,2) - 2*$b*$c*cos($argrad))]
if { [catch {checkMotionAndDrive dz [expr $h3 + $h4]} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive st4vt [expr $h2 + $h1]} errMsg]} {return -code error $errMsg}
}
DB {
return -code error "ERROR: set_omega not yet defined for DB"
set temp [deg2rad 2.4]
set offset [expr 600*sin($temp)]
set expomega 4.8
set omegarad [deg2rad $expomega]
set d1 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [guide2_distance]]]
set h1 [expr -1. * $d2 * tan($omegarad) - $offset]
set b [expr $d1 / cos($omegarad)]
set c [expr $d1 / cos($argrad-$omegarad)]
set h2 [expr sqrt(pow($b,2) + pow($c,2) - 2*$b*$c*cos($argrad))]
set d3 [expr [SplitReply [dy]]]
set d4 [expr [SplitReply [dy]] + [SplitReply [sample_distance]] - [SplitReply [guide2_distance]]]
set h3 [expr -1. * $d4 * tan($omegarad) - $offset]
set b [expr $d3 / cos($omegarad)]
set c [expr $d3 / cos($argrad-$omegarad)]
set h4 [expr sqrt(pow($b,2) + pow($c,2) - 2*$b*$c*cos($argrad))]
if { [catch {checkMotionAndDrive dz [expr $h3 + $h4]} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive st4vt [expr $h2 + $h1]} errMsg]} {return -code error $errMsg}
}
FOC {
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
if { [catch {checkMotionAndDrive dz $h1} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive st4vt $h2} errMsg]} {return -code error $errMsg}
}
MT {
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
if { [catch {checkMotionAndDrive dz $h1} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive st4vt $h2} errMsg]} {return -code error $errMsg}
}
default {
return -code error "two_theta not defined for that mode: $expmode"
}
}
twotheta $arg
return -code ok
}
publish ::exp_mode::set_two_theta user
proc ::exp_mode::checkMotion { scan_variable target } {
set motor_list [sicslist type motor]
if {[lsearch $motor_list $scan_variable]==-1} {
return -code error "you tried to drive a motor that doesn't exist"
}
if {[catch {
::scan::check_limit $scan_variable hardlowerlim $target
::scan::check_limit $scan_variable hardupperlim $target
::scan::check_limit $scan_variable softlowerlim $target
::scan::check_limit $scan_variable softupperlim $target
}]} {
return -code error $::errorInfo
}
return -code ok
}
publish ::exp_mode::checkMotion user
proc ::exp_mode::checkMotionAndDrive { scan_variable target } {
set motor_list [sicslist type motor]
#lappend motorlist [sicslist type configurablevirtualmotor]
set precision [SplitReply [$scan_variable precision]]
if {[catch {
::exp_mode::checkMotion $scan_variable $target
}]} {
return -code error $::errorInfo
} else {
drive $scan_variable $target
set position [SplitReply [$scan_variable]]
if {[expr [expr $position-$target] > abs($precision)]} {
return -code error "move of: $scan_variable did not reach required precision"
} else {
Clientput "New $scan_variable Position: $position"
Clientput "Driving finished successfully"
}
return -code ok
}
}
publish ::exp_mode::checkMotionAndDrive user
proc ::exp_mode::deg2rad { arg } {
set pi 3.1415926535897931
return [expr $pi * $arg / 180.]
}
proc ::exp_mode::rad2deg { arg } {
set pi 3.1415926535897931
return [expr 180. * $arg / $pi]
}
##
# @brief Commands initialisation procedure
proc ::commands::isc_initialize {} {
::commands::ic_initialize
}

View File

@@ -901,7 +901,7 @@ make_gap_motors ss3hg gap ss3ho offset ss3r ss3l mm $slit3HGroup
make_gap_motors ss4vg gap ss4vo offset ss4u ss4d mm $slit4VGroup
make_gap_motors ss4hg gap ss4ho offset ss4r ss4l mm $slit4HGroup
proc set_two_theta { arg } {
proc ds_set_two_theta { arg } {
set rad [expr ($arg/180.0)*3.1415926535897932384626433832795]
set d1 [expr [SplitReply [detector_distance]] - [SplitReply [sample_distance]]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
@@ -909,18 +909,18 @@ proc set_two_theta { arg } {
set h2 [expr [SplitReply [slit4_base]] + $d2 * tan($rad)]
return "dz=$h1,st4vt=$h2"
}
publish set_two_theta user
publish ds_set_two_theta user
proc get_two_theta {} {
proc rs_get_two_theta {} {
set d1 [expr [SplitReply [detector_distance]] - [SplitReply [sample_distance]]]
set h1 [expr [SplitReply [dz]] - [SplitReply [detector_base]]]
return [expr (180.0*atan2($h1, $d1))/3.1415926535897932384626433832795]
}
publish get_two_theta user
publish rs_get_two_theta user
MakeConfigurableMotor two_theta
two_theta readscript get_two_theta
two_theta drivescript set_two_theta
two_theta readscript rs_get_two_theta
two_theta drivescript ds_set_two_theta
sicslist setatt two_theta klass sample
sicslist setatt two_theta long_name two_theta
sicslist setatt two_theta units degrees

View File

@@ -11,17 +11,61 @@ foreach vn {
sample_base
slit3_distance
slit3_base
guide1_distance
guide1_base
guide2_distance
guide2_base
slit2_distance
slit2_base
chopper4_distance
chopper4_base
chopper3_distance
chopper3_base
chopper2_distance
chopper2_base
chopper1_distance
chopper1_base
slit1_distance
slit1_base
omega
twotheta
} {
::utility::mkVar $vn float manager $vn true parameter true true
}
foreach vn {
mode
guide_element
} {
::utility::mkVar $vn Text manager $vn true parameter true true
}
detector_distance 10000
detector_base 300
slit4_distance 6000
slit4_distance 5527
slit4_base 20
sample_distance 5800
sample_distance 5129
sample_base 50
slit3_distance 5600
slit3_distance 4808
slit3_base 20
guide1_distance 2979
guide1_base
guide2_distance 3279
guide2_base
slit2_distance 1895
slit2_base 20
chopper4_distance 823
chopper4_base 20
chopper3_distance 370
chopper3_base 20
chopper2_distance 102
chopper2_base 20
chopper1_distance 0
chopper1_base 20
slit1_distance -244
slit1_base 20
mode NONE
omega -1
twotheta -1
guide_element NONE