Modifications for new util, config directory structure.

r1498 | ffr | 2007-02-16 16:43:59 +1100 (Fri, 16 Feb 2007) | 2 lines
This commit is contained in:
Ferdi Franceschini
2007-02-16 16:43:59 +11:00
committed by Douglas Clowes
parent 4654c4c9c7
commit d5cde7c4f6
13 changed files with 2145 additions and 0 deletions

View File

@@ -0,0 +1 @@
MakeCounter counter SIM -0.5

View File

@@ -0,0 +1,63 @@
# Defines hashes which map SICS device object names to hipadaba paths
InstallHdb
hmake /graphics spy none
hsetprop /graphics type graphset
hmake /commands spy none
hsetprop /commands type commandset
#TODO change this to hparts.tcl
source $cfPath(hipadaba)/hpaths.tcl
set instrument echidna
hmake /$instrument spy none
hsetprop /$instrument type instrument
# Generate hipadaba nodes for the paths in the hpaths file
foreach hp $hpaths {
hmake /$instrument/$hp spy none;
hsetprop /$instrument/$hp type part;
}
#--- admin
hattach /$instrument title title
hattach /$instrument/experiment sample description
hmake /$instrument/user spy none
hsetprop /$instrument/user type part
hattach /$instrument/user user name
hattach /$instrument/user email email
hattach /$instrument/user phone phone
#--- Motors
foreach {obj name part} $motor_hpath {
hattach /$instrument/$part $obj $name
#TODO Only ignore node deletion errors for simulated motors
if [ catch {hdel /$instrument/$part/$name/axis} ] {}
if [ catch {hdel /$instrument/$part/$name/units} ] {}
}
#--- Configurable Virtual Motors
foreach {obj name part master_obj} $cvirtmotor_hpath {
set path /$instrument/$part
# hattach /$instrument/$part $obj $name
hattach $path $obj $name
hchain $path/$name $path/$master_obj
}
#------------- scan command
hsetprop /commands type part
hcommand /commands/scan hdb_hmscan
hsetprop /commands/scan type command
hsetprop /commands/scan priv user
hmake /commands/scan/scan_variable user text
hsetprop /commands/scan/scan_variable argtype drivable
hmake /commands/scan/scan_start user float
hsetprop /commands/scan/scan_start argtype float
hmake /commands/scan/scan_increment user float
hsetprop /commands/scan/scan_increment argtype float
hmake /commands/scan/NP user int
hsetprop /commands/scan/NP argtype int
hmake /commands/scan/mode user text
hsetprop /commands/scan/mode argtype text
hsetprop /commands/scan/mode values monitor,timer
hmake /commands/scan/preset user float
hsetprop /commands/scan/preset argtype float

View File

@@ -0,0 +1,48 @@
set hpaths [list \
experiment sample monochromator slits \
slits/1 slits/2 detector detector/monitor detector/histmem ]
# Maps devices (eg motors) to hipadaba paths.
# obj name path
set motor_hpath [list \
ss1u top /slits/1 \
ss1d bottom /slits/1 \
ss1l left /slits/1 \
ss1r right /slits/1 \
ss2u ss2u /slits/2 \
ss2d ss2d /slits/2 \
ss2l ss2l /slits/2 \
ss2r ss2r /slits/2 \
som rotate /sample \
schi chi /sample \
sphi phi /sample \
sx translate_x /sample \
sy translate_y /sample \
stth detector_rotate /sample \
pcx pcx /monochromator \
pcr pcr /monochromator \
mom mom /monochromator \
mchi mchi /monochromator \
mphi mphi /monochromator \
mx mx /monochromator \
my my /monochromator \
mtth mtth /monochromator ]
# Configurable virtual motors
# obj name path master_obj
set cvirtmotor_hpath [list \
ss1vg ss1vg /slits/1 top\
ss1vo ss1vo /slits/1 top\
ss1hg ss1hg /slits/1 right\
ss1ho ss1ho /slits/1 right\
ss2vg ss2vg /slits/2 ss2u\
ss2vo ss2vo /slits/2 ss2u\
ss2hg ss2hg /slits/2 ss2r\
ss2ho ss2ho /slits/2 ss2r\
sth sth /sample detector_rotate\
mth mth /monochromator mtth]
array set counter_hpath [ list \
hm hm /detector/histmem \
counter counter /detector/monitor ]

View File

@@ -0,0 +1,226 @@
<?xml version = '1.0' encoding = 'UTF-8'?>
<anstohm filler="ansto1" >
<DIR defaultpath="/srv/www/htdocs" />
<FAT_ECHO filenameext="xml" filenamepre="FAT" />
<BAT_ECHO filenameext="xml" filenamepre="BAT" />
<OAT_ECHO filenameext="xml" filenamepre="OAT" />
<CAT_ECHO filenameext="xml" filenamepre="CAT" />
<RAW filenameext="txt" filenamepre="RAW" />
<EVT filenameext="txt" filenamepre="EVT" />
<HDS filenameext="xml" filenamepre="HDS" />
<HDD filenameext="xml" filenamepre="HDD" />
<DAT filenameext_XML="xml" filenameext_CSV="csv" filenamepre="DAT" />
<!-- Initial version MJL 6/06 -->
<FAT
DATASET_SOURCE="INTERNAL"
FRAME_SOURCE="EXTERNAL"
VETO1="ENABLE" VETO2="DISABLE" VETO3="DISABLE" VETO4="DISABLE"
MONITOR1="ENABLE" MONITOR2="DISABLE" MONITOR3="DISABLE"
FRAME_FREQUENCY="50.00"
FRAME_DUTYCYCLE="99"
CLOCK_SCALE="1000"
NOS_PERIODS="10"
SIZE_PERIOD="65536"
COUNT_METHOD="COUNT"
COUNT_SIZE="3000000000"
COUNT_STOP="IMMEDIATE"
EXPAND_OAT_X="0"
EXPAND_OAT_Y="0"
EXPAND_OAT_T="0"
OFFSET_OAT_X="0"
OFFSET_OAT_Y="0"
OFFSET_OAT_T="0"
HISTOGRAM_WEIGHT="1"
HISTOGRAM_MODE="XYT"
RATE_MAPPING="DISABLE"
TOTAL_HISTOGRAMS="ENABLE"
TEST_HISTOGRAMS="ENABLE"
TEST_HISTO_1D_SIZES="1024"
TEST_HISTO_2D_SIZES="1024"
DATA_MINMAX="ENABLE"
DATA_STREAMING="ENABLE"
LOG_RAW="DISABLE"
LOG_EVT="DISABLE"
MULTIPLE_DATASETS="ENABLE"
VIEW_TYPE="xymap"
VIEW_COLOUR_TABLE="RAIN"
VIEW_SCALING_TYPE="LOG"
VIEW_LOG_SCALING_RANGE="2"
VIEW_ROOT_SCALING_RANGE="2"
VIEW_ROI_XMIN="0"
VIEW_ROI_XMAX="127"
VIEW_ROI_YMIN="0"
VIEW_ROI_YMAX="511"
VIEW_ROI_1DMIN="-1"
VIEW_ROI_1DMAX="-1"
VIEW_MAG_X="4"
VIEW_MAG_Y="1"
VIEW_MAG_1D="1"
VIEW_INTERP_X="1"
VIEW_INTERP_Y="1"
VIEW_HISTO_PERIOD="-2"
VIEW_HISTO_OAT_T_BIN="-1"
VIEW_AUTO_REFRESH="0"
SIMULATED_EVENT_PATTERN="DISABLE"
SIMULATED_EVENT_X0="0"
SIMULATED_EVENT_X1="127"
SIMULATED_EVENT_Y0="0"
SIMULATED_EVENT_Y1="511"
SIMULATED_EVENT_T0="0"
SIMULATED_EVENT_T1="19999999"
SIMULATED_EVENTS_PER_FRAME="10000"
SIMULATED_FRAMES_PER_CYCLE="5000"
SIMULATED_PARAM_K1="0.9"
P7888_PLL_SYNC_METHOD="USING_DUPLICATED_ANODE_PULSE_INPUT"
MESYTEC_MCPD2_IP="192.168.168.121"
MESYTEC_MCPD2_LAST_IP="192.168.168.122"
MESYTEC_USING_PAIRED_TUBES="YES"
MESYTEC_TUBE_PAIR_LEN="960"
MESYTEC_PULSER="DISABLE"
> <!-- MESYTEC_TUBE_PAIR_LEN = 960 spans full range of observed position data -->
</FAT>
<!-- Initial version MJL 6/06 -->
<BAT NO_BAT_ENTRIES="1" NO_BAT_PERIODS="1" NO_REPEAT_ENTRY="1" NO_REPEAT_TABLE="0" NO_EXECUTE_TABLE="0" >
0
</BAT>
<!-- Initial version MJL 6/06 -->
<OAT NO_OAT_X_CHANNELS="128" NO_OAT_Y_CHANNELS="512" NO_OAT_T_CHANNELS="1">
<X>
127.5 126.5
</X>
<Y>
-0.5 0.5
</Y>
<T>
0 200000
</T>
</OAT>
<!-- Initial version MJL 6/06 -->
<CAT>
<MESYTEC_MPSD8_CHANNEL_GAINS>
<!-- MPSD8 gain per channel, settable in range 0.50 - 1.88 -->
<!-- MPSD8 #0 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #1 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #2 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #3 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #4 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #5 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #6 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #7 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #8 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #9 --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #A --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #B --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #C --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #D --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #E --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
<!-- MPSD8 #F --> 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
</MESYTEC_MPSD8_CHANNEL_GAINS>
<MESYTEC_MPSD8_THRESHOLDS>
<!-- MPSD8 thresholds per unit, settable in range 5% - 50% -->
<!-- MPSD8 #0 --> 6
<!-- MPSD8 #1 --> 6
<!-- MPSD8 #2 --> 6
<!-- MPSD8 #3 --> 6
<!-- MPSD8 #4 --> 6
<!-- MPSD8 #5 --> 6
<!-- MPSD8 #6 --> 6
<!-- MPSD8 #7 --> 6
<!-- MPSD8 #8 --> 6
<!-- MPSD8 #9 --> 6
<!-- MPSD8 #A --> 6
<!-- MPSD8 #B --> 6
<!-- MPSD8 #C --> 6
<!-- MPSD8 #D --> 6
<!-- MPSD8 #E --> 6
<!-- MPSD8 #F --> 6
</MESYTEC_MPSD8_THRESHOLDS>
<MESYTEC_TUBE_PAIR_RESISTANCE_RATIOS>
<!-- Resistance ratio R1/R0 per Mesytec tube pair -->
<!-- Set entry to 0. where single tubes are used. -->
<!-- MPSD8 #0 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #1 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #2 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #3 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #4 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #5 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #6 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #7 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #8 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #9 --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #A --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #B --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #C --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #D --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #E --> 1. 1. 1. 1. 1. 1. 1. 1.
<!-- MPSD8 #F --> 1. 1. 1. 1. 1. 1. 1. 1.
</MESYTEC_TUBE_PAIR_RESISTANCE_RATIOS>
<MESYTEC_TUBE_MAGNIFICATIONS>
<!-- Magnification factors for Mesytec position readings, per tube. -->
<!-- Default value 1. -->
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
</MESYTEC_TUBE_MAGNIFICATIONS>
<MESYTEC_TUBE_OFFSETS>
<!-- Offset factors to be added to Mesytec position readings, per tube. -->
<!-- Default value 0. -->
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
</MESYTEC_TUBE_OFFSETS>
<MESYTEC_MPSD8_TUBE_HISTOGRAM_WEIGHTS>
<!-- MPSD8 histogram weights, per tube. -->
<!-- Use positive integer values in this table, default value 100 suggested. -->
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
</MESYTEC_MPSD8_TUBE_HISTOGRAM_WEIGHTS>
</CAT>
</anstohm>

