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 isodate [lindex [split [sicstime] " "] 0]; return [format "%s/%s_%s_%s%s" $dataPath $prefix $isodate $idNum $postfix]; } proc nxcreatefile {{type nx.hdf}} { global dataFileName nxFileOpen cfPath; SicsDataPostFix .$type; array set nxmode [list nx.hdf create5 h5 create5 nx5 create5 xml createxml]; set dataFileName [newFileName] nxscript $nxmode($type) $dataFileName $cfPath(nexus)/nexus.dic; set nxFileOpen true } proc nxreopenfile {} { global dataFileName nxFileOpen cfPath; nxscript reopen $dataFileName $cfPath(nexus)/nexus.dic; set nxFileOpen true; } proc nxclosefile {} { global dataFileName nxFileOpen; if {$nxFileOpen == true} { nxscript close; set nxFileOpen false; set flist [split $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 polar_angle {dradius det_angle active_length zi zj det_rot y_offset dim0 dim1} { global tharr set angsep [expr $det_angle / ($dim1-1)] set ysep [expr $active_length/($dim0-1)] set imid [expr ($dim0 -1 )/2.0] set jmid [expr ($dim1 -1 )/2.0] for {set i 0} {$i < $dim0} {incr i} { set height [expr $y_offset - ($i - $imid)*$ysep] for {set j 0} {$j < $dim1} {incr j} { set alpha [expr $det_rot - ($j - $jmid)*$angsep] set pang [expr acos($dradius * cos($alpha)/sqrt($dradius*$dradius + $height*$height))] set tharr([expr $i*$dim1+$j]) $pang } } } proc addnxentry {nxobj entryname scanVariable scanVarPos scanVarStep} { 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 putfloat $scanVariable $scanVar_value putpolar_angle $nxobj $dim0 $dim1 $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 dlayout area $nxobj puthm dcounts hmm $nxobj puthm deff hmm $nxobj makelink scandata dcounts $nxobj makelink scandata dtheta $nxobj makelink scanvar $scanVariable $nxobj putfloat scanstep $scanVarStep } proc bm_addnxentry {nxobj entryname scanVariable scanVarPos scanVarStep} { global dradius ndect angsep; putcommon $nxobj $entryname $scanVariable putcrystal $nxobj # Add thetamin and stth to tharr(i) # set sampletwotheta [string trim [lindex [split [stth] =] 1]] # for {set i 0} {$i < $ndect} {incr i} { # set tharr($i) [expr ($i-63.5)*$angsep + $sampletwotheta] # } # $nxobj updatedictvar thetadim $ndect # $nxobj putarray dtheta tharr $ndect 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 dlayout point $nxobj makelink scandata mdata $nxobj makelink scanvar $scanVariable $nxobj putfloat scanstep $scanVarStep } 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 [getVal [sics_bm_distance]] } proc putpolar_angle {nxobj dim0 dim1} { global tharr 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 det_zxp [ SplitReply [detector_zero_xpixel]] set det_zyp [ SplitReply [detector_zero_ypixel]] polar_angle $det_radius_mm $det_angle_rad $det_active_ht_mm $det_zxp $det_zyp $det_rot_rad 0 $dim0 $dim1 $nxobj updatedictvar padim0 $dim0 $nxobj updatedictvar padim1 $dim1 $nxobj putgenarray dtheta tharr [expr $dim0 * $dim1] } proc putsample {nxobj} { $nxobj puttext saname [getVal [Sample]] } proc putcrystal {nxobj} { $nxobj puttext ctype [sics_mono_crystal] } proc putcommon {nxobj entryName scanVariable} { $nxobj updatedictvar entryName $entryName $nxobj updatedictvar scan_variable $scanVariable $nxobj puttext etitle [getVal [Title]] $nxobj puttext iname [getVal [Instrument]] # 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 sth } { $nxobj putfloat $motor [getVal [$motor] ]; } } proc putmonomotors {nxobj} { foreach motor { mom mchi mphi mx my mtth mth } { $nxobj putfloat $motor [getVal [$motor] ]; } } proc putslitmotors {nxobj} { foreach motor {ss1u ss1d ss1l ss1r ss1vg ss1vo ss1hg ss1ho ss2u ss2d ss2l ss2r ss2vg ss2vo ss2hg ss2ho } { $nxobj putfloat $motor [getVal [$motor] ]; } } publish nxcreatefile user publish addnxentry user publish bm_addnxentry user