SICS-771 Save name of selected sample aperture and improve nguide command.

This commit is contained in:
Ferdi Franceschini
2014-09-10 14:54:11 +10:00
parent b70fb72e8f
commit 7bd9409144

View File

@@ -60,10 +60,11 @@ sapmot position_names D2.5 D5 D7.5 D10 D12.5 D15 D17.5 D20 D30 D40
sapmot precision 0.001
# TODO implement target
::utility::macro::getset text sample_aperture { {target "NONE"} } {
return "sample_aperture = [posname sapmot]"
return "sample_aperture = [SplitReply [posname sapmot]]"
}
sicslist setatt sample_aperture klass sample
sicslist setatt sample_aperture long_name sample_aperture
sicslist setatt sample_aperture mutable false
################################################################################
@@ -99,30 +100,74 @@ proc posname {pmot} {
set first_pos [lindex $positions 0]
set last_pos [lindex $positions end]
if {[expr abs($pos - $first_pos)] < $tol} {
return [lindex $pnames 0]
} elseif {$pos < $first_pos} {
return "before_[lindex $pnames 0]"
if { [llength $pnames] != [llength $positions] } {
error "[info level 0]: Name list and position list are not the same size"
} else {
if { [llength $pnames] < 1} {
error "[info level 0]: Motor $pmot does not have a list of positions"
}
}
if { [expr abs($pos - $first_pos)] < $tol } {
set named_pos [lindex $pnames 0]
} elseif {$pos < $first_pos} {
set named_pos "before_[lindex $pnames 0]"
}
if {[expr abs($pos - $last_pos)] < $tol} {
return [lindex $pnames end]
set named_pos [lindex $pnames end]
} elseif {$pos > $last_pos} {
return "after_[lindex $pnames end]"
set named_pos "after_[lindex $pnames end]"
}
set next_index 1
foreach name [lrange $pnames 0 end-1] posit [lrange $positions 0 end-1] {
if {[expr abs($pos - $posit)] <= $tol} {
return $name
set named_pos $name
break
} elseif {$pos > [expr {$posit + $tol}] && $pos < [expr {[lindex $positions $next_index] - $tol}]} {
return "between_${name}_[lindex $pnames $next_index]"
set named_pos "between_${name}_[lindex $pnames $next_index]"
break
}
incr next_index
}
return "$pmot = $named_pos"
}
publish posname user
# \brief Is a motor in a named position
# \param pmot: motor name
# \param named_pos: Check if motor is at the named position. OPTIONAL
#
# If named_pos is empty then return true if the motor is in any named position
proc inpos {pmot {named_pos "_NONE_"}} {
set pos [ SplitReply [$pmot] ]
set tol [ SplitReply [$pmot precision] ]
set pnames [SplitReply [$pmot position_names]]
set positions [SplitReply [$pmot positions]]
if { [llength $pnames] != [llength $positions] } {
error "[info level 0]: Name list and position list are not the same size"
} else {
if { [llength $pnames] < 1} {
error "[info level 0]: Motor $pmot does not have a list of positions"
}
}
if {$named_pos == "_NONE_"} {
foreach posit [lrange $positions 0 end] {
if {[expr abs($pos - $posit)] <= $tol} {
return "true"
}
}
return "false"
} else {
if {$named_pos == [SplitReply [posname $pmot]]} {
return "true"
} else {
return "false"
}
}
}
# Length of a guide
::utility::mkVar lenguide float user lenguide true instrument true true
# Space between guides
@@ -143,8 +188,6 @@ publish posname user
# \return The number of selected guides or an error message
proc nguide { {num "REPORTNUM"} {sel_ap_name "NONE"} {aprest_name "NONE"}} {
set catch_status [ catch {
set FINDFIRST 1
set COUNT 2
set CheckDrive false
set ap_names { D10 D20 D40 S40 R100 }
array set EMSG {
@@ -154,16 +197,14 @@ proc nguide { {num "REPORTNUM"} {sel_ap_name "NONE"} {aprest_name "NONE"}} {
misaligned "Misalignment. At least one guide is not in the aperture or guide position"
apfailed "Failed to set apertures"
}
set guideposit 1
set apposit 2
set tol 0.1
set ng 0
set state $FINDFIRST
set GUIDEPOSIT 1
set APPOSIT 2
set MISCONFIGURED false
set apdrvlist {}
set pcdrvlist {}
set ap_target_list {}
if {$num != "REPORTNUM"} {
if {$num >= 0 && $num < 8} {
if {$num >= 0 && $num < 7} {
if { $sel_ap_name == "NONE" || $aprest_name == "NONE" } {
error "$EMSG(invalidarg): You must provide two aperture arguments"
} elseif { [lsearch -nocase $ap_names $sel_ap_name] == -1 } {
@@ -172,88 +213,123 @@ proc nguide { {num "REPORTNUM"} {sel_ap_name "NONE"} {aprest_name "NONE"}} {
error "$EMSG(invalidarg): $aprest_name should be one of $ap_names"
}
}
if {$num == 7} {
if { $sel_ap_name == "NONE"} {
error "$EMSG(invalidarg): You must provide one aperture argument"
} elseif { [lsearch -nocase $ap_names $sel_ap_name] == -1 } {
error "$EMSG(invalidarg): $sel_ap_name should be one of $ap_names"
}
}
if {$num >= 0 && $num <= 8} {
set CheckDrive true
set last 8
for {set n 1} {$n <= $num} {incr n } {
set currpos [SplitReply [pc$last]]
set table_guideunit [SplitReply [pc$last posit2unit $guideposit]]
if {[expr {abs($currpos - $table_guideunit)}] > $tol} {
lappend pcdrvlist c$last $guideposit
lappend apdrvlist ap$last 1
}
incr last -1
}
for {set n [expr 8 - $num]} {$n >= 1} {incr n -1} {
set currpos [SplitReply [pc$n]]
set table_guideunit [SplitReply [pc$n posit2unit $apposit]]
set table_guideunit [SplitReply [pc$n posit2unit $GUIDEPOSIT]]
set tol [SplitReply [pc$n precision]]
if {[expr {abs($currpos - $table_guideunit)}] > $tol} {
lappend pcdrvlist c$n $apposit
lappend pcdrvlist pc$n $table_guideunit
lappend apdrvlist ap$n 1
}
}
for {set n [expr $num + 1]} {$n <= 8} {incr n} {
set currpos [SplitReply [pc$n]]
set table_appunit [SplitReply [pc$n posit2unit $APPOSIT]]
set tol [SplitReply [pc$n precision]]
if {[expr {abs($currpos - $table_appunit)}] > $tol} {
lappend pcdrvlist pc$n $table_appunit
}
}
if {[llength $pcdrvlist] > 0 && [llength $apdrvlist] > 0} {
clientput "drive $apdrvlist"
eval "drive $apdrvlist"
drive {*}$apdrvlist
}
if {[llength $pcdrvlist] > 0} {
clientput "drive $pcdrvlist"
eval "drive $pcdrvlist"
drive {*}$pcdrvlist
}
} else {
error "$EMSG(invalidarg)"
}
# Select Apertures
if {$num >= 0 && $num < 8} {
set sel_ap_pos [SplitReply [ ap$last ]]
set req_sel_ap_pos [ SplitReply [ ap$last posit2unit $sel_ap_name ] ]
set sel_ap_prec [ SplitReply [ap$last precision] ]
set sel_ap ap[expr $num + 1]
set sel_ap_pos [SplitReply [ $sel_ap ]]
set req_sel_ap_pos [ SplitReply [ $sel_ap posit2unit $sel_ap_name ] ]
set sel_ap_prec [ SplitReply [$sel_ap precision] ]
if { [expr abs($req_sel_ap_pos - $sel_ap_pos)] > $sel_ap_prec } {
lappend ap_target_list ap$last $sel_ap_name
lappend ap_target_list $sel_ap $req_sel_ap_pos
}
for {set n [expr $last - 1]} {$n > 0} {incr n -1} {
for {set n [expr $num + 2]} {$n <= 8} {incr n} {
set sel_pos [SplitReply [ ap$n ]]
set req_pos [ SplitReply [ ap$n posit2unit $aprest_name ] ]
set prec [ SplitReply [ap$n precision] ]
if { [expr abs($req_pos - $sel_pos)] > $prec } {
lappend ap_target_list ap$n $aprest_name
lappend ap_target_list ap$n $req_pos
}
}
if {[llength $ap_target_list] > 0} {
pdrive {*}$ap_target_list
clientput "drive $ap_target_list"
drive {*}$ap_target_list
}
}
}
# Check guide alignment
set ap_posname_list {}
set table_posname_list {}
set ng 0
# COUNT number of tables in guide position
for {set n 1} {$n <= 8} {incr n} {
set currpos [SplitReply [pc$n]]
set table_guideunit [SplitReply [pc$n posit2unit $guideposit]]
set table_appunit [SplitReply [pc$n posit2unit $apposit]]
switch $state [subst {
$FINDFIRST {
if {[expr {abs($currpos - $table_appunit)}] <= $tol} {
set ap_posname_list {[linsert $ap_posname_list 0 ap${n}=[posname ap$n]]}
continue
} elseif {[expr {abs($currpos - $table_guideunit)}] <= $tol} {
incr ng
set state $COUNT
} else {
return "$EMSG(misaligned)"
break
}
}
$COUNT {
set table_guideunit [SplitReply [pc$n posit2unit $GUIDEPOSIT]]
set table_appunit [SplitReply [pc$n posit2unit $APPOSIT]]
set tol [SplitReply [pc$n precision]]
if {[expr {abs($currpos - $table_guideunit)}] <= $tol} {
incr ng
} elseif {[expr {abs($currpos - $table_appunit)}] <= $tol} {
# Table in aperture position
break
} else {
# ERROR There shouldn't be any gaps in the selection
return "$EMSG(gaps)"
set MISCONFIGURED true
break
}
}
}]
if {$ng < 8} {
# Check first aperture selected after guides
set n [ expr $ng + 1]
set currpos [SplitReply [pc$n]]
set table_appunit [SplitReply [pc$n posit2unit $APPOSIT]]
set tol [SplitReply [pc$n precision]]
if {[expr {abs($currpos - $table_appunit)}] <= $tol} {
if {[inpos ap$n] == "false"} {
set MISCONFIGURED true
}
} else {
set MISCONFIGURED true
}
if {$ng < 7} {
# Check that the rest of the apertures are all the same
set apn "ap[expr $ng + 2]"
if [inpos $apn] {
set pname [SplitReply [posname $apn]]
for {set n [expr $ng + 3]} {$n <= 8} {incr n} {
if { $pname != [SplitReply [posname ap$n]] } {
set MISCONFIGURED true
break
}
}
} else {
set MISCONFIGURED true
}
}
}
for {set n 1} {$n <= 8} {incr n} {
lappend table_posname_list [posname pc$n]
lappend ap_posname_list [posname ap$n]
}
if {$MISCONFIGURED} {
return "nguide = MISCONFIGURED: $ng guides $table_posname_list apertures $ap_posname_list"
}
if {$CheckDrive} {
@@ -262,10 +338,9 @@ proc nguide { {num "REPORTNUM"} {sel_ap_name "NONE"} {aprest_name "NONE"}} {
set drive_ok false
clientput "$EMSG(drivefailed): Failed to select guides"
}
foreach {ap_mot ap_name} $ap_target_list {
foreach {ap_mot target} $ap_target_list {
set pos [SplitReply [$ap_mot]]
set tol [SplitReply [$ap_mot precision]]
set target [SplitReply [$ap_mot posit2unit $ap_name]]
if {[expr {abs($pos - $target)}] > $tol} {
set drive_ok false
clientput "$EMSG(drivefailed): Apertures off target"
@@ -278,7 +353,7 @@ proc nguide { {num "REPORTNUM"} {sel_ap_name "NONE"} {aprest_name "NONE"}} {
clientput "nguide finished with errors"
}
}
return "[lindex [info level 0] 0] = $ng $ap_posname_list"
return "[lindex [info level 0] 0] = $ng [lrange $ap_posname_list $ng 8]"
} message ]
handle_exception $catch_status $message
}
@@ -292,7 +367,7 @@ sicslist setatt gs_nguide klass instrument
sicslist setatt gs_nguide long_name nguide
proc L1 {} {
set ng [SplitReply [nguide]]
set ng [lrange [nguide] 2 2]
set lg [SplitReply [lenguide]]
set sg [SplitReply [spaceguide]]
set sy [SplitReply [samy]]
@@ -430,7 +505,7 @@ proc Ltof {det} {
}
set L1 [SplitReply [L1]]
set lg [SplitReply [lenguide]]
set ng [SplitReply [nguide]]
set ng [lrange [nguide] 2 2]
set sg [SplitReply [spaceguide]]
set lch4_pc1 [SplitReply [lch4_pc1]]
set Lt0 [SplitReply [Lt0]]