View File

@@ -0,0 +1,398 @@
# $Revision: 1.1 $
# $Date: 2007-02-16 05:43:59 $
# Author: Mark Lesha (mle@ansto.gov.au)
# Last revision by: $Author: ffr $
#-------------------------------------------------------------------------
# System: Histogram Server (sample)
#------------------------------------------------------------------------
##############################################
# Creating the histogram memories in SICS
##############################################
# Make a histogram memory object hmm, allows control of the
# remote histogram server via http, and acquisition
# of histogram period data.
MakeHM hmm anstohttp
hmm configure hmaddress http://das1-echidna:8080
hmm configure username spy
hmm configure password 007
hmm configure hmDataPath ../HMData
##############################################
# Configuring the histogram server
##############################################
# Procedure to read a single config (or any) file, return content as a string.
proc returnconfigfile {filename} {
set fh [open $filename]
set xml [read $fh]
#set xml [list [read $fh]]
clientput $xml value
close $fh
return $xml
}
Publish returnconfigfile User
# Configure to upload a complete configuration to the histogram server.
# In this case it's the main config file plus the FAT, BAT and OAT files
# in the same direcory as the SICS executable (for this example).
# Alternatives:
# - A partial config could be uploaded instead - e.g. just the main config file,
# in that case the main config file points to a set of FAT, BAT OAT files
# located on the server.
# - The histogram server could configure itself from a config file set
# kept on the local file system (not automated presently, manual control only)
# - Or, no configuration at all could be uploaded, the
# histogram server can configure itself using its default config files.
hmm configure hmconfigscript "returnconfigfile $cfPath(hmm)/anstohm_full.xml"
# Initialize the histogram server.
# This call to hmm init (with init 1 configured) causes the histogram server
# to be loaded with the specified configuration files. Subsequent inits (with init 0 configured)
# only cause specific histogram server FAT settings to be updated.
# If the histogram server's default configfiles are adequate, the init 1 stage can be skipped.
# Before configuring, make sure the server is stopped, since configuration
# during DAQ is not allowed. This requires init of the hmm object to level 0.
#
# Making sure the histogram server is stopped, so we can load configuration.
hmm configure init 0
hmm init
hmm stop
# Load the configuration to the histogram server.
hmm configure init 1
hmm init
# Restore the init level to 0, subesquent inits will only upload specified FAT settings to histogram server.
hmm configure init 0
##############################################
# Configuring the histogram memories in SICS
##############################################
# Now issue stop to the server.
# This not only makes sure it's stopped, but lets us see certain configuration variables
# which get placed in the dictionary as part of the status checking done during the stop.
hmm stop
# Here, define a function to let us read back the value of dictionary items from the hmm
# such as OAT dimensions.
proc hmmdictitemval {histomem dictitem} {
set resp [$histomem configure $dictitem]
set retn [lindex [split $resp " "] 2]
return $retn
}
# Configure histogram dimensions, mode, etc. using the dictionary variables.
# For the dimensions, set the 'effective' OAT dimensions which are the
# histogram period dimensions. Do an init after to cause memory to be allocated.
hmm configure histmode transparent
hmm configure bank 0
hmm configure rank 3
hmm configure dim0 [hmmdictitemval hmm oat_nyc_eff]
hmm configure dim1 [hmmdictitemval hmm oat_nxc_eff]
hmm configure dim2 [hmmdictitemval hmm oat_ntc_eff]
hmm init
##############################################
# Create beam monitor counter
# and histogram memory control object
# (ANSTO customized versions)
##############################################
# Make and configure an ANSTO beam monitor counter.
MakeCounter bm anstomonitor [ params host "das1-echidna" port "30000" ]
bm SetExponent 0
# Make our special HMControl_ANSTO object with the bm controlling the hmm.
# This version can pause the histogram server after the count expires
# instead of just stopping it, so we can generate multiple datasets
# during a scan, or overlap data acquired at different scan stations.
# It can also terminate either on the counter or any of the histogram objects.
MakeHMControl_ANSTO hmc bm hmm
##############################################
# Creating scans and creating/attaching
# associated objects such as motors to drive,
# extra counters etc.
##############################################
#
# Define two scan objects which use the beam monitor counter.
#
# For hmscan, the hmc object uses the bm counter to control
# acquisition duration. In other words, the acquisition duration
# is controlled via SICS. This is fine if the duration doesn't
# need to be controlled to an accuracy of less than one second.
# The bm only allows control of acquisition duration based on
# elapsed time or number of monitor counts.
#
# For scan2, the histogram server controls acquisition duration.
# In addition to time or monitor count based termination conditions,
# the histogram server can be configured to terminate after a
# specific number of frames or periods have elapsed, or can be
# terminated in response to an external dataset signal.
# The accuracy of control of the acquisition duration is much higher
# (milliseconds versus hundreds of milliseconds).
# Also, the histogram server can be configured to extend acquisition
# so that only whole frames or periods are acquired.
# Termination condition is normally already configured via
# the histogram server's configuration files.
# If a static termination condition is already configured,
# scan2_runa can be called, with no termination condition required.
# But if the SICS user wants to dynamically commit the termination
# condition configuration to the histogram server,
# a wrapper function scan2_runb should be called instead.
# This allows the termination condition configuration to be written to
# the histogram server dynamically, under the control of SICS.
# The histogram server has a wider range of options for
# termination condition, and there are three termination condition
# arguments instead of the usual two for SICS counter objects.
#
# In both cases, we make the bm the master counter for the scan,
# so that bm statistics are acquired during the scan.
#
# 17/11/06 NOTE: The Beam Monitor is not yet interfaced directly to the
# Histogram Server. This means that for BM-controlled acquisitions,
# SICS needs to use the BM counter (i.e. use hmscan not scan2).
#
# EXAMPLES: For scan running over 5 stops and acquisition of 1 sec at each stop:
# hmscan run 5 timer 1 (termination controlled by the beam monitor)
# scan2_runb 5 TIME 100 IMMEDIATE (termination controlled by the histogram server)
#
MakeScanCommand hmscan bm $cfPath(scan)/echidna.hdd recover.bin
MakeScanCommand scan2 bm $cfPath(scan)/echidna.hdd recover.bin
#
# Call is: scan2_runa <n>
proc scan2_runa {n} {
# The termination condition is ignored, because the
# histogram server controls the acquisition duration
# directly in this case.
scan2 run $n timer 0
}
Publish scan2_runa User
#
# Call is: scan2_runb <n>
proc scan2_runb {n count_method count_size count_stop} {
# Commit the termination conditions to the histogram server.
# hmm configure stores the values in the dictionary,
# then hmm init causes them to be sent to the histogram server.
# We just 'assume' they are successfully written.
hmm configure FAT_COUNT_METHOD $count_method
hmm configure FAT_COUNT_SIZE $count_size
hmm configure FAT_COUNT_STOP $count_stop
hmm init
# The termination condition is ignored, because the
# histogram server controls the acquisition duration
# directly in this case. So, use 'timer 0' here.
scan2 run $n timer 0
}
Publish scan2_runb User
# Simulated counter. No error rate. Required for technical reasons...
# This counter is used only to block execution till the bm count is actually reached,
# for the scan example using hmc and bm objects to control the acquisition duration from SICS.
MakeCounter blockctr SIM -1.0
blockctr SetExponent 0
blockctr SetMode timer
blockctr SetPreset 0
# Later on we can add some motors to drive...
#Motor som2 ASIM 0 100 -1.0 0.01
#hmscan add som2 0 1
##############################################
# Support for using expanded histogram period
# to create interlaced/overlapped histograms
##############################################
# Define an OAT offset variable to use with both scans:
# It is possible to effectively offset the histogram filler's
# OAT table by an arbitrary amount. For overlapped data acquisitions, we can
# configure an oversized histogram period using the EXPAND_OAT parameters
# in the FAT. Then at each scan stop, before acqisition commences the offset
# can be adjusted using the OFFSET_OAT paramters of the FAT. By progressively
# stepping the OFFSET_OAT, an overlapped image can be built up.
# The global variable oatoffset is defined for this purpose.
# During the scan, this variable is incremented and can be passed
# in to an argument of set_oat_offset to provide progressively
# increasing offset, producing an overlapped histogram.
#
global oatoffset
#
#Function to apply OAT offsets to the histogram server.
proc set_oat_offset {oatoff_x oatoff_y oatoff_t} {
hmm configure FAT_OFFSET_OAT_X $oatoff_x
hmm configure FAT_OFFSET_OAT_Y $oatoff_y
hmm configure FAT_OFFSET_OAT_T $oatoff_t
hmm init
return
}
Publish set_oat_offset User
##############################################
# Support for data acquisition
##############################################
# A simple procedure to read the histogram data through SICS
# and dump the data to a numbered file.
proc savehistodata {histomem filename} {
set fh [open $filename "w"]
# To get the whole memory, we don't need to specify the start or end arguments.
# But we need to specify the bank number, this sets the type of data to be read.
#
set histodata [$histomem get [hmmdictitemval $histomem bank]]
# clientput $histodata value
puts -nonewline $fh $histodata
close $fh
return
}
##############################################
##############################################
## Scan Callback Procedures ##
##############################################
##############################################
# The prepare callback gets called at the start of the scan.
# We use it to pause the histogram server, in order to commence the DAQ.
# This 'primes' the DAE also (i.e. device drivers reboot the hardware,
# buffering processes are started, etc.)
proc hs_prepare {scanobjectname userobjectname} {
#clientput "Enter prepare" value
#
# Before configuring the bm, do a short count.
# This will cause the counter to reconnect if it needs to...
bm count 0 timer
# Now configure the beam monitor counter for better performance.
# (Set a high counter sample rate to get better accuracy).
bm send set scan=1
bm send set sample=1000
# Make sure the histogram server is stopped, this guarantees DAQ not in progress already.
hmm stop
# Zero the OAT offsets (whether used or not).
global oatoffset
set oatoffset 0
set_oat_offset 0 0 0
#
stdscan prepare $scanobjectname $userobjectname
#clientput "hmm pause being done..." value
# Pause the histogram server, this primes the DAE for acqisition.
hmm pause
#clientput "Exit prepare" value
return
}
Publish hs_prepare User
# The count_bm_controlled callback gets called at the start of dataset acquisition.
# We use it to perform the dataset acquisition, via the hmc object.
# Note we do NOT call stdscan count, since we don't need to run the bm counter twice.
proc hs_count_bm_controlled {scanobjectname userobjectname point mode preset} {
#clientput "Enter count" value
#stdscan count $scanobjectname $userobjectname $point $mode $preset
# Start the acquisition, runs till the beam monitor terminates
# and then enter paused mode (we have added fifth argument to allow this).
# In fact, execution proceeds immediately (the hmc call doesn't block).
hmc start $preset $mode pause
# Now call the simulated counter. This will cause execution to block
# till the hmc acquisition actually finishes. Otherwise, execution will
# charge on regardless and the finish callback function gets called
# before the last dataset acquisition has finished!
blockctr count 0
#clientput "Exit count" value
return
}
Publish hs_count_bm_controlled User
# The count_hs_controlled callback gets called at the start of dataset acquisition.
# We use it to perform the dataset acquisition, controlled by the histogram server.
# Note we do NOT call stdscan count, since we don't need to run the bm counter twice.
proc hs_count_hs_controlled {scanobjectname userobjectname point mode preset} {
#clientput "Enter count" value
#stdscan count $scanobjectname $userobjectname $point $mode $preset
# Start the acquisition, runs till the histogram server auto-terminates.
# This is done by specifying the termination object to be the histogram server,
# not the counter object (place a 1 in 6th argument to hmc object).
# The termination condition for the bm counter is just set to a large time period.
# After the acquisition terminates, the beam monitor therefore has the correct
# status reading and the 'Monitor' entry in the scan data table will be correct.
hmc start 1000000000 timer pause 1
# Now call the simulated counter. This will cause execution to block
# till the hmc acquisition actually finishes. Otherwise, execution will
# charge on regardless and the finish callback function gets called
# before the last dataset acquisition has finished!
blockctr count 0
#clientput "Exit count" value
return
}
Publish hs_count_hs_controlled User
# The collect callback gets called at the end of the dataset acquisition.
# We can put stuff here to retrieve data collected at each scan point,
# and set up OAT offsets or other parameters that might need to be varied
# from point to point at the histogram server, ready for the next scan point.
# In this example, an increasing oatoffset variable is used to configure
# the histogram server's OAT offset in the x direction, to produce
# an overlapped histogram period acquisition.
# Other things might be done here including adjustment of termination
# condition based on beam monitor count.
# Code for adjusting ancillaries, moving secondary motion stages etc. etc.
# from point to point should probably be put into a drive callback function
# (but not in this example script).
proc hs_collect {scanobjectname userobjectname point} {
#clientput "Enter collect" value
set rslt [stdscan collect $scanobjectname $userobjectname $point]
# Apply an OAT offset in the x direction (e.g. along tube number axis).
global oatoffset
incr oatoffset
set_oat_offset $oatoffset 0 0
# Checking the beam monitor
#clientput [bm send read] value
# At each scan point, read the total x-y histogram
# ans save it. This gets cleared at the start of
# each dataset (when restarting from paused state),
# so it represents the hstogram acquired per scan point.
#clientput "Exit collect" value
return
}
Publish hs_collect User
# The finish callback gets called at the end of the scan.
# We use it to stop the histogram server, terminating the dataset.
proc hs_finish {scanobjectname userobjectname} {
#clientput "Enter finish" value
stdscan finish $scanobjectname $userobjectname
#clientput "hmm stop being done..." value
hmm stop
# Just in case someone expects zero OAT offsets later on ;)
set_oat_offset 0 0 0
# Get and write the data from the main histogram to disk (filename "HistoData").
# Sicne this is the first (and only) access to hmm data, it is retrieved from
# the server and we don't need to do hmm init first to force update hmm memory.
# hmm init
savehistodata hmm "../data/HistoData"
#
#clientput "Exit finish" value
return
}
Publish hs_finish User
# Configure script mode, then we can configure all the scan callbacks.
# The scan list command can be used to check that the callbacks
# are properly defined.
# A different count callback is defined in the two cases.
#
hmscan configure script
#hmscan function prepare hs_prepare
hmscan function count hs_count_bm_controlled
hmscan function collect hs_collect
hmscan function finish hs_finish
#
scan2 configure script
#scan2 function prepare hs_prepare
scan2 function count hs_count_hs_controlled
scan2 function collect hs_collect
scan2 function finish hs_finish
#
# That's all, folks...

