diff --git a/site_ansto/instrument/hipd/config/hmm/hmm_configuration.tcl b/site_ansto/instrument/hipd/config/hmm/hmm_configuration.tcl index 2f8f099c..16eccc41 100644 --- a/site_ansto/instrument/hipd/config/hmm/hmm_configuration.tcl +++ b/site_ansto/instrument/hipd/config/hmm/hmm_configuration.tcl @@ -1,395 +1 @@ -# $Revision: 1.1 $ -# $Date: 2007-02-26 02:14:07 $ -# 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-wombat: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 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)/scan.hdd recover.bin -MakeScanCommand scan2 bm $cfPath(scan)/scan.hdd recover.bin -# -# Call is: scan2_runa -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 -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... +source $cfpath(hmm)/hmm_configuration_common_1.tcl diff --git a/site_ansto/instrument/hipd/config/nexus/nexus.dic b/site_ansto/instrument/hipd/config/nexus/nexus.dic index bc27b61b..cfe046f0 100644 --- a/site_ansto/instrument/hipd/config/nexus/nexus.dic +++ b/site_ansto/instrument/hipd/config/nexus/nexus.dic @@ -13,7 +13,7 @@ inst=instrument detector=detector monochromator=monochromator padim0=512 -padim1=4000 +padim1=128 scan_variable=scanvar samplemotor=samplemotor #---------- NXentry level diff --git a/site_ansto/instrument/hipd/config/scan/scan.tcl b/site_ansto/instrument/hipd/config/scan/scan.tcl index 1733aaa8..27e0d607 100644 --- a/site_ansto/instrument/hipd/config/scan/scan.tcl +++ b/site_ansto/instrument/hipd/config/scan/scan.tcl @@ -1,138 +1,2 @@ -namespace eval scanCommand { - -variable scanVariable scan_var scanVarStart 0 scanVarStep 1 - proc scan_prepare {sobj uobj} { - variable scanVarStart; - variable scanVarStep; - variable scanVariable; - - nxcreatefile; - 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 scan_count {sobj uobj point mode preset} { - variable scan_pt_start_time - set scan_pt_start_time [sicstime] - hs_count_bm_controlled $sobj $uobj $point $mode $preset; - - } - - proc hm_scan_finish {sobj uobj} { - hs_finish $sobj $uobj; - nxreopenfile; - nxclosefile; - } - - proc bm_scan_finish {sobj uobj} { - stdscan finish $sobj $uobj; - nxreopenfile; - 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; - variable scan_pt_start_time; - - set scanVarPos [expr $scanVarStart + $pt * $scanVarStep]; - nxreopenfile; - addnxentry nxscript scan_[format "%05d" $pt] $scanVariable $scanVarPos $scanVarStep $scan_pt_start_time; - nxclosefile - } - - proc donothing {args} {} - - proc bmcount {sobj uobj pt mode preset} { - variable scan_pt_start_time - set scan_pt_start_time [sicstime] - bm setmode $mode - bm count $preset; - } - proc bm_scan_prepare {sobj uobj} { - variable scanVarStart; - variable scanVarStep; - variable scanVariable; - nxcreatefile; - 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; - variable scan_pt_start_time; - - set scanVarPos [expr $scanVarStart + $pt * $scanVarStep]; - nxreopenfile; - bm_addnxentry nxscript scan_[format "%05d" $pt] $scanVariable $scanVarPos $scanVarStep $scan_pt_start_time; - nxclosefile - } -} - -publish ::scanCommand::scan_count user -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 count ::scanCommand::scan_count -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)/scan.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 - +source $cfPath(scan)/scan_common_1.tcl diff --git a/site_ansto/instrument/hrpd/config/counter/counter.tcl b/site_ansto/instrument/hrpd/config/counter/counter.tcl index 9bf1f362..04bb6d5a 100644 --- a/site_ansto/instrument/hrpd/config/counter/counter.tcl +++ b/site_ansto/instrument/hrpd/config/counter/counter.tcl @@ -1 +1,3 @@ -MakeCounter counter SIM -0.5 +# Make and configure an ANSTO beam monitor counter. +# This must be sourced before the hmm_configuration.tcl until we separate the scan setup from the hmm setup +source counter_common_1.tcl diff --git a/site_ansto/instrument/hrpd/config/hmm/hmm_configuration.tcl b/site_ansto/instrument/hrpd/config/hmm/hmm_configuration.tcl index fa9f7835..16eccc41 100644 --- a/site_ansto/instrument/hrpd/config/hmm/hmm_configuration.tcl +++ b/site_ansto/instrument/hrpd/config/hmm/hmm_configuration.tcl @@ -1,398 +1 @@ -# $Revision: 1.2 $ -# $Date: 2007-02-20 05:01:44 $ -# 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)/scan.hdd recover.bin -MakeScanCommand scan2 bm $cfPath(scan)/scan.hdd recover.bin -# -# Call is: scan2_runa -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 -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... +source $cfpath(hmm)/hmm_configuration_common_1.tcl diff --git a/site_ansto/instrument/hrpd/config/scan/scan.tcl b/site_ansto/instrument/hrpd/config/scan/scan.tcl index 1733aaa8..4fd616d2 100644 --- a/site_ansto/instrument/hrpd/config/scan/scan.tcl +++ b/site_ansto/instrument/hrpd/config/scan/scan.tcl @@ -1,138 +1 @@ -namespace eval scanCommand { - -variable scanVariable scan_var scanVarStart 0 scanVarStep 1 - proc scan_prepare {sobj uobj} { - variable scanVarStart; - variable scanVarStep; - variable scanVariable; - - nxcreatefile; - 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 scan_count {sobj uobj point mode preset} { - variable scan_pt_start_time - set scan_pt_start_time [sicstime] - hs_count_bm_controlled $sobj $uobj $point $mode $preset; - - } - - proc hm_scan_finish {sobj uobj} { - hs_finish $sobj $uobj; - nxreopenfile; - nxclosefile; - } - - proc bm_scan_finish {sobj uobj} { - stdscan finish $sobj $uobj; - nxreopenfile; - 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; - variable scan_pt_start_time; - - set scanVarPos [expr $scanVarStart + $pt * $scanVarStep]; - nxreopenfile; - addnxentry nxscript scan_[format "%05d" $pt] $scanVariable $scanVarPos $scanVarStep $scan_pt_start_time; - nxclosefile - } - - proc donothing {args} {} - - proc bmcount {sobj uobj pt mode preset} { - variable scan_pt_start_time - set scan_pt_start_time [sicstime] - bm setmode $mode - bm count $preset; - } - proc bm_scan_prepare {sobj uobj} { - variable scanVarStart; - variable scanVarStep; - variable scanVariable; - nxcreatefile; - 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; - variable scan_pt_start_time; - - set scanVarPos [expr $scanVarStart + $pt * $scanVarStep]; - nxreopenfile; - bm_addnxentry nxscript scan_[format "%05d" $pt] $scanVariable $scanVarPos $scanVarStep $scan_pt_start_time; - nxclosefile - } -} - -publish ::scanCommand::scan_count user -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 count ::scanCommand::scan_count -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)/scan.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 - - +source $cfPath(scan)/scan_common_1.tcl