VarMake detector_distance Float User VarMake detector_base Float User VarMake slit4_distance Float User VarMake slit4_base Float User VarMake sample_distance Float User VarMake sample_base Float User VarMake slit3_distance Float User VarMake slit3_base Float User detector_distance 10000 detector_base 300 slit4_distance 6000 slit4_base 20 sample_distance 5800 sample_base 50 slit3_distance 5600 slit3_base 20 proc 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]]] set h1 [expr [SplitReply [detector_base]] + $d1 * tan($rad)] set h2 [expr [SplitReply [slit4_base]] + $d2 * tan($rad)] return "dz=$h1,st4vt=$h2" } publish set_two_theta user proc 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 MakeConfigurableMotor two_theta two_theta readscript get_two_theta two_theta drivescript set_two_theta