View File

@@ -0,0 +1,766 @@
# $Revision: 1.1 $
# $Date: 2007-02-16 05:43:59 $
# Author: Ferdi Franceschini (ffr@ansto.gov.au)
# Last revision by: $Author: ffr $
# START MOTOR CONFIGURATION
set animal echidna
# Setup addresses of Galil DMC2280 controllers.
set dmc2280_controller1(host) mc1-$animal
set dmc2280_controller1(port) pmc1-$animal
set dmc2280_controller2(host) mc2-$animal
set dmc2280_controller2(port) pmc2-$animal
set dmc2280_controller3(host) mc3-$animal
set dmc2280_controller3(port) pmc3-$animal
set dmc2280_controller4(host) mc4-$animal
set dmc2280_controller4(port) pmc4-$animal
#Measured absolute encoder reading at home position
set mphi_Home 7413209
set mchi_Home 7818834
set my_Home 7781389
set mx_Home 7580366
set mom_Home 13442930
set mtth_Home 11534660
set pcx_Home 8345644
set pcr_Home 6197934
set sphi_Home 7924507
set schi_Home 7542917
set sy_Home 7626584
set sx_Home 24029910
set som_Home 24984596
set stth_Home 14530407
#Measured or computed slit motor steps per millimetre
# 125 steps * 161:1 gears = 20125
set slitStepRate 20125
#Measured slit gap, in units, after homing on limit switches
set ss1h_Gap 54.0
set ss1v_Gap 207.5
set ss2h_Gap 52.0
set ss2v_Gap 203.4
set ss1r_Home [expr $ss1h_Gap/2*$slitStepRate]
set ss1l_Home [expr $ss1h_Gap/2*$slitStepRate]
set ss1u_Home [expr $ss1v_Gap/2*$slitStepRate]
set ss1d_Home [expr $ss1v_Gap/2*$slitStepRate]
set ss2r_Home [expr $ss2h_Gap/2*$slitStepRate]
set ss2l_Home [expr $ss2h_Gap/2*$slitStepRate]
set ss2u_Home [expr $ss2v_Gap/2*$slitStepRate]
set ss2d_Home [expr $ss2v_Gap/2*$slitStepRate]
#Default upper and lower ranges for vertical slits
set vertSlitLowRange 25
set vertSlitUpRange 100
#Default upper and lower ranges for horizontal slits
set horSlitLowRange 25
set horSlitUpRange 25
# set movecount high to reduce the frequency of
# hnotify messages to a reasonable level
set move_count 100
# Run slit homing routines on controllers 3 and 4
#if [catch {dmc_connect dmc2280_controller3} ] {
# dmc_sendCmd dmc2280_controller3 "XQ#HOME,1"
# dmc_close dmc2280_controller3
#}
#if [catch {dmc_connect dmc2280_controller4} ] {
# dmc_sendCmd dmc2280_controller4 "XQ#HOME,1"
# dmc_close dmc2280_controller4
#}
############################
# Motor Controller 1
# Motor Controller 1
# Motor Controller 1
############################
#:TP at HOME
#
# Monochromator phi, Tilt 1, upper
Motor mphi DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis A\
units degrees\
hardlowerlim -15\
hardupperlim 15\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -25000\
absEnc 1\
absEncHome $mphi_Home\
cntsPerX -8192]
setHomeandRange -motor mphi -home 0 -lowrange 15 -uprange 15
mphi speed 1
mphi movecount $move_count
mphi precision 0.05
# Monochromator chi, Tilt 2, lower
Motor mchi DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis B\
units degrees\
hardlowerlim 75\
hardupperlim 105\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX 25000\
absEnc 1\
absEncHome $mchi_Home\
cntsPerX 8192]
setHomeandRange -motor mchi -home 90 -lowrange 15 -uprange 15
mchi speed 1
mchi movecount $move_count
mchi precision 0.01
# Monochromator Trans 1, upper
Motor my DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis C\
units mm\
hardlowerlim -20\
hardupperlim 20\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX 25000\
absEnc 1\
absEncHome $my_Home\
cntsPerX 8192]
setHomeandRange -motor my -home 0 -lowrange 20 -uprange 20
my speed 1
my movecount $move_count
my precision 0.01
# Monochromator Trans 2, lower
Motor mx DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis D\
units mm\
hardlowerlim -20\
hardupperlim 20\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -25000\
absEnc 1\
absEncHome $mx_Home\
cntsPerX -8192]
setHomeandRange -motor mx -home 0 -lowrange 20 -uprange 20
mx speed 1
mx movecount $move_count
mx precision 0.01
# Monochromator omega, rotate
Motor mom DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis E\
units degrees\
hardlowerlim -180\
hardupperlim 180\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -12500\
absEnc 1\
absEncHome $mom_Home\
cntsPerX -4096]
setHomeandRange -motor mom -home 0 -lowrange 180 -uprange 180
mom speed 1
mom movecount $move_count
mom precision 0.01
# Monochromator two-theta, flight-tube rotate
Motor mtth DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis F\
units degrees\
hardlowerlim 90\
hardupperlim 137\
maxSpeed 0.2\
maxAccel 0.2\
maxDecel 0.2\
stepsPerX [expr 25000*18]\
absEnc 1\
absEncHome $mtth_Home\
cntsPerX -93207]
mtth softlowerlim 90
mtth softupperlim 137
mtth home 90
mtth speed 0.2
mtth movecount $move_count
mtth accel 0.01
mtth decel 0.01
mtth precision 0.02
mtth maxretry 10
mtth failafter 10
mtth blockage_check_interval 5
# Primary Collimator Translation X
Motor pcx DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis G\
units mm\
hardlowerlim 0\
hardupperlim 140\
maxSpeed 10\
maxAccel 1\
maxDecel 1\
stepsPerX [expr -25000/6]\
absEnc 1\
absEncHome $pcx_Home\
cntsPerX [expr 8192/6]]
setHomeandRange -motor pcx -home 0 -lowrange 0 -uprange 140
pcx speed 1
pcx movecount $move_count
pcx precision 0.01
# Primary Collimator Rotation
Motor pcr DMC2280 [params \
host $dmc2280_controller1(host)\
port $dmc2280_controller1(port)\
axis H\
units degrees\
hardlowerlim -10\
hardupperlim 10\
maxSpeed 0.1\
maxAccel 0.1\
maxDecel 0.1\
stepsPerX [expr -25000/(360/100)]\
absEnc 1\
absEncHome $pcr_Home\
cntsPerX [expr 8192/(360/100)]]
setHomeandRange -motor pcr -home 0 -lowrange 10 -uprange 10
pcr speed 0.1
pcr movecount $move_count
pcr precision 0.01
############################
# Motor Controller 2
# Motor Controller 2
# Motor Controller 2
############################
# Sample Tilt 1, upper, phi
Motor sphi DMC2280 [params \
host $dmc2280_controller2(host)\
port $dmc2280_controller2(port)\
axis A\
units degrees\
hardlowerlim -20\
hardupperlim 20\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -25000\
absEnc 1\
absEncHome $sphi_Home\
cntsPerX -8192]
setHomeandRange -motor sphi -home 0 -lowrange 20 -uprange 20
sphi speed 1
sphi movecount $move_count
sphi precision 0.01
# Sample Tilt 2, lower, chi
Motor schi DMC2280 [params \
host $dmc2280_controller2(host)\
port $dmc2280_controller2(port)\
axis B\
units degrees\
hardlowerlim 70\
hardupperlim 110\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX 25000\
absEnc 1\
absEncHome $schi_Home\
cntsPerX 8192]
setHomeandRange -motor schi -home 90 -lowrange 20 -uprange 20
schi speed 1
schi movecount $move_count
schi precision 0.01
# Sample Trans 1, upper, y
Motor sy DMC2280 [params \
host $dmc2280_controller2(host)\
port $dmc2280_controller2(port)\
axis C\
units mm\
hardlowerlim -20\
hardupperlim 20\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX 25000\
absEnc 1\
absEncHome $sy_Home\
cntsPerX 8192]
setHomeandRange -motor sy -home 0 -lowrange 20 -uprange 20
sy speed 1
sy movecount $move_count
sy precision 0.01
# Sample Trans2, lower, x
Motor sx DMC2280 [params \
host $dmc2280_controller2(host)\
port $dmc2280_controller2(port)\
axis D\
units mm\
hardlowerlim -20\
hardupperlim 20\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -25000\
absEnc 1\
absEncHome $sx_Home\
cntsPerX -8192]
setHomeandRange -motor sx -home 0 -lowrange 20 -uprange 20
sx speed 1
sx movecount $move_count
sx precision 0.01
# Sample Omega, rotate
Motor som DMC2280 [params \
host $dmc2280_controller2(host)\
port $dmc2280_controller2(port)\
axis E\
units degrees\
hardlowerlim -142\
hardupperlim 218\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX 12500\
absEnc 1\
absEncHome $som_Home\
cntsPerX 4096]
setHomeandRange -motor som -home 0 -lowrange 142 -uprange 218
som speed 1
som movecount $move_count
som precision 0.01
# Sample two-theta, detector rotate
Motor stth DMC2280 [params \
host $dmc2280_controller2(host)\
port $dmc2280_controller2(port)\
axis F\
units degrees\
hardlowerlim -79\
hardupperlim 77\
maxSpeed 0.5\
maxAccel 0.1\
maxDecel 0.1\
stepsPerX 125000\
absEnc 1\
absEncHome $stth_Home\
cntsPerX -93207]
stth softlowerlim -77
stth softupperlim 74
stth home 0
stth speed 0.5
stth movecount $move_count
stth precision 0.01
stth blockage_check_interval 2
############################
# Motor Controller 3
# Motor Controller 3
# Motor Controller 3
############################
#
# Monochromator Focusing (Ge)
#Motor mf1 DMC2280 [params \
# host $dmc2280_controller3(host)\
# port $dmc2280_controller3(port)\
# axis A\
# units degrees\
# maxSpeed xxxx\
# maxAccel xxxx\
# maxDecel xxxx\
# stepsPerX xxxx\
# absEnc 1\
# absEncHome $mf1_Home\
# cntsPerX xxxx]
#setHomeandRange -motor mf1 -home 0 -lowrange 0 -uprange 360
#mf1 speed 1
#mfl movecount $move_count
#mf1 precision 0.01
# Slit 1, right
Motor ss1r DMC2280 [params \
host $dmc2280_controller3(host)\
port $dmc2280_controller3(port)\
axis E\
units mm\
hardlowerlim -15\
hardupperlim 35\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss1r_Home]
setHomeandRange -motor ss1r -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange
ss1r movecount $move_count
# Slit 1, left
Motor ss1l DMC2280 [params \
host $dmc2280_controller3(host)\
port $dmc2280_controller3(port)\
axis F\
units mm\
hardlowerlim -15\
hardupperlim 35\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss1l_Home]
setHomeandRange -motor ss1l -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange
ss1l movecount $move_count
# Slit 1, up
Motor ss1u DMC2280 [params \
host $dmc2280_controller3(host)\
port $dmc2280_controller3(port)\
axis G\
units mm\
hardlowerlim -20\
hardupperlim 100\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss1u_Home]
setHomeandRange -motor ss1u -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange
ss1u movecount $move_count
# Slit 1, down
Motor ss1d DMC2280 [params \
host $dmc2280_controller3(host)\
port $dmc2280_controller3(port)\
axis H\
units mm\
hardlowerlim -20\
hardupperlim 100\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss1d_Home]
setHomeandRange -motor ss1d -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange
ss1d movecount $move_count
############################
# Motor Controller 4
# Motor Controller 4
# Motor Controller 4
############################
#
# Little is known about the Eulerian Cradle
## Eulerian-phi
#Motor ephi DMC2280 [params \
# host $dmc2280_controller4(host)\
# port $dmc2280_controller4(port)\
# axis A\
# units degrees\
# maxSpeed xxxx\
# maxAccel xxxx\
# maxDecel xxxx\
# stepsPerX xxxx\
# absEnc 1\
# absEncHome $ephi_Home\
# cntsPerX xxxx]
#setHomeandRange -motor ephi -home 0 -lowrange 180 -uprange 180
#Motor echi DMC2280 [params \
# host $dmc2280_controller4(host)\
# port $dmc2280_controller4(port)\
# axis B\
# units degrees\
# maxSpeed xxxx\
# maxAccel xxxx\
# maxDecel xxxx\
# stepsPerX xxxx\
# absEnc 1\
# absEncHome $echi_Home\
# cntsPerX xxxx]
#setHomeandRange -motor echi -home 0 -lowrange 180 -uprange 180
# Slit 2, right
Motor ss2r DMC2280 [params \
host $dmc2280_controller4(host)\
port $dmc2280_controller4(port)\
axis E\
units mm\
hardlowerlim -15\
hardupperlim 35\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss2r_Home]
setHomeandRange -motor ss2r -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange
ss2r movecount $move_count
# Slit 2, left
Motor ss2l DMC2280 [params \
host $dmc2280_controller4(host)\
port $dmc2280_controller4(port)\
axis F\
units mm\
hardlowerlim -15\
hardupperlim 35\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss2l_Home]
setHomeandRange -motor ss2l -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange
ss2l movecount $move_count
# Slit 2, up
Motor ss2u DMC2280 [params \
host $dmc2280_controller4(host)\
port $dmc2280_controller4(port)\
axis G\
units mm\
hardlowerlim -20\
hardupperlim 100\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss2u_Home]
setHomeandRange -motor ss2u -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange
ss2u movecount $move_count
# Slit 2, down
Motor ss2d DMC2280 [params \
host $dmc2280_controller4(host)\
port $dmc2280_controller4(port)\
axis H\
units mm\
hardlowerlim -20\
hardupperlim 100\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -$slitStepRate\
motorHome $ss2d_Home]
setHomeandRange -motor ss2d -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange
ss2d movecount $move_count
proc mthGet {} { return [expr [SplitReply [mtth]]/2.0]}
proc mthSet {val} { return "mtth=[SplitReply [mtth]]"}
publish mthSet user
publish mthGet user
MakeConfigurableMotor mth
mth readscript mthGet
mth drivescript mthSet
proc sthGet {} { return [expr [SplitReply [stth]]/2.0]}
proc sthSet {val} { return "stth=[SplitReply [stth]]"}
publish sthGet user
publish sthSet user
MakeConfigurableMotor sth
sth readscript sthGet
sth drivescript sthSet
#--------------------------------------------------------
proc ss1widthscript {val} {
set currentWidth [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]]
set diff [expr $val - $currentWidth]
set newD1R [expr [SplitReply [ss1r]] + $diff/2]
set newD1L [expr [SplitReply [ss1l]] + $diff/2]
return "ss1r=$newD1R,ss1l=$newD1L"
}
publish ss1widthscript user
#-------------------------------------------------------
proc ss1readwidth {} {
return [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]]
}
publish ss1readwidth user
MakeConfigurableMotor ss1hg
ss1hg drivescript ss1widthscript
ss1hg readscript ss1readwidth
#--------------------------------------------------------
proc ss1horoffsetscript {val} {
set SR [SplitReply [ss1r]]
set SL [SplitReply [ss1l]]
set currentOffset [ expr $SR - ($SR + $SL)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1R [expr $SR + $diff]
set newD1L [expr $SL - $diff]
return "ss1r=$newD1R,ss1l=$newD1L"
}
publish ss1horoffsetscript user
#-------------------------------------------------------
proc ss1readhoroffset {} {
set SR [SplitReply [ss1r]]
return [ expr $SR - ($SR + [SplitReply [ss1l]])/2.0 ]
}
publish ss1readhoroffset user
#-------------------------------------------------------
MakeConfigurableMotor ss1ho
ss1ho drivescript ss1horoffsetscript
ss1ho readscript ss1readhoroffset
#-----------------------------------------------------
proc ss1heightscript {val} {
set currentWidth [expr [SplitReply [ss1u]] + [SplitReply [ss1d]]]
set diff [expr $val - $currentWidth]
set newD1B [expr [SplitReply [ss1d]] + $diff/2]
set newD1T [expr [SplitReply [ss1u]] + $diff/2]
return "ss1d=$newD1B,ss1u=$newD1T"
}
publish ss1heightscript user
#-------------------------------------------------------
proc ss1readheight {} {
return [expr [SplitReply [ss1u]] + [SplitReply [ss1d]]]
}
publish ss1readheight user
#---------------------------------------------------------
MakeConfigurableMotor ss1vg
ss1vg drivescript ss1heightscript
ss1vg readscript ss1readheight
#--------------------------------------------------------
proc ss1vertoffsetscript {val} {
set SU [SplitReply [ss1u]]
set SD [SplitReply [ss1d]]
set currentOffset [ expr $SU - ($SU + $SD)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1U [expr $SU + $diff]
set newD1D [expr $SD - $diff]
return "ss1u=$newD1U,ss1d=$newD1D"
}
publish ss1vertoffsetscript user
#-------------------------------------------------------
proc ss1readvertoffset {} {
set SU [SplitReply [ss1u]]
return [ expr $SU - ($SU + [SplitReply [ss1d]])/2.0 ]
}
publish ss1readvertoffset user
#-------------------------------------------------------
MakeConfigurableMotor ss1vo
ss1vo drivescript ss1vertoffsetscript
ss1vo readscript ss1readvertoffset
###############################################
#--------------------------------------------------------
proc ss2widthscript {val} {
set currentWidth [expr [SplitReply [ss2r]] + [SplitReply [ss2l]]]
set diff [expr $val - $currentWidth]
set newD1R [expr [SplitReply [ss2r]] + $diff/2]
set newD1L [expr [SplitReply [ss2l]] + $diff/2]
return "ss2r=$newD1R,ss2l=$newD1L"
}
publish ss2widthscript user
#-------------------------------------------------------
proc ss2readwidth {} {
return [expr [SplitReply [ss2r]] + [SplitReply [ss2l]]]
}
publish ss2readwidth user
MakeConfigurableMotor ss2hg
ss2hg drivescript ss2widthscript
ss2hg readscript ss2readwidth
#--------------------------------------------------------
proc ss2horoffsetscript {val} {
set SR [SplitReply [ss2r]]
set SL [SplitReply [ss2l]]
set currentOffset [ expr $SR - ($SR + $SL)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1R [expr $SR + $diff]
set newD1L [expr $SL - $diff]
return "ss2r=$newD1R,ss2l=$newD1L"
}
publish ss2horoffsetscript user
#-------------------------------------------------------
proc ss2readhoroffset {} {
set SR [SplitReply [ss2r]]
return [ expr $SR - ($SR + [SplitReply [ss2l]])/2.0 ]
}
publish ss2readhoroffset user
#-------------------------------------------------------
MakeConfigurableMotor ss2ho
ss2ho drivescript ss2horoffsetscript
ss2ho readscript ss2readhoroffset
#-----------------------------------------------------
proc ss2heightscript {val} {
set currentWidth [expr [SplitReply [ss2u]] + [SplitReply [ss2d]]]
set diff [expr $val - $currentWidth]
set newD1B [expr [SplitReply [ss2d]] + $diff/2]
set newD1T [expr [SplitReply [ss2u]] + $diff/2]
return "ss2d=$newD1B,ss2u=$newD1T"
}
publish ss2heightscript user
#-------------------------------------------------------
proc ss2readheight {} {
return [expr [SplitReply [ss2u]] + [SplitReply [ss2d]]]
}
publish ss2readheight user
#---------------------------------------------------------
MakeConfigurableMotor ss2vg
ss2vg drivescript ss2heightscript
ss2vg readscript ss2readheight
#--------------------------------------------------------
proc ss2vertoffsetscript {val} {
set SU [SplitReply [ss2u]]
set SD [SplitReply [ss2d]]
set currentOffset [ expr $SU - ($SU + $SD)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1U [expr $SU + $diff]
set newD1D [expr $SD - $diff]
return "ss2u=$newD1U,ss2d=$newD1D"
}
publish ss2vertoffsetscript user
#-------------------------------------------------------
proc ss2readvertoffset {} {
set SU [SplitReply [ss2u]]
return [ expr $SU - ($SU + [SplitReply [ss2d]])/2.0 ]
}
publish ss2readvertoffset user
#-------------------------------------------------------
MakeConfigurableMotor ss2vo
ss2vo drivescript ss2vertoffsetscript
ss2vo readscript ss2readvertoffset
# END MOTOR CONFIGURATION

View File

@@ -0,0 +1,99 @@
##NXDICT-1.0
#----------------------------------------------------------------------------
#
# DO NOT EDIT WHEN YOU DO NOT KNOW WHAT YOU ARE DOING!
# This file determines the placement of data items in the Powder NeXus
# data file. Your data may not be readable if this file is messed up.
#
# Mark Koennecke, May 2004
#----------------------------------------------------------------------------
entryName=entry1
dataName=histogram
inst=instrument
detector=detector
monochromator=monochromator
thetadim=128
scan_variable=scanvar
samplemotor=samplemotor
#---------- NXentry level
etitle=/$(entryName),NXentry/SDS title -type NX_CHAR
estart=/$(entryName),NXentry/SDS start_time -type NX_CHAR
eend=/$(entryName),NXentry/SDS end_time -type NX_CHAR
#----------------- NXinstrument
iname=/$(entryName),NXentry/$(inst),NXinstrument/SDS name -type NX_CHAR \
-rank 1 -dim {132}
#----------------- NXmonitor
mmode=/$(entryName),NXentry/monitor,NXmonitor/SDS mode -type NX_CHAR
mpreset=/$(entryName),NXentry/monitor,NXmonitor/SDS preset -type NX_FLOAT32
mdata=/$(entryName),NXentry/monitor,NXmonitor/SDS data -type NX_INT32
mdistance=/$(entryName),NXentry/monitor,NXmonitor/SDS distance -type NX_FLOAT32 -attr {units,metre}
#----------------- NXsource
sname=/$(entryName),NXentry/$(inst),NXinstrument/source,NXsource/SDS name \
-type NX_CHAR -rank 1
stype=/$(entryName),NXentry/$(inst),NXinstrument/source,NXsource/SDS type -type NX_CHAR -rank 1
sprobe=/$(entryName),NXentry/$(inst),NXinstrument/source,NXsource/SDS probe -type NX_CHAR -rank 1
#----------------- NXcrystal
clambda=/$(entryName),NXentry/$(inst),NXinstrument/monochromator_crystal,NXcrystal/SDS wavelength -type NX_FLOAT32 -attr {units,Angstrom}
ctype=/$(entryName),NXentry/$(inst),NXinstrument/monochromator_crystal,NXcrystal/SDS type -type NX_CHAR
#------------- counter
#-------------- Detector
# histogram data
dradius=/$(entryName),NXentry/$(inst),NXinstrument/$(detector),NXdetector/SDS distance -type NX_FLOAT32
dtheta=/$(entryName),NXentry/$(inst),NXinstrument/$(detector),NXdetector/SDS polar_angle -type NX_FLOAT32 -LZW -rank 1 -dim {$(thetadim)} -attr {units,degree}
dcounts=/$(entryName),NXentry/$(inst),NXinstrument/$(detector),NXdetector/SDS \
data -type NX_INT32 -LZW -rank 2 -dim {$(dim0),$(dim1)} \
-attr {signal,1}
deff=/$(entryName),NXentry/$(inst),NXinstrument/$(detector),NXdetector/calibration,NXdata/SDS efficiency -type NX_INT32 -LZW -rank 2 -dim {$(dim0),$(dim1)}
ddesc=/$(entryName),NXentry/$(inst),NXinstrument/$(detector),NXdetector/SDS description -type NX_CHAR
dtype=/$(entryName),NXentry/$(inst),NXinstrument/$(detector),NXdetector/SDS type -type NX_CHAR
dlayout=/$(entryName),NXentry/$(inst),NXinstrument/$(detector),NXdetector/SDS layout -type NX_CHAR
#--------------- NXmonochromator
mom=/$(entryName),NXentry/$(inst),NXinstrument/$(monochromator),NXmonochromator/mom,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,mom}
mchi=/$(entryName),NXentry/$(inst),NXinstrument/$(monochromator),NXmonochromator/mchi,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,mchi}
mphi=/$(entryName),NXentry/$(inst),NXinstrument/$(monochromator),NXmonochromator/mphi,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,mphi}
mx=/$(entryName),NXentry/$(inst),NXinstrument/$(monochromator),NXmonochromator/mx,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,mx}
my=/$(entryName),NXentry/$(inst),NXinstrument/$(monochromator),NXmonochromator/my,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,my}
mtth=/$(entryName),NXentry/$(inst),NXinstrument/$(monochromator),NXmonochromator/mtth,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,mtth}
mth=/$(entryName),NXentry/$(inst),NXinstrument/$(monochromator),NXmonochromator/mth,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,mth}
#--------------- NXsample
saname=/$(entryName),NXentry/sample,NXsample/SDS name -type NX_CHAR
sarot=/$(entryName),NXentry/sample,NXsample/SDS rotation_angle -type NX_FLOAT32 -attr {units,degree}
som=/$(entryName),NXentry/sample,NXsample/som,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,som}
schi=/$(entryName),NXentry/sample,NXsample/schi,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,schi}
sphi=/$(entryName),NXentry/sample,NXsample/sphi,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,sphi}
sx=/$(entryName),NXentry/sample,NXsample/sx,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,sx}
sy=/$(entryName),NXentry/sample,NXsample/sy,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,sy}
stth=/$(entryName),NXentry/sample,NXsample/stth,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,stth}
sth=/$(entryName),NXentry/sample,NXsample/sth,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,sth}
# Slit motors
ss1u=/$(entryName),NXentry/sample,NXsample/ss1u,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1u}
ss1d=/$(entryName),NXentry/sample,NXsample/ss1d,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1d}
ss1l=/$(entryName),NXentry/sample,NXsample/ss1l,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1l}
ss1r=/$(entryName),NXentry/sample,NXsample/ss1r,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1r}
ss1vg=/$(entryName),NXentry/sample,NXsample/ss1vg,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1vg}
ss1vo=/$(entryName),NXentry/sample,NXsample/ss1vo,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1vo}
ss1hg=/$(entryName),NXentry/sample,NXsample/ss1hg,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1hg}
ss1ho=/$(entryName),NXentry/sample,NXsample/ss1ho,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss1ho}
ss2u=/$(entryName),NXentry/sample,NXsample/ss2u,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2u}
ss2d=/$(entryName),NXentry/sample,NXsample/ss2d,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2d}
ss2l=/$(entryName),NXentry/sample,NXsample/ss2l,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2l}
ss2r=/$(entryName),NXentry/sample,NXsample/ss2r,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2r}
ss2vg=/$(entryName),NXentry/sample,NXsample/ss2vg,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2vg}
ss2vo=/$(entryName),NXentry/sample,NXsample/ss2vo,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2vo}
ss2hg=/$(entryName),NXentry/sample,NXsample/ss2hg,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2hg}
ss2ho=/$(entryName),NXentry/sample,NXsample/ss2ho,NXpositioner/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,ss2ho}
#----------------NXdata ------------------------------------------------
scandata=/$(entryName),NXentry/scan_data,NXdata/NXVGROUP
scanvar=/$(entryName),NXentry/scan_variable,NXdata/NXVGROUP
scanstep=/$(entryName),NXentry/scan_step,NXdata/SDS value -type NX_FLOAT32 -attr {units,degree} -attr {long_name,stepsize}
#histogram=/$(entryName),NXentry/histogram,NXdata/NXVGROUP
#scanvar=/$(entryName),NXentry/$(scan_variable),NXdata/NXVGROUP

