Merging release 2.0 branch with CVS trunk
r2601 | ffr | 2008-05-30 10:26:57 +1000 (Fri, 30 May 2008) | 2 lines
This commit is contained in:
committed by
Douglas Clowes
parent
4a937e1608
commit
0749b0effa
@@ -5,8 +5,16 @@
|
||||
|
||||
MakeNXScript
|
||||
sicsdatafactory new nxscript_data
|
||||
#mkVar name type access long_name nxsave klass control data
|
||||
::utility::mkVar start_seconds int user start_seconds false entry false false
|
||||
::utility::mkVar estart Text user start_time true entry false true
|
||||
::utility::mkVar eend Text user end_time true entry false true
|
||||
::utility::mkVar timestamp int user time_stamp true entry false true
|
||||
::utility::mkVar data_run_number int user run_number true instrument false true
|
||||
sicslist setatt data_run_number mutable true
|
||||
sicslist setatt timestamp mutable true
|
||||
sicslist setatt timestamp units seconds
|
||||
|
||||
namespace eval nexus {
|
||||
variable data_gp_path "/data"
|
||||
set exports [list newfile closefile save data]
|
||||
@@ -32,12 +40,12 @@ namespace eval nexus {
|
||||
# TODO Put the filetype_spec in a separate file.
|
||||
variable filetype_spec {
|
||||
BEAM_MONITOR {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {data_set ::monitor::count_fb_counts}
|
||||
save_policy {include @all exclude {hmm hmm_xy hmm_xt hmm_yt hmm_x hmm_y hmm_t}}
|
||||
}
|
||||
HISTOGRAM_XYT {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {axis 2 ::histogram_memory::time_channel}
|
||||
link {axis 3 ::histogram_memory::vertical_axis}
|
||||
link {axis 4 ::histogram_memory::horizontal_axis}
|
||||
@@ -45,40 +53,40 @@ namespace eval nexus {
|
||||
save_policy {include @all exclude {hmm_xy hmm_xt hmm_yt hmm_x hmm_y hmm_t}}
|
||||
}
|
||||
HISTOGRAM_XY {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {axis 2 ::histogram_memory::vertical_axis}
|
||||
link {axis 3 ::histogram_memory::horizontal_axis}
|
||||
link {data_set hmm_xy}
|
||||
save_policy {include @all exclude {hmm hmm_xt hmm_yt hmm_x hmm_y hmm_t}}
|
||||
}
|
||||
HISTOGRAM_XT {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {axis 2 ::histogram_memory::time_channel}
|
||||
link {axis 3 ::histogram_memory::horizontal_axis}
|
||||
link {data_set hmm_xt}
|
||||
save_policy {include @all exclude {hmm_xy hmm hmm_yt hmm_x hmm_y hmm_t}}
|
||||
}
|
||||
HISTOGRAM_YT {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {axis 2 ::histogram_memory::time_channel}
|
||||
link {axis 3 ::histogram_memory::vertical_axis}
|
||||
link {data_set hmm_yt}
|
||||
save_policy {include @all exclude {hmm_xy hmm_xt hmm hmm_x hmm_y hmm_t}}
|
||||
}
|
||||
HISTOGRAM_X {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {axis 2 ::histogram_memory::horizontal_axis}
|
||||
link {data_set hmm_x}
|
||||
save_policy {include @all exclude {hmm_xy hmm_xt hmm_yt hmm hmm_y hmm_t}}
|
||||
}
|
||||
HISTOGRAM_Y {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {axis 2 ::histogram_memory::vertical_axis}
|
||||
link {data_set hmm_y}
|
||||
save_policy {include @all exclude {hmm_xy hmm_xt hmm_yt hmm_x hmm hmm_t}}
|
||||
}
|
||||
HISTOGRAM_T {
|
||||
link {axis 1 ::data::gumtree_save_par_run_number}
|
||||
link {axis 1 data_run_number}
|
||||
link {axis 2 ::histogram_memory::time_channel}
|
||||
link {data_set hmm_t}
|
||||
save_policy {include @all exclude {hmm_xy hmm_xt hmm_yt hmm_x hmm_y hmm}}
|
||||
@@ -187,25 +195,30 @@ proc newFileName {postfix} {
|
||||
variable nexusdic
|
||||
variable state
|
||||
variable data_gp_path
|
||||
if {$state(file,open) == "true"} {
|
||||
error_msg "Can't create a new file because the current file is still open"
|
||||
} elseif {$state(file,new) == "false"} {
|
||||
error_msg "This function should only be called when state(file,new) = true"
|
||||
}
|
||||
if [ catch {
|
||||
if {$state(file,open) == "true"} {
|
||||
error_msg "Can't create a new file because the current file is still open"
|
||||
} elseif {$state(file,new) == "false"} {
|
||||
error_msg "This function should only be called when state(file,new) = true"
|
||||
}
|
||||
|
||||
set file_format [SplitReply [SicsDataPostFix]]
|
||||
array set nxmode [list nx.hdf create5 hdf create5 h5 create5 nx5 create5 xml createxml]
|
||||
set nxdict_path [::nexus::gen_nxdict $nexusdic]
|
||||
if {$state(file,namestyle) == "scratch"} {
|
||||
dataFileName [format "%s/scratch.%s" [::nexus::datapath] $file_format]
|
||||
} else {
|
||||
sicsdatanumber incr
|
||||
dataFileName [newFileName $file_format]
|
||||
set file_format [SplitReply [SicsDataPostFix]]
|
||||
array set nxmode [list nx.hdf create5 hdf create5 h5 create5 nx5 create5 xml createxml]
|
||||
set nxdict_path [::nexus::gen_nxdict $nexusdic]
|
||||
if {$state(file,namestyle) == "scratch"} {
|
||||
dataFileName [format "%s/scratch.%s" [::nexus::datapath] $file_format]
|
||||
} else {
|
||||
sicsdatanumber incr
|
||||
dataFileName [newFileName $file_format]
|
||||
}
|
||||
hsetprop $data_gp_path currentfiletype [::utility::hgetplainprop $data_gp_path datatype]
|
||||
nxscript $nxmode($file_format) [SplitReply [dataFileName]] $nxdict_path
|
||||
set state(file,open) false
|
||||
set state(file,new) false
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
hsetprop $data_gp_path currentfiletype [::utility::hgetplainprop $data_gp_path datatype]
|
||||
nxscript $nxmode($file_format) [SplitReply [dataFileName]] $nxdict_path
|
||||
set state(file,open) false
|
||||
set state(file,new) false
|
||||
}
|
||||
|
||||
##
|
||||
@@ -233,10 +246,11 @@ proc ::nexus::isValidFileType {type} {
|
||||
# state(file,open) true state(file,new) false
|
||||
# /data/currentfiletype == UNKNOWN
|
||||
proc ::nexus::newfile {type {namestyle data}} {
|
||||
variable filetype_spec
|
||||
variable state
|
||||
variable data_gp_path
|
||||
variable filetype_spec
|
||||
variable state
|
||||
variable data_gp_path
|
||||
|
||||
if [ catch {
|
||||
set state(file,namestyle) $namestyle
|
||||
set state(file,new) true
|
||||
hsetprop $data_gp_path currentfiletype UNKNOWN
|
||||
@@ -248,7 +262,11 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
} else {
|
||||
::nexus::process_filetype_policy $type filetype_spec
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Save data to the currently open file and then close it.
|
||||
@@ -256,18 +274,29 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
# @param point This is the array index for mutable data elements
|
||||
#
|
||||
# This function provides the top level call to the recursive ::nexus::savetree
|
||||
# function
|
||||
# function, it should only be called by the ::nexus::save command.
|
||||
#
|
||||
# @see ::nexus::savetree
|
||||
# @see ::nexus::save
|
||||
proc ::nexus::save_data {point} {
|
||||
debug_msg "save point $point in [dataFileName]"
|
||||
::nexus::nxreopenfile
|
||||
foreach child [hlist /] {
|
||||
if {[::utility::hgetplainprop /$child data] == "true"} {
|
||||
::nexus::savetree $child $point
|
||||
if [ catch {
|
||||
if {[info level]<2} {
|
||||
error "ERROR: The [lindex [info level 0] 0] command is for internal use only"
|
||||
}
|
||||
set caller [namespace origin [lindex [info level -1] 0]]
|
||||
if {$caller != "::nexus::save"} {
|
||||
error "ERROR: [lindex [info level 0] 0] can only be called via the '::nexus::save' command, not by $caller"
|
||||
}
|
||||
foreach child [hlist /] {
|
||||
if {[::utility::hgetplainprop /$child data] == "true"} {
|
||||
::nexus::savetree $child $point
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
::nexus::nxclosefile
|
||||
}
|
||||
|
||||
##
|
||||
@@ -282,64 +311,105 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
variable state
|
||||
variable data_gp_path
|
||||
|
||||
if {[string is integer $point] == 0} {
|
||||
error_msg "save index must be an integer"
|
||||
} elseif {$point < 0} {
|
||||
error_msg "save index cannot be negative"
|
||||
}
|
||||
if [ catch {
|
||||
if {[string is integer $point] == 0} {
|
||||
error_msg "save index must be an integer"
|
||||
} elseif {$point < 0} {
|
||||
error_msg "save index cannot be negative"
|
||||
}
|
||||
|
||||
::data::gumtree_save -set run_number $point
|
||||
# ::data::gumtree_save -set run_number $point
|
||||
data_run_number $point
|
||||
|
||||
set isNewFile [expr {$state(file,new) == "true"}]
|
||||
set currFileType [::utility::hgetplainprop $data_gp_path currentfiletype]
|
||||
set currDataType [::utility::hgetplainprop $data_gp_path datatype]
|
||||
set dataTypeChanged [expr {$currFileType != $currDataType}]
|
||||
if {$currDataType == "UNKNOWN"} {
|
||||
error_msg "You must set the file type, eg 'newfile BEAM_MONITOR' or 'newfile BEAM_MONITOR scratch' "
|
||||
}
|
||||
|
||||
if {$isNewFile || $dataTypeChanged} {
|
||||
set state(file,new) true
|
||||
::nexus::createfile
|
||||
estart [lindex [sicstime] 1]
|
||||
eend [lindex [sicstime] 1]
|
||||
::nexus::save_data $point
|
||||
::nexus::linkdata
|
||||
} else {
|
||||
eend [lindex [sicstime] 1]
|
||||
::nexus::save_data $point
|
||||
}
|
||||
set isNewFile [expr {$state(file,new) == "true"}]
|
||||
set currFileType [::utility::hgetplainprop $data_gp_path currentfiletype]
|
||||
set currDataType [::utility::hgetplainprop $data_gp_path datatype]
|
||||
set dataTypeChanged [expr {$currFileType != $currDataType}]
|
||||
if {$currDataType == "UNKNOWN"} {
|
||||
error_msg "You must set the file type, eg 'newfile BEAM_MONITOR' or 'newfile BEAM_MONITOR scratch' "
|
||||
}
|
||||
|
||||
if {$isNewFile || $dataTypeChanged} {
|
||||
set state(file,new) true
|
||||
::nexus::createfile
|
||||
estart [lindex [sicstime] 1]
|
||||
eend [lindex [sicstime] 1]
|
||||
start_seconds [clock seconds]
|
||||
timestamp 0
|
||||
::nexus::nxreopenfile
|
||||
::nexus::save_data $point
|
||||
::nexus::makelinks
|
||||
::nexus::set_plotdata_info
|
||||
::nexus::nxclosefile
|
||||
} else {
|
||||
eend [lindex [sicstime] 1]
|
||||
timestamp [expr {[clock seconds] - [SplitReply [start_seconds]]}]
|
||||
::nexus::nxreopenfile
|
||||
::nexus::save_data $point
|
||||
::nexus::nxclosefile
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Reopen the current file, close it with nxclosefile
|
||||
# this should only be called by the ::nexus::save command.
|
||||
#
|
||||
# @see nxclosefile
|
||||
# @see ::nexus::save
|
||||
proc ::nexus::nxreopenfile {} {
|
||||
global cfPath
|
||||
variable state
|
||||
variable nexusdic
|
||||
if {$state(file,open) == "false"} {
|
||||
nxscript reopen [SplitReply [dataFileName]] $cfPath(nexus)/$nexusdic
|
||||
set state(file,open) true
|
||||
}
|
||||
if [ catch {
|
||||
if {[info level]<2} {
|
||||
error "ERROR: The [lindex [info level 0] 0] command is for internal use only"
|
||||
}
|
||||
set caller [namespace origin [lindex [info level -1] 0]]
|
||||
if {$caller != "::nexus::save"} {
|
||||
error "ERROR: [lindex [info level 0] 0] can only be called via the '::nexus::save' command, not by $caller"
|
||||
}
|
||||
if {$state(file,open) == "false"} {
|
||||
nxscript reopen [SplitReply [dataFileName]] $cfPath(nexus)/$nexusdic
|
||||
set state(file,open) true
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Close the current file. You can reopen it with nxreopenfile
|
||||
# this should only be called by the ::nexus::save command.
|
||||
#
|
||||
# @see nxreopenfile
|
||||
# @see ::nexus::save
|
||||
proc ::nexus::nxclosefile {} {
|
||||
variable state
|
||||
if {$state(file,open) == "true"} {
|
||||
nxscript close
|
||||
set state(file,open) false
|
||||
set flist [split [SplitReply [dataFileName]] "/"]
|
||||
set fname [lindex $flist [expr [llength $flist] - 1] ]
|
||||
clientput "$fname updated" "event"
|
||||
}
|
||||
if [ catch {
|
||||
if {[info level]<2} {
|
||||
error "ERROR: The [lindex [info level 0] 0] command is for internal use only"
|
||||
}
|
||||
set caller [namespace origin [lindex [info level -1] 0]]
|
||||
if {$caller != "::nexus::save"} {
|
||||
error "ERROR: [lindex [info level 0] 0] can only be called via the '::nexus::save' command, not by $caller"
|
||||
}
|
||||
if {$state(file,open) == "true"} {
|
||||
nxscript close
|
||||
set state(file,open) false
|
||||
set flist [split [SplitReply [dataFileName]] "/"]
|
||||
set fname [lindex $flist [expr [llength $flist] - 1] ]
|
||||
clientput "$fname updated" "event"
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
##
|
||||
# @brief Records that a given data source should be linked to nexus data target.
|
||||
@@ -439,25 +509,48 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
# @brief Links data and axis into /data group
|
||||
# @brief Make dataset links
|
||||
#
|
||||
# Sets the "signal" and "axes" attributes on the plottable data
|
||||
proc ::nexus::makelinks {{hpath /}} {
|
||||
if [ catch {
|
||||
foreach child [hlist $hpath] {
|
||||
if {$hpath == "/"} {
|
||||
set newpath /$child
|
||||
} else {
|
||||
set newpath $hpath/$child
|
||||
}
|
||||
# clientput $newpath
|
||||
array set p_arr [::utility::hlistplainprop $newpath]
|
||||
if {$p_arr(data) == "true" && $p_arr(nxsave) == "true"} {
|
||||
if {[info exists p_arr(type)] && $p_arr(type) == "nxvgroup"} {
|
||||
if {$p_arr(link) != "@none"} {
|
||||
# clientput "Link $p_arr(nxalias) to $p_arr(link)"
|
||||
nxscript makelink $p_arr(nxalias) $p_arr(link)
|
||||
}
|
||||
}
|
||||
::nexus::makelinks $newpath
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
##
|
||||
# @brief Sets the "signal" and "axes" attributes on the plottable data
|
||||
# Also sets the "axis" attribute for each of the axes.
|
||||
proc ::nexus::linkdata {} {
|
||||
proc ::nexus::set_plotdata_info {} {
|
||||
variable data_gp_path
|
||||
|
||||
array unset axes
|
||||
set hpath $data_gp_path
|
||||
::nexus::nxreopenfile
|
||||
foreach child [hlist $hpath] {
|
||||
array set p_arr [::utility::hlistplainprop $hpath/$child]
|
||||
if {$p_arr(data) == true && $p_arr(nxsave) == true} {
|
||||
if {[info exists p_arr(nxalias)]} {
|
||||
if {[info exists p_arr(type)] && $p_arr(type) == "nxvgroup"} {
|
||||
if {$p_arr(link) != "@none"} {
|
||||
nxscript makelink $p_arr(nxalias) $p_arr(link)
|
||||
switch -glob $child {
|
||||
"axis_*" {
|
||||
set n [lindex [split $child _] 1]
|
||||
@@ -468,7 +561,7 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
nxscript putattribute $p_arr(link) signal 1
|
||||
set data_set_alias $p_arr(link)
|
||||
}
|
||||
default {error "ERROR: [info level -1]->linkdata, Unsupported data path $hpath/$child"}
|
||||
default {error "ERROR: [info level -1]->set_plotdata_info, Unsupported data path $hpath/$child"}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -481,7 +574,6 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
}
|
||||
nxscript putattribute $data_set_alias axes [join $axes_list :]
|
||||
}
|
||||
::nexus::nxclosefile
|
||||
}
|
||||
|
||||
##
|
||||
@@ -490,25 +582,31 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
# @param hpath path of subtree to save, must not be "/"
|
||||
# @param pt Current array index for mutable data (optional default=0)
|
||||
proc ::nexus::savetree {hpath {pt 0}} {
|
||||
foreach child [hlist /$hpath] {
|
||||
array unset p_arr
|
||||
array set p_arr [::utility::hlistplainprop /$hpath/$child]
|
||||
if {[info exists p_arr(type)] && $p_arr(type) == "nxvgroup"} {
|
||||
return
|
||||
}
|
||||
set data_type [lindex [split [hinfo /$hpath/$child] , ] 0]
|
||||
if {$p_arr(data) == true && $p_arr(nxsave) == true } {
|
||||
if {[info exists p_arr(savecmd)] && [info exists p_arr(nxalias)] } {
|
||||
if {[info exists p_arr(mutable)] && $p_arr(mutable) == "true" } {
|
||||
$p_arr(savecmd) $p_arr(sicsdev) $p_arr(nxalias) $data_type point $pt
|
||||
} else {
|
||||
$p_arr(savecmd) $p_arr(sicsdev) $p_arr(nxalias) $data_type
|
||||
}
|
||||
} elseif {[info exists p_arr(savecmd)] || [info exists p_arr(nxalias)]} {
|
||||
error_msg "/$hpath/$child must have both 'savecmd' and 'nxalias' properties\nThe actual property list for /$hpath/$child is [array get p_arr]"
|
||||
set ::errorInfo ""
|
||||
if [ catch {
|
||||
foreach child [hlist /$hpath] {
|
||||
array unset p_arr
|
||||
array set p_arr [::utility::hlistplainprop /$hpath/$child]
|
||||
if {[info exists p_arr(type)] && $p_arr(type) == "nxvgroup"} {
|
||||
return
|
||||
}
|
||||
::nexus::savetree $hpath/$child $pt
|
||||
}
|
||||
set data_type [lindex [split [hinfo /$hpath/$child] , ] 0]
|
||||
if {$p_arr(data) == true && $p_arr(nxsave) == true } {
|
||||
if {[info exists p_arr(savecmd)] && [info exists p_arr(nxalias)] } {
|
||||
if {[info exists p_arr(mutable)] && $p_arr(mutable) == "true" } {
|
||||
$p_arr(savecmd) $p_arr(sicsdev) $p_arr(nxalias) $data_type point $pt
|
||||
} else {
|
||||
$p_arr(savecmd) $p_arr(sicsdev) $p_arr(nxalias) $data_type
|
||||
}
|
||||
} elseif {[info exists p_arr(savecmd)] || [info exists p_arr(nxalias)]} {
|
||||
error_msg "/$hpath/$child must have both 'savecmd' and 'nxalias' properties\nThe actual property list for /$hpath/$child is [array get p_arr]"
|
||||
}
|
||||
::nexus::savetree $hpath/$child $pt
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
@@ -526,6 +624,7 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
# @see gen_nxdict
|
||||
proc ::nexus::_gen_nxdict {hpath dictPath name nxc} {
|
||||
variable nxdictionary
|
||||
if [ catch {
|
||||
if {[::utility::hgetplainprop /$hpath data] == "false"} {
|
||||
debug_msg "$hpath doesn't have a data property"
|
||||
return
|
||||
@@ -556,6 +655,10 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
set nxdictionary($alias) "$dictPath/NXVGROUP"
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
##
|
||||
@@ -566,15 +669,16 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
#
|
||||
# @param nexusdic Name of the nexus dictionary that will be created.
|
||||
# @return Full path to the nexus dictionary.
|
||||
proc ::nexus::gen_nxdict {nexusdic} {
|
||||
global cfPath
|
||||
variable nxdictionary
|
||||
set nxdict_path $cfPath(nexus)/$nexusdic
|
||||
proc ::nexus::gen_nxdict {nexusdic} {
|
||||
global cfPath
|
||||
variable nxdictionary
|
||||
if [ catch {
|
||||
set nxdict_path $cfPath(nexus)/$nexusdic
|
||||
array unset nxdictionary
|
||||
foreach hp [hlist /] {
|
||||
if {[::utility::hgetplainprop /$hp data] == true} {
|
||||
set nxclass [::utility::hgetplainprop /$hp klass]
|
||||
::nexus::_gen_nxdict $hp /entry1,NXentry $hp $nxclass
|
||||
::nexus::_gen_nxdict $hp /entry1,NXentry $hp $nxclass
|
||||
}
|
||||
}
|
||||
set fh [open $nxdict_path w]
|
||||
@@ -586,44 +690,57 @@ proc ::nexus::newfile {type {namestyle data}} {
|
||||
puts $fh "$n = $v"
|
||||
}
|
||||
close $fh
|
||||
return $nxdict_path
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
return $nxdict_path
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Set SICS object attributes which are required for creating nexus data files.
|
||||
proc ::nexus::set_sobj_attributes {} {
|
||||
# SICS commands
|
||||
sicslist setatt nxscript privilege internal
|
||||
# SICS data objects
|
||||
sicslist setatt nxscript_data privilege internal
|
||||
if [ catch {
|
||||
# SICS commands
|
||||
sicslist setatt nxscript privilege internal
|
||||
# SICS data objects
|
||||
sicslist setatt nxscript_data privilege internal
|
||||
|
||||
foreach sobj [lrange [sicslist type motor] 1 end] {
|
||||
sicslist setatt $sobj savecmd ::nexus::motor::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::motor::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type configurablevirtualmotor] {
|
||||
sicslist setatt $sobj savecmd ::nexus::motor::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::motor::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type histmem] {
|
||||
sicslist setatt $sobj savecmd ::nexus::histmem::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::histmem::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type sicsvariable] {
|
||||
sicslist setatt $sobj savecmd ::nexus::sicsvariable::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::sicsvariable::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type singlecounter] {
|
||||
sicslist setatt $sobj savecmd ::nexus::singlecounter::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::singlecounter::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type environment_controller] {
|
||||
sicslist setatt $sobj savecmd ::nexus::environment_controller::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::environment_controller::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist kind script] {
|
||||
sicslist setatt $sobj savecmd ::nexus::script::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::script::sdsinfo
|
||||
foreach sobj [lrange [sicslist type motor] 1 end] {
|
||||
sicslist setatt $sobj savecmd ::nexus::motor::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::motor::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type configurablevirtualmotor] {
|
||||
sicslist setatt $sobj savecmd ::nexus::motor::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::motor::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type histmem] {
|
||||
sicslist setatt $sobj savecmd ::nexus::histmem::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::histmem::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type sicsvariable] {
|
||||
sicslist setatt $sobj savecmd ::nexus::sicsvariable::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::sicsvariable::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type singlecounter] {
|
||||
sicslist setatt $sobj savecmd ::nexus::singlecounter::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::singlecounter::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist type environment_controller] {
|
||||
sicslist setatt $sobj savecmd ::nexus::environment_controller::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::environment_controller::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist kind script] {
|
||||
sicslist setatt $sobj savecmd ::nexus::script::save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::script::sdsinfo
|
||||
}
|
||||
foreach sobj [sicslist kind getset] {
|
||||
sicslist setatt $sobj savecmd ::nexus::macro::getset_save
|
||||
sicslist setatt $sobj sdsinfo ::nexus::macro::getset_sdsinfo
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
@@ -729,7 +846,41 @@ proc ::nexus::motor::sdsinfo {motor data_type args} {
|
||||
return " -type $dtype $units_att $name_att"
|
||||
}
|
||||
}
|
||||
##
|
||||
# @brief Save data from a 'getset macro'
|
||||
#
|
||||
# NOTE: Currently just saves floats
|
||||
namespace eval ::nexus::macro {}
|
||||
proc ::nexus::macro::getset_save {sobj nxalias data_type args} {
|
||||
if {[lindex $args 0] == "point"} {
|
||||
set index [lindex $args 1]
|
||||
nxscript_data clear
|
||||
nxscript_data putfloat 0 [getVal [$sobj] ]
|
||||
nxscript putslab $nxalias [list $index] [list 1] nxscript_data
|
||||
} else {
|
||||
nxscript putfloat $nxalias [SplitReply [$sobj]]
|
||||
}
|
||||
}
|
||||
|
||||
##
|
||||
# @brief Define the scientific data set path for the nexus dictionary.
|
||||
proc ::nexus::macro::getset_sdsinfo {sobj data_type args} {
|
||||
array set param $args
|
||||
array set attribute [attlist $sobj]
|
||||
set dtype [::nexus::hdb2nx_type $data_type]
|
||||
if {[info exists attribute(units)]} {
|
||||
set units_att " -attr {units,$attribute(units)} "
|
||||
} else {
|
||||
set units_att " "
|
||||
}
|
||||
set name_att " -attr {long_name,$attribute(long_name)} "
|
||||
if {$param(mutable) == true} {
|
||||
return " -type $dtype -rank 1 -dim {-1} $units_att $name_att"
|
||||
} else {
|
||||
return " -type $dtype $units_att $name_att"
|
||||
}
|
||||
}
|
||||
####
|
||||
proc ::nexus::environment_controller::save {evc nxalias data_type args} {
|
||||
if {[lindex $args 0] == "point"} {
|
||||
set index [lindex $args 1]
|
||||
@@ -806,30 +957,59 @@ proc ::nexus::singlecounter::sdsinfo {counter data_type args} {
|
||||
#
|
||||
# The macro must return a 1D associative array when called with -arrayname.
|
||||
proc ::nexus::script::save {script nxalias data_type args} {
|
||||
array set attribute [attlist $script]
|
||||
set darray [$script -arrayname]
|
||||
set size [array size $darray]
|
||||
set size [SplitReply [$darray used]]
|
||||
if {[lindex $args 0] == "point"} {
|
||||
set index [lindex $args 1]
|
||||
nxscript putslab $nxalias [list $index 0] [list 1 $size] $darray
|
||||
if [ catch {
|
||||
array set attribute [attlist $script]
|
||||
if {$attribute(klass) == "sensor"} {
|
||||
if {[lindex $args 0] == "point"} {
|
||||
set index [lindex $args 1]
|
||||
nxscript_data clear
|
||||
nxscript_data putfloat 0 [$script]
|
||||
nxscript putslab $nxalias [list $index] [list 1] nxscript_data
|
||||
} else {
|
||||
nxscript putfloat $nxalias [$script]
|
||||
}
|
||||
} else {
|
||||
nxscript putslab $nxalias [list 0] [list $size] $darray
|
||||
set darray [$script -arrayname]
|
||||
set size [array size $darray]
|
||||
set size [SplitReply [$darray used]]
|
||||
if {[lindex $args 0] == "point"} {
|
||||
set index [lindex $args 1]
|
||||
nxscript putslab $nxalias [list $index 0] [list 1 $size] $darray
|
||||
} else {
|
||||
nxscript putslab $nxalias [list 0] [list $size] $darray
|
||||
}
|
||||
if {[info exists attribute(units)]} {
|
||||
nxscript putattribute $nxalias units $attribute(units)
|
||||
}
|
||||
}
|
||||
if {[info exists attribute(units)]} {
|
||||
nxscript putattribute $nxalias units $attribute(units)
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
proc ::nexus::script::sdsinfo {script data_type args} {
|
||||
array set param $args
|
||||
set dtype [::nexus::hdb2nx_type $data_type]
|
||||
set darray [$script -arrayname]
|
||||
set size [SplitReply [$darray used]]
|
||||
if {$param(mutable) == true} {
|
||||
return " -type $dtype -rank 2 -dim {-1,$size}"
|
||||
} else {
|
||||
return " -type $dtype -rank 1 -dim {$size}"
|
||||
if [ catch {
|
||||
array set param $args
|
||||
set dtype [::nexus::hdb2nx_type $data_type]
|
||||
if {[getatt $script klass] == "sensor"} {
|
||||
if {$param(mutable) == true} {
|
||||
return " -type $dtype -rank 1 -dim {-1}"
|
||||
} else {
|
||||
return " -type $dtype"
|
||||
}
|
||||
} else {
|
||||
set darray [$script -arrayname]
|
||||
set size [SplitReply [$darray used]]
|
||||
if {$param(mutable) == true} {
|
||||
return " -type $dtype -rank 2 -dim {-1,$size}"
|
||||
} else {
|
||||
return " -type $dtype -rank 1 -dim {$size}"
|
||||
}
|
||||
}
|
||||
} message ] {
|
||||
if {$::errorCode=="NONE"} {return $message}
|
||||
return -code error $message
|
||||
}
|
||||
}
|
||||
|
||||
@@ -850,26 +1030,26 @@ foreach expt $::nexus::exports {
|
||||
|
||||
set tmpstr [string map {"$" ""} {$Name: not supported by cvs2svn $}]
|
||||
set nx_content_release_tag [lindex $tmpstr [expr [llength $tmpstr] - 1]]
|
||||
set tmpstr [string map {"$" ""} {$Revision: 1.35 $}]
|
||||
set tmpstr [string map {"$" ""} {$Revision: 1.36 $}]
|
||||
set nx_content_revision_num [lindex $tmpstr [expr [llength $tmpstr] - 1]]
|
||||
|
||||
namespace eval data {
|
||||
##
|
||||
# @brief Nexus data save command for gumtree control interface
|
||||
#
|
||||
# @param run_number This is the run or scan point number, it serves as the array
|
||||
# index for nexus data sets which correspond to mutable data
|
||||
command gumtree_save {int: run_number} {
|
||||
::nexus::save $run_number
|
||||
}
|
||||
sicslist setatt ::data::gumtree_save long_name save
|
||||
array set param [::data::gumtree_save -list param]
|
||||
::utility::mkData $param(run_number) run_number instrument privilege READ_ONLY mutable true control false
|
||||
command gumtree_type {text:nx.hdf,xml type} {
|
||||
SicsDataPostFix $type
|
||||
}
|
||||
sicslist set ::data::gumtree_type long_name file_format
|
||||
::data::gumtree_type -set type [SplitReply [SicsDataPostFix]]
|
||||
}
|
||||
#namespace eval data {
|
||||
# ##
|
||||
# # @brief Nexus data save command for gumtree control interface
|
||||
# #
|
||||
# # @param run_number This is the run or scan point number, it serves as the array
|
||||
# # index for nexus data sets which correspond to mutable data
|
||||
# command gumtree_save {int: run_number} {
|
||||
# ::nexus::save $run_number
|
||||
# }
|
||||
# sicslist setatt ::data::gumtree_save long_name save
|
||||
# array set param [::data::gumtree_save -list param]
|
||||
# ::utility::mkData $param(run_number) run_number instrument privilege READ_ONLY mutable true control false
|
||||
# command gumtree_type {text:nx.hdf,xml type} {
|
||||
# SicsDataPostFix $type
|
||||
# }
|
||||
# sicslist set ::data::gumtree_type long_name file_format
|
||||
# ::data::gumtree_type -set type [SplitReply [SicsDataPostFix]]
|
||||
#}
|
||||
|
||||
::nexus::init
|
||||
|
||||
Reference in New Issue
Block a user