# 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_save {nxobj entryname} { global dradius ndect angsep; set dim0 [SplitReply [hmm configure dim0]]; set dim1 [SplitReply [hmm configure dim1]]; putcommon $nxobj $entryname; putcrystal $nxobj; putmonitor $nxobj; putsample $nxobj; $nxobj putfloat detangle_degrees [SplitReply [detector_angle_deg]] # 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 makelink scandata dcounts $nxobj makelink scanvertaxis dvaxis } proc hmm_addnxscanentry {nxobj entryname scanVariable scanVarPos scanVarStep start_time} { $nxobj puttext estart $start_time $nxobj updatedictvar scan_variable $scanVariable 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 hmm_save $nxobj $entryname; $nxobj puttext eend [sicstime]; } #TODO Refactor: Add bm_save command and use it here. proc bm_addnxscanentry {nxobj entryname scanVariable scanVarPos scanVarStep start_time} { global dradius ndect angsep; $nxobj updatedictvar scan_variable $scanVariable; putcommon $nxobj $entryname putcrystal $nxobj putmonitor $nxobj putsample $nxobj set scanVar_value [string trim [lindex [split [$scanVariable] =] 1]] $nxobj updatedictvar scanvar_name $scanVariable #TODO $nxobj updatedictvar scanvar_units [SplitReply [$scanVariable units]] $nxobj updatedictvar scanvar_units "unknown" $nxobj updatedictvar scanvar_longname $scanVariable $nxobj putfloat scanvar $scanVar_value $nxobj putfloat scanstep $scanVarStep # 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 #TODO add dtype ddesc $nxobj puttext dlayout point $nxobj makelink scandata mdata $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} { $nxobj updatedictvar entryName $entryName $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