View File

@@ -0,0 +1,148 @@
MakeNXScript
#nxscript createxml junk4.xml echidna.dic
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)/echidna.dic;
set nxFileOpen true
}
proc nxreopenfile {} {
global dataFileName nxFileOpen cfPath;
nxscript reopen $dataFileName $cfPath(nexus)/echidna.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 [expr $tubedia/$dradius *(180/$pi)]
set angsep 1.25
# stthmin = (180 - (1.25*127))/2
proc addnxentry {nxobj entryname scanVariable scanVarPos scanVarStep} {
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)
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
$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
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 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

View File

@@ -0,0 +1,8 @@
##SICS ASCII at HRPD
*************************** HRPD SCAN File ********************************
Original Filename = !!FILE!!
Title = !!VAR(Title)!!
User = !!VAR(User)!!
Sample Name = !!VAR(sample)!!
File Creation Date = !!DATE!!
**************************** DATA ******************************************

View File

@@ -0,0 +1,130 @@
namespace eval scanCommand {
#MakeScanCommand escan counter echidna.hdd recover.bin
variable scanVariable scan_var scanVarStart 0 scanVarStep 1
proc scan_prepare {sobj uobj} {
variable scanVarStart;
variable scanVarStep;
variable scanVariable;
nxcreatefile;
nxscript updatedictvar entryName start;
nxscript puttext estart [sicstime];
nxclosefile;
# stdscan prepare $sobj $uobj;
set vlist [split [$sobj getvarpar 0] = ];
set scanVariable [string trim [lindex [split [lindex $vlist 0] . ] 1]];
set scanVarStart [lindex $vlist 1];
set scanVarStep [lindex $vlist 2];
hs_prepare $sobj $uobj
}
proc hm_scan_finish {sobj uobj} {
hs_finish $sobj $uobj;
nxreopenfile;
nxscript updatedictvar entryName stop;
nxscript puttext eend [sicstime];
nxclosefile;
}
proc bm_scan_finish {sobj uobj} {
stdscan finish $sobj $uobj;
nxreopenfile;
nxscript updatedictvar entryName stop;
nxscript puttext eend [sicstime];
nxclosefile;
}
#proc hm_scan_finish {sobj uobj} {
# nxclosefile;
#}
# Add an nxentry for the current scan point
proc nxaddpoint {sobj uobj pt} {
variable scanVarStart;
variable scanVarStep;
variable scanVariable;
set scanVarPos [expr $scanVarStart + $pt * $scanVarStep];
nxreopenfile;
addnxentry nxscript scan_[format "%05d" $pt] $scanVariable $scanVarPos $scanVarStep;
nxclosefile
}
proc donothing {args} {}
proc bmcount {sobj uobj pt mode preset} {
bm setmode $mode
bm count $preset;
}
proc bm_scan_prepare {sobj uobj} {
variable scanVarStart;
variable scanVarStep;
variable scanVariable;
nxcreatefile;
nxscript updatedictvar entryName start;
nxscript puttext estart [sicstime];
nxclosefile;
set vlist [split [$sobj getvarpar 0] = ];
set scanVariable [string trim [lindex [split [lindex $vlist 0] . ] 1]];
set scanVarStart [lindex $vlist 1];
set scanVarStep [lindex $vlist 2];
stdscan prepare $sobj $uobj;
}
proc bm_nxaddpoint {sobj uobj pt} {
variable scanVarStart;
variable scanVarStep;
variable scanVariable;
set scanVarPos [expr $scanVarStart + $pt * $scanVarStep];
nxreopenfile;
bm_addnxentry nxscript scan_$pt $scanVariable $scanVarPos $scanVarStep;
nxclosefile
}
}
publish ::scanCommand::scan_prepare user
publish ::scanCommand::hm_scan_finish user
publish ::scanCommand::nxaddpoint user
publish ::scanCommand::donothing user
publish ::scanCommand::bm_scan_prepare user
publish ::scanCommand::bm_scan_finish user
publish ::scanCommand::bm_nxaddpoint user
publish ::scanCommand::donothing user
publish ::scanCommand::bmcount user
#scan2 function writeheader ::scanCommand::donothing
#scan2 function writepoint ::scanCommand::nxaddpoint
#scan2 function prepare ::scanCommand::scan_prepare
hmscan configure script
#hmscan function prepare hdbprepare
#hmscan function collect hdbcollect
hmscan function writeheader ::scanCommand::donothing
hmscan function writepoint ::scanCommand::nxaddpoint
hmscan function prepare ::scanCommand::scan_prepare
hmscan function finish ::scanCommand::hm_scan_finish
# Wombat proc hdb_hmscan {scanvar scanstart scanincr scanend mode preset} {
proc hdb_hmscan {scanvar scanstart scanincr np mode preset} {
hmscan clear
hmscan configure script
hmscan add $scanvar scanstart scanincr
set status [catch {hmscan run $np $mode $preset} msg]
hmscan configure soft
if {$status == 0} {
return $msg
} else {
error $msg
}
}
publish hdb_hmscan user
MakeScanCommand bmonscan bm $cfPath(scan)/echidna.hdd recover.bin
bmonscan configure script
bmonscan function writeheader ::scanCommand::donothing
bmonscan function writepoint ::scanCommand::bm_nxaddpoint
bmonscan function prepare ::scanCommand::bm_scan_prepare
bmonscan function count ::scanCommand::bmcount
bmonscan function finish ::scanCommand::bm_scan_finish

View File

@@ -0,0 +1,2 @@
sics_ports.tcl
config

View File

@@ -0,0 +1,256 @@
# !!- AUTOGENERATED FROM config/motors/motor_configuration.tcl -!!
# !!- DO NOT MODIFY -!!
# Fri 16 Feb 2007 16:19:31 EST
publish setpos user
publish SplitReply user
Motor mphi SIM -15 15 -1.0
mphi softlowerlim -15
mphi softupperlim 15
mphi movecount 100
mphi precision 0.05
Motor mchi SIM 75 105 -1.0
mchi softlowerlim 75
mchi softupperlim 105
mchi movecount 100
mchi precision 0.01
Motor my SIM -20 20 -1.0
my softlowerlim -20
my softupperlim 20
my movecount 100
my precision 0.01
Motor mx SIM -20 20 -1.0
mx softlowerlim -20
mx softupperlim 20
mx movecount 100
mx precision 0.01
Motor mom SIM -180 180 -1.0
mom softlowerlim -180
mom softupperlim 180
mom movecount 100
mom precision 0.01
Motor mtth SIM 90 137 -1.0
mtth softlowerlim 90
mtth softupperlim 137
mtth movecount 100
mtth precision 0.02
mtth maxretry 10
mtth failafter 10
Motor pcx SIM 0 140 -1.0
pcx softlowerlim 0
pcx softupperlim 140
pcx movecount 100
pcx precision 0.01
Motor pcr SIM -10 10 -1.0
pcr softlowerlim -10
pcr softupperlim 10
pcr movecount 100
pcr precision 0.01
Motor sphi SIM -20 20 -1.0
sphi softlowerlim -20
sphi softupperlim 20
sphi movecount 100
sphi precision 0.01
Motor schi SIM 70 110 -1.0
schi softlowerlim 70
schi softupperlim 110
schi movecount 100
schi precision 0.01
Motor sy SIM -20 20 -1.0
sy softlowerlim -20
sy softupperlim 20
sy movecount 100
sy precision 0.01
Motor sx SIM -20 20 -1.0
sx softlowerlim -20
sx softupperlim 20
sx movecount 100
sx precision 0.01
Motor som SIM -142 218 -1.0
som softlowerlim -142
som softupperlim 218
som movecount 100
som precision 0.01
Motor stth SIM -79 77 -1.0
stth softlowerlim -77
stth softupperlim 74
stth movecount 100
stth precision 0.01
Motor ss1r SIM -15 35 -1.0
ss1r softlowerlim -25
ss1r softupperlim 25
ss1r movecount 100
Motor ss1l SIM -15 35 -1.0
ss1l softlowerlim -25
ss1l softupperlim 25
ss1l movecount 100
Motor ss1u SIM -20 100 -1.0
ss1u softlowerlim -25
ss1u softupperlim 100
ss1u movecount 100
Motor ss1d SIM -20 100 -1.0
ss1d softlowerlim -25
ss1d softupperlim 100
ss1d movecount 100
Motor ss2r SIM -15 35 -1.0
ss2r softlowerlim -25
ss2r softupperlim 25
ss2r movecount 100
Motor ss2l SIM -15 35 -1.0
ss2l softlowerlim -25
ss2l softupperlim 25
ss2l movecount 100
Motor ss2u SIM -20 100 -1.0
ss2u softlowerlim -25
ss2u softupperlim 100
ss2u movecount 100
Motor ss2d SIM -20 100 -1.0
ss2d softlowerlim -25
ss2d softupperlim 100
ss2d movecount 100
proc mthGet {} { return [expr [SplitReply [mtth]]/2.0]}
proc mthSet val { return "mtth=[SplitReply [mtth]]"}
publish mthSet user
publish mthGet user
MakeConfigurableMotor mth
mth readscript mthGet
mth drivescript mthSet
proc sthGet {} { return [expr [SplitReply [stth]]/2.0]}
proc sthSet val { return "stth=[SplitReply [stth]]"}
publish sthGet user
publish sthSet user
MakeConfigurableMotor sth
sth readscript sthGet
sth drivescript sthSet
proc ss1widthscript val {
set currentWidth [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]]
set diff [expr $val - $currentWidth]
set newD1R [expr [SplitReply [ss1r]] + $diff/2]
set newD1L [expr [SplitReply [ss1l]] + $diff/2]
return "ss1r=$newD1R,ss1l=$newD1L"
}
publish ss1widthscript user
proc ss1readwidth {} {
return [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]]
}
publish ss1readwidth user
MakeConfigurableMotor ss1hg
ss1hg drivescript ss1widthscript
ss1hg readscript ss1readwidth
proc ss1horoffsetscript val {
set SR [SplitReply [ss1r]]
set SL [SplitReply [ss1l]]
set currentOffset [ expr $SR - ($SR + $SL)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1R [expr $SR + $diff]
set newD1L [expr $SL - $diff]
return "ss1r=$newD1R,ss1l=$newD1L"
}
publish ss1horoffsetscript user
proc ss1readhoroffset {} {
set SR [SplitReply [ss1r]]
return [ expr $SR - ($SR + [SplitReply [ss1l]])/2.0 ]
}
publish ss1readhoroffset user
MakeConfigurableMotor ss1ho
ss1ho drivescript ss1horoffsetscript
ss1ho readscript ss1readhoroffset
proc ss1heightscript val {
set currentWidth [expr [SplitReply [ss1u]] + [SplitReply [ss1d]]]
set diff [expr $val - $currentWidth]
set newD1B [expr [SplitReply [ss1d]] + $diff/2]
set newD1T [expr [SplitReply [ss1u]] + $diff/2]
return "ss1d=$newD1B,ss1u=$newD1T"
}
publish ss1heightscript user
proc ss1readheight {} {
return [expr [SplitReply [ss1u]] + [SplitReply [ss1d]]]
}
publish ss1readheight user
MakeConfigurableMotor ss1vg
ss1vg drivescript ss1heightscript
ss1vg readscript ss1readheight
proc ss1vertoffsetscript val {
set SU [SplitReply [ss1u]]
set SD [SplitReply [ss1d]]
set currentOffset [ expr $SU - ($SU + $SD)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1U [expr $SU + $diff]
set newD1D [expr $SD - $diff]
return "ss1u=$newD1U,ss1d=$newD1D"
}
publish ss1vertoffsetscript user
proc ss1readvertoffset {} {
set SU [SplitReply [ss1u]]
return [ expr $SU - ($SU + [SplitReply [ss1d]])/2.0 ]
}
publish ss1readvertoffset user
MakeConfigurableMotor ss1vo
ss1vo drivescript ss1vertoffsetscript
ss1vo readscript ss1readvertoffset
proc ss2widthscript val {
set currentWidth [expr [SplitReply [ss2r]] + [SplitReply [ss2l]]]
set diff [expr $val - $currentWidth]
set newD1R [expr [SplitReply [ss2r]] + $diff/2]
set newD1L [expr [SplitReply [ss2l]] + $diff/2]
return "ss2r=$newD1R,ss2l=$newD1L"
}
publish ss2widthscript user
proc ss2readwidth {} {
return [expr [SplitReply [ss2r]] + [SplitReply [ss2l]]]
}
publish ss2readwidth user
MakeConfigurableMotor ss2hg
ss2hg drivescript ss2widthscript
ss2hg readscript ss2readwidth
proc ss2horoffsetscript val {
set SR [SplitReply [ss2r]]
set SL [SplitReply [ss2l]]
set currentOffset [ expr $SR - ($SR + $SL)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1R [expr $SR + $diff]
set newD1L [expr $SL - $diff]
return "ss2r=$newD1R,ss2l=$newD1L"
}
publish ss2horoffsetscript user
proc ss2readhoroffset {} {
set SR [SplitReply [ss2r]]
return [ expr $SR - ($SR + [SplitReply [ss2l]])/2.0 ]
}
publish ss2readhoroffset user
MakeConfigurableMotor ss2ho
ss2ho drivescript ss2horoffsetscript
ss2ho readscript ss2readhoroffset
proc ss2heightscript val {
set currentWidth [expr [SplitReply [ss2u]] + [SplitReply [ss2d]]]
set diff [expr $val - $currentWidth]
set newD1B [expr [SplitReply [ss2d]] + $diff/2]
set newD1T [expr [SplitReply [ss2u]] + $diff/2]
return "ss2d=$newD1B,ss2u=$newD1T"
}
publish ss2heightscript user
proc ss2readheight {} {
return [expr [SplitReply [ss2u]] + [SplitReply [ss2d]]]
}
publish ss2readheight user
MakeConfigurableMotor ss2vg
ss2vg drivescript ss2heightscript
ss2vg readscript ss2readheight
proc ss2vertoffsetscript val {
set SU [SplitReply [ss2u]]
set SD [SplitReply [ss2d]]
set currentOffset [ expr $SU - ($SU + $SD)/2.0 ]
set diff [expr $val - $currentOffset]
set newD1U [expr $SU + $diff]
set newD1D [expr $SD - $diff]
return "ss2u=$newD1U,ss2d=$newD1D"
}
publish ss2vertoffsetscript user
proc ss2readvertoffset {} {
set SU [SplitReply [ss2u]]
return [ expr $SU - ($SU + [SplitReply [ss2d]])/2.0 ]
}
publish ss2readvertoffset user
MakeConfigurableMotor ss2vo
ss2vo drivescript ss2vertoffsetscript
ss2vo readscript ss2readvertoffset