# Author Jing Chen (jgn@ansto.gove.au) fileeval $cfPath(hmm)/hmm_configuration_common_1.tcl source $cfPath(hmm)/hmm_cylindrical_detector_configuration.tcl set sim_mode [SplitReply [hmm_simulation]] # Elastic peak index and time of flight channel width ::utility::mkVar elpk int user elpk true detector true true sicslist setatt elpk link data_set ::utility::mkVar tofw float user tofw true detector true true sicslist setatt tofw link data_set proc ::histogram_memory::init_OAT_TABLE {} { variable INST_NXC "oat_nxc_eff" variable INST_NYC "oat_nyc_eff" if [ catch { OAT_TABLE X -setdata MAX_CHAN 200 OAT_TABLE Y -setdata MAX_CHAN 1024 OAT_TABLE X -setdata BMIN -0.5 OAT_TABLE X -setdata BMAX 199.5 OAT_TABLE Y -setdata BMIN -0.5 OAT_TABLE Y -setdata BMAX 1023.5 set clock_scale 1000 set freq 200 set tbins 1000 set xbins 200 set ybins 64 set period [expr 1.0/$freq] set tbinwidth_ns [expr $period/$tbins * 1e9] hmm configure fat_clock_scale $clock_scale hmm configure fat_frame_frequency $freq hmm configure fat_frame_source EXTERNAL # The entries in the time bin array are in nanoseconds/clock_scale because the clock base is in nanoseconds set tbb0 0.0 set tbb1 [expr $tbb0 + $tbinwidth_ns / $clock_scale] OAT_TABLE -set X { 199.5 198.5 } NXC $xbins Y { -0.5 15.5 } NYC $ybins T "$tbb0 $tbb1" NTC $tbins # Use the ::histogram_memory::clock_scale function to make sure that the value in the # time of flight channel width is consistent with its units sicslist setatt tofw units [::histogram_memory::clock_scale units] tofw [expr ($tbb1 - $tbb0) * [::histogram_memory::clock_scale]] if {$::sim_mode == "true"} { hmm configure oat_ntc_eff $tbins hmm configure $INST_NYC $ybins hmm configure $INST_NXC $xbins } } message ] { if {$::errorCode=="NONE"} {return $message} return -code error $message } } proc CAT_TABLE {args} { return { 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 10 10 10 10 10 10 } } proc ::histogram_memory::init_CAT_TABLE {} { CAT_TABLE -set MESYTEC_TUBE_PAIR_RESISTANCE_RATIOS { 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. } CAT_TABLE -set MESYTEC_TUBE_MAGNIFICATIONS { 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. } CAT_TABLE -set MESYTEC_TUBE_OFFSETS { 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. } CAT_TABLE -set MESYTEC_TUBE_HISTOGRAM_WEIGHTS { 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 } } ## # @brief Return the detector position proc ::histogram_memory::detector_posn_degrees {} { return [SplitReply [stth]] } proc ::histogram_memory::pre_count {} {} proc ::histogram_memory::post_count {} {} proc ::histogram_memory::isc_initialize {} { # Instrument specific X and Y dimension names if [ catch { ::histogram_memory::init_hmm_objs BAT_TABLE -init # CAT_TABLE -init SAT_TABLE -init OAT_TABLE -init FAT_TABLE -init ::histogram_memory::ic_initialize ::histogram_memory::set_graphtype "two_theta" "boundaries" # Width = 25mm spacing * 200 tubes = 5000mm (120 degree coverage) # Height = 1015mm (tube length) # Radius = 2400mm detector_active_height_mm 1015 detector_active_height_mm lock detector_active_width_mm 5235.9888 detector_active_width_mm lock detector_radius_mm 2400.0 detector_radius_mm lock # hmm configure FAT_SIMULATED_EVENT_Y0 $y_bb0 # hmm configure FAT_SIMULATED_EVENT_Y1 $ybbmax # hmm configure FAT_SIMULATED_EVENT_X0 $x_bb0 # hmm configure FAT_SIMULATED_EVENT_X1 $xbbmax ::histogram_memory::init_OAT_TABLE # ::histogram_memory::init_SAT_TABLE # ::histogram_memory::init_CAT_TABLE ::histogram_memory::upload_config Filler_defaults set ::histogram_memory::histmem_axes(HOR) /instrument/detector/x_pixel_angular_offset set ::histogram_memory::histmem_axes(VER) /instrument/detector/y_pixel_offset } message ] { if {$::errorCode=="NONE"} {return $message} return -code error $message } } proc histmem {cmd args} { set catch_status [ catch { switch $cmd { "tbins" { if {$args == ""} { set reply [OAT_TABLE -get NTC] } else { if {[llength $args] != 2} { error "There should be two arguments in $args, the number of time bins and the desired frame frequency" } else { foreach {numbins freq} $args {} if { ![string is integer $numbins]} { error "$numbins should be an integer" } if { ![string is double $freq]} { error "$freq should be a number" } set period [expr 1.0/$freq] set tbinwidth_us [expr $period/$numbins * 1e6] set clock_scale [::histogram_memory::clock_scale] set tbb0 0.0 set tbb1 [expr $tbb0 + $tbinwidth_us / $clock_scale] hmm configure fat_frame_frequency $freq OAT_TABLE -set T "$tbb0 $tbb1" NTC $numbins set reply [_histmem loadconf] } } } "twidth" { if {$args == ""} { set tbins [OAT_TABLE -get T] set tb0 [lindex $tbins 0] set tb1 [lindex $tbins 1] set reply [expr {($tb1 - $tb0) / [::histogram_memory::clock_scale]}] } else { if {[llength $args] != 2} { error "There should be two arguments in $args, the desired time bin width and the frame frequency" } else { foreach {binw_us freq} $args {} if { ![string is double $binw_us]} { error "$binw_us should be a number" } if { ![string is double $freq]} { error "$freq should be a number" } set period_us [expr {1e6/$freq}] set numbins [expr {round(0.5 + $period_us/$binw_us)}] set clock_scale [::histogram_memory::clock_scale] set tbinwidth [expr {$binw_us / $clock_scale}] set tbb0 0.0 set tbb1 [expr $tbb0 + $tbinwidth] hmm configure fat_frame_frequency $freq OAT_TABLE -set T "$tbb0 $tbb1" NTC $numbins set reply [_histmem loadconf] } } } default { set reply [eval "_histmem $cmd $args"] } } return $reply } msg ] handle_exception $catch_status $msg } publish histmem user