Files
sics/site_ansto/instrument/config/nexus/nxscripts_common_1.tcl
Ferdi Franceschini d958acecd8 Use hmm start, length, and long name variables to write instrument specific histogram data.
Writing of motor units and long name has been parameterized so that we can fetch this values from a motor object.
Scan variable is now written directly instead of linking to another entry.

r1680 | ffr | 2007-03-20 11:40:26 +1100 (Tue, 20 Mar 2007) | 4 lines
2012-11-15 13:08:11 +11:00

216 lines
7.3 KiB
Tcl

# TODO Return filename from nxcreatefile and call nxreopen nxclose etc
# with filename
MakeNXScript
proc getVal {msg} {
return [string trim [lindex [split $msg =] 1 ] ]
}
proc newFileName {} {
sicsdatanumber incr;
set idNum [SplitReply [sicsdatanumber]];
set dataPath [SplitReply [sicsdatapath]];
set prefix [SplitReply [sicsdataprefix]];
set postfix [SplitReply [sicsdatapostfix]];
set date_time_arr [split [sicstime] " "]
set isodate [lindex $date_time_arr 0];
set isotime [string map {: -} [lindex $date_time_arr 1]];
return [format "%s/%s_%sT%s_%05d%s" $dataPath $prefix $isodate $isotime $idNum $postfix];
}
proc nxcreatefile {nxdic {type nx.hdf}} {
global nxFileOpen cfPath nexusdic;
SicsDataPostFix .$type;
set nexusdic $nxdic
array set nxmode [list nx.hdf create5 h5 create5 nx5 create5 xml createxml];
dataFileName [newFileName]
nxscript $nxmode($type) [SplitReply [dataFileName]] $cfPath(nexus)/$nexusdic;
nxscript updatedictvar entryName sics_release
nxscript puttext sics_release [SplitReply [sics_release]]
set nxFileOpen true
}
proc nxreopenfile {} {
global nxFileOpen cfPath nexusdic;
nxscript reopen [SplitReply [dataFileName]] $cfPath(nexus)/$nexusdic;
set nxFileOpen true;
}
proc nxclosefile {} {
global nxFileOpen;
if {$nxFileOpen == true} {
nxscript close;
set nxFileOpen false;
set flist [split [SplitReply [dataFileName]] "/"];
set fname [lindex $flist [expr [llength $flist] - 1] ];
clientput "$fname updated" "event";
}
}
set dradius 1.25
set ndect 128
set tubedia 0.0254
set pi 3.1415926
set angsep 1.25
# stthmin = (180 - (1.25*127))/2
proc det_height_arr {active_height_mm row_zero dim0} {
global det_height
set hsep [expr $active_height_mm/($dim0-1)]
for {set i 0} {$i < $dim0} {incr i} {
set height [expr ($row_zero - $i) *$hsep]
set det_height($i) $height
}
}
proc hmm_addnxscanentry {nxobj entryname scanVariable scanVarPos scanVarStep start_time} {
global dradius ndect angsep;
set dim0 [SplitReply [hmm configure dim0]]
set dim1 [SplitReply [hmm configure dim1]]
putcommon $nxobj $entryname $scanVariable
putcrystal $nxobj
putmonitor $nxobj
putsample $nxobj
set scanVar_value [string trim [lindex [split [$scanVariable] =] 1]]
$nxobj updatedictvar scanvar_name $scanVariable
$nxobj updatedictvar scanvar_units [SplitReply [$scanVariable units]]
$nxobj updatedictvar scanvar_longname $scanVariable
$nxobj putfloat scanvar $scanVar_value
$nxobj putfloat scanstep $scanVarStep
$nxobj putfloat detangle_degrees [SplitReply [detector_angle_deg]]
$nxobj puttext estart $start_time
# putpolar_angle $nxobj $dim0 $dim1
put_det_height_arr $nxobj $dim0
$nxobj puttext dtype [SplitReply [detector_type]]
$nxobj puttext ddesc [SplitReply [detector_description]]
$nxobj putfloat dradius [SplitReply [detector_radius_mm]]
$nxobj puttext dlayout area
$nxobj puthm dcounts hmm [SplitReply [hmm_start]] [SplitReply [hmm_length]] [SplitReply [hmm_bank]]
#$nxobj puthm deff hmm
$nxobj makelink scandata dcounts
$nxobj makelink scanvertaxis dvaxis
# $nxobj makelink scandata dtheta
# $nxobj makelink scanvar $scanVariable
$nxobj puttext eend [sicstime];
}
proc bm_addnxscanentry {nxobj entryname scanVariable scanVarPos scanVarStep start_time} {
global dradius ndect angsep;
putcommon $nxobj $entryname $scanVariable
putcrystal $nxobj
putmonitor $nxobj
putsample $nxobj
set scanVar_value [string trim [lindex [split [$scanVariable] =] 1]]
$nxobj putfloat $scanVariable $scanVar_value
# Add thetamin and stth to tharr(i)
# $nxobj puttext dtype He-3 position sensitive detector, tube active length=335+/-5mm, tube diameter=25.4 +/- 0.8mm
# $nxobj puttext ddesc 128 He-3 proportional counter detector tubes (GE Energy Reuter Stokes Inc. item=RS-P4-0814-217)
# $nxobj putfloat dradius $dradius
$nxobj puttext estart $start_time
$nxobj puttext dlayout point
$nxobj makelink scandata mdata
$nxobj makelink scanvar $scanVariable
$nxobj putfloat scanstep $scanVarStep
$nxobj puttext eend [sicstime];
}
proc putmonitor {nxobj} {
$nxobj puttext mmode [string trim [lindex [split [bm getmode] =] 1]]
$nxobj putfloat mpreset [string trim [lindex [split [bm getpreset] =] 1]]
$nxobj putint mdata [string trim [lindex [split [bm getcounts] =] 1]]
$nxobj putfloat mdistance [SplitReply [bmon_distance]]
}
proc put_det_height_arr {nxobj dim0} {
global det_height
set det_active_ht_mm [SplitReply [detector_active_height_mm]]
set row_zero [ SplitReply [detector_zero_row]]
det_height_arr $det_active_ht_mm $row_zero $dim0
$nxobj putarray dvaxis det_height $dim0
}
proc putpolar_angle {nxobj dim0 dim1} {
global det_height
set det_radius_mm [SplitReply [detector_radius_mm]]
set det_angle_rad [SplitReply [detector_angle_rad]]
set det_active_ht_mm [SplitReply [detector_active_height_mm]]
set det_rot_rad [ expr [SplitReply [stth]]/[SplitReply [deg_per_rad]] ]
set row_zero [ SplitReply [detector_zero_row]]
set row_offset [ SplitReply [detector_ROI_row_offset]]
set col_zero [ SplitReply [detector_zero_col]]
set col_offset [ SplitReply [detector_ROI_col_offset]]
set angsep [expr $det_angle_rad / ($dim1-1)]
$nxobj putpolararray dtheta $det_radius_mm $angsep $det_active_ht_mm $det_rot_rad $row_zero $row_offset $col_zero $col_offset $dim0 $dim1
}
proc putsample {nxobj} {
$nxobj puttext saname [getVal [Sample]]
}
proc putcrystal {nxobj} {
$nxobj puttext ctype [SplitReply [crystal_type]]
$nxobj putfloat clambda [SplitReply [crystal_wavelength_A]]
}
proc putcommon {nxobj entryName scanVariable} {
$nxobj updatedictvar entryName $entryName
$nxobj updatedictvar scan_variable $scanVariable
$nxobj puttext etitle [getVal [Title]]
$nxobj puttext iname [getVal [Instrument]]
$nxobj puttext username [SplitReply [user]]
$nxobj puttext useremail [SplitReply [email]]
$nxobj puttext userphone [SplitReply [phone]]
# NXsource
$nxobj puttext sname OPAL
$nxobj puttext stype Reactor Neutron Source
$nxobj puttext sprobe Neutron
putsamplemotors $nxobj
putslitmotors $nxobj
putmonomotors $nxobj
}
proc putsamplemotors {nxobj} {
foreach motor { som schi sphi sx sy stth } {
$nxobj updatedictvar mot_name $motor;
$nxobj updatedictvar mot_long_name $motor;
$nxobj updatedictvar mot_units [SplitReply [$motor units]];
$nxobj putfloat nxsample_mot [getVal [$motor] ];
}
# sth is a virtual motor
$nxobj putfloat sth [getVal [sth ]];
}
proc putmonomotors {nxobj} {
foreach motor { mom mchi mphi mx my mtth } {
$nxobj updatedictvar mot_name $motor;
$nxobj updatedictvar mot_long_name $motor;
$nxobj updatedictvar mot_units [SplitReply [$motor units]];
$nxobj putfloat nxcrystal_mot [getVal [$motor] ];
}
# mth is a virtual motor
$nxobj putfloat mth [getVal [mth ]];
}
proc putslitmotors {nxobj} {
foreach motor {ss1u ss1d ss1l ss1r ss2u ss2d ss2l ss2r } {
$nxobj updatedictvar mot_name $motor;
$nxobj updatedictvar mot_long_name $motor;
$nxobj updatedictvar mot_units [SplitReply [$motor units]];
$nxobj putfloat nxfilter_mot [getVal [$motor] ];
}
foreach motor {ss1vg ss1vo ss1hg ss1ho ss2vg ss2vo ss2hg ss2ho } {
$nxobj putfloat $motor [getVal [$motor] ];
}
}
publish nxcreatefile user
publish addnxscanentry user
publish bm_addnxscanentry user