Files
x07mb/script/Users/Thomas/Pscan.py
2022-03-04 14:28:28 +01:00

3464 lines
122 KiB
Python

#!/usr/bin/env python
#
# Main library for PHOENIX DAQ gui
#
# written by Thomas Huthwelker 2011-
#
# ........... other helping rouintes
# Changes
#
# 2.12.2014 Add Ketek as a additional Fluorescence detector option (This is a detctor which uses only channel 2) (T.Huthwelker)
#
# 16.3.2015 Get some bugs out of software (T.Huthwelker)
#
# 16.3.2015 implenet Ketek properly now also for imaging (T.Huthwelker)
#
# 10.10.2015
# d_list_fluo =[-1] changed 10.10. Need to give initial definition for d_list_fluo,
# as it will remain undefined of no Fluo detector is used.
# Define channel -1 as number for no fluo detector '
#
# 1.11.2015
# add INstall changes from 10.10.2015
# extend predefeind detector group for Mono encoders by adding values for T1, T2, Theta and
# monitoring the differences values and encoder positions (field val,rbv,diff, rep), and voltages from LVDT
# decrease delay for all preactions to 50 ms ste delays in detector DAQ to 75 ms (100 before) to be tested.
#
# 28.8.2017 put call to writing of header into backgournd preocess tro speed up measurements
# ........... other helping rouintes
import math
import time
def create_rbv_val(ch):
ll=len(ch)
print ll
print ch[ll-4:ll]
extension=ch[ll-4:ll]
if extension == ".RBV":
ch_rbv = ch
ch_val = ch[0:ll-4]+".VAL"
print 'Channel has extension .rbv'
if extension == ".VAL":
ch_rbv = ch[0:ll-4]+".RBV"
ch_val = ch
print 'Channel has extension .VAL'
if (extension <> ".VAL") and (extension <> ".RBV"):
ch_rbv = ch
ch_val = ch
print 'Channel has no extension, used chanel as it is for .VAl and .RBV '
# endif
print ch_rbv
print ch_val
return [ch_rbv,ch_val]
def get_epicsPV(channel):
try:
from CaChannel import *
from epicsMotor import *
from epicsPV import *
import time
import string
except:
try:
sys.path.insert(0, os.path.expandvars("$SLSBASE/sls/lib/python22/CaChannel"))
sys.path.insert(0, os.path.expandvars("/exchange/share/mXAS/pyth/mod"))
from CaChannel import *
from epicsPV import *
except:
os.system ("xkbbell")
os.system ("xmessage -nearmouse -timeout 30 \
-buttons \"\" \"epicsPV or CaChannel module cannot be found\"")
sys.exit(1)
# endtry
# endtry
n_tries=0
tt=0
b=-1
while tt==0:
try:
#print ' try reading channel' ,channel,'Tr Nr ',tt
b=epicsPV(channel).getw()
tt=1
except:
print ' \n '
print 'trouble reading epics PV..',channel,' try again '
print ' \n '
n_tries=n_tries+1
tt=0
time.sleep(.25)
if n_tries==20:
tt=1
print 'give up after 20 trying reading channel '
sys.exit("*** Program STOP ***")
#endif
#endtry
#endwhile
return b
def error_stop(info_line):
import time
print ' --------------------------------------------- '
print ' '
print ' EMERGENCY STOP '
print ' '
print info_line
print ' '
print ' '
print ' '
print ' '
print ' '
print ' script stops in 30 sec '
print ' '
print ' '
print ' Window can be closed or closes automatically'
print ' --------------------------------------------- '
time.sleep(30)
stop
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
def remove_blanks_from_str(xx):
box=''
for i in range(len(xx)):
if xx[i:i+1] <> ' ':
box=box+xx[i:i+1]
#endif
# endfor
return box
# =======================================++++++++++++++++++++++++++++++++++++++
def create_str_list(n):
d=range(n)
for i in range(len(d)):
d[i]=' '
return d
# ==================================
def create_int_zeros(n):
d=range(n)
for i in range(len(d)):
d[i]=d[i]-d[i]
return d
# ..............................................
def create_real_zeros(n):
d=range(n)
for i in range(len(d)):
d[i]=(d[i]-d[i])*0.0
return d
# ............................
def array_to_string(array_in):
print array_in
positions_str=' '
for x in array_in:
positions_str=positions_str+' ' + str(x)
return positions_str
# ............................
def write_guard(f,params):
print params
if get_epicsPV('X07MB-PC-PSCAN:GUARD') == 1:
f.write('<guard> \n ') # -..... close dimension 1
# =============================== XTREME ==============================
f.write('<condition channel="'+params['Channel']+'" value="'+str(params['Value'])+'" type="Integer"/> \n')
# f.write('<condition channel="' + 'X07MA:m1.URIP' + '" value="' +str(1) + '" type="Integer"/> \n')
# f.write('<condition channel="' + 'X07MA:m2.URIP' + '" value="' +str(1) + '" type="Integer"/> \n')
# f.write('<condition channel="' + 'X07MA-PGM:rbkcrashrisk' + '" value="' +str(0) + '" type="Integer"/> \n')
f.write('</guard> \n ') # -..... close dimension 1
#endif
#end write_guard
# .......................... .VISUALIZATIONS ...
def write_visualization(f,params):
if params['Type'] <> "MatrixPlot":
f.write('<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'
+params['Type']+'" x="'+params['X']+'" y="'+params['DATA']+'" title="'+params['Title']+'" /> \n ')
# endif
if params['Type'] == "MatrixPlot":
print 'CREATE MATRIX PLOT'
print params['DATA']
print params['DATA'].count(' ')
if params['DATA'].count(' ') == 0:
f.write('<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'
+params['Type']+'" x="'+params['X']+'" y="'+params['Y']+'" z="'+params['DATA']+'" title="'+params['Title']+'" /> \n ')
# endif
# endif
# +++++++++++++
# ............................................. Special visualizations (1-D)
def special_visualization(f,g,params):
# Type may be 'LinePlot' or MatrixPlot
# routine plots predefined and active detector sets as function of coordinate X (Must be FDA Id)
if (('PL_KEITHLEY1' in g['detectors_to_plot']) and ('KEITHLEY1' in g['detectors'])):
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'I0_KEITHLEY1'
, 'Title' : 'KEITHLEY1 (I0)'+'=f('+params['Id_X']+')'})
#endif
if (('PL_KEITHLEY2' in g['detectors_to_plot']) and ('KEITHLEY2' in g['detectors'])):
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'I1_KEITHLEY2'
, 'Title' : 'KEITHLEY2 (I1)'+'=f('+params['Id_X']+')'})
#endif
if (('PL_KEITHLEY3' in g['detectors_to_plot']) and ('KEITHLEY3' in g['detectors'])):
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'KEITHLEY3'
, 'Title' : 'KEITHLEY3'+'=f('+params['Id_X']+')'})
#endif
if ('MOENCH' in g['detectors']):
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'KEITHLEY3'
, 'Title' : 'KEITHLEY3'+'=f('+params['Id_X']+')'})
# ............................ BL PRESSURES ........................
print g['detectors_to_plot']
print g['detectors']
print 'type', params['Type']
if (('PL_CAM1_POS' in g['detectors_to_plot']) and ('CAM1_POS' in g['detectors'])):
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'CentroidX_RBV CentroidY_RBV'
, 'Title' : 'Centroid X, Centroid Y '+'=f('+params['Id_X']+')'})
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'SigmaX_RBV SigmaY_RBV'
, 'Title' : 'Sigma X Sigma Y '+'=f('+params['Id_X']+')'})
#endif
#'PLot user detector'
if (('PL_USER_DET' in g['detectors_to_plot']) and ('USER_DET' in g['detectors'])):
y_string=''
for i in range(len(g['User_detector_fda_id'])):
y_string=y_string+' '+g['User_detector_fda_id'][i]
# endfor
print
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'USER DETECTORS '+y_string})
# endif
if (('PL_BL_PRESS' in g['detectors_to_plot']) and ('BL_PRESS' in g['detectors'])):
print g['ID_BL_PRESS']
print len(g['ID_BL_PRESS'])
y_string=' '
for i in range(len(g['ID_BL_PRESS'])):
y_string=y_string+' '+g['ID_BL_PRESS'][i]
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'Beamline pressures'+'=f('+params['Id_X']+')'})
#endif
if (('PL_BL_TEMP' in g['detectors_to_plot']) and ('BL_TEMP' in g['detectors'])):
print g['ID_BL_TEMP']
print len(g['ID_BL_TEMP'])
y_string=' '
for i in range(len(g['ID_BL_TEMP'])):
y_string=y_string+' '+g['ID_BL_TEMP'][i]
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'Beamline temperatures'+'=f('+params['Id_X']+')'})
#endif
# ................. MONO TEMPERATURES ...............
if (('PL_MONO_TEMP' in g['detectors_to_plot']) and ('MONO_TEMP' in g['detectors'])):
# plot first 4 important temperatures
y_string=' '
for i in range(4):
y_string=y_string+' '+g['ID_MONO_TEMP'][i]
# endfor
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'Mono Temp (Theta,T1,T2,TRZ)'+'=f('+params['Id_X']+')'})
# plot all other Temperature sensors
y_string=' '
for i in range(6,len(g['ID_MONO_TEMP'])):
y_string=y_string+' '+g['ID_MONO_TEMP'][i]
# endfor
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'Mono Temp '+'=f('+params['Id_X']+')'})
#endif
# .......... encoders...
if (('PL_MONO_ENC' in g['detectors_to_plot']) and ('MONO_ENC' in g['detectors'])):
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'ROLL1_V ROLL2_V PITCH2_V'
, 'Title' : 'MONO LVDT [V]'+'=f('+params['Id_X']+')'})
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'ROLL1_MUR ROLL2_MUR PITCH2_MUR'
, 'Title' : 'MONO ROLL and PITCH [MUR]'+'=f('+params['Id_X']+')'})
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'ROLL1_VOLT ROLL2_VOLT PITCH2_VOLT'
, 'Title' : 'ROLL1 VOLT ROLL2_VOLT PITCH_VOLT [V]'+'=f('+params['Id_X']+')'})
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'ROLL1_DIFF ROLL2_DIFF PITCH2_DIFF'
, 'Title' : 'ROLL1 DIFF ROLL2_DIFF PITCH_DIFF [MUR]'+'=f('+params['Id_X']+')'})
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : 'T1_DIFF T2_DIFF THETA_DIFF'
, 'Title' : 'T1_DIFF T2_DIFF THETA_DIFF '+'=f('+params['Id_X']+')'})
#endif
if (('PL_ES1_PRESS' in g['detectors_to_plot']) and ('ES1_PRESS' in g['detectors'])):
y_string=' '
for i in range(len(g['ID_ES1_PRESS'])):
y_string=y_string+' '+g['ID_ES1_PRESS'][i]
# endfor
print 'ystring'
print y_string
print 'pt',params['Type']
print 'idy',params['Id_X']
print 'py',params['Id_Y']
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'XBPM4 '+'=f('+params['Id_X']+')'})
#endif
if (('PL_XBPM4' in g['detectors_to_plot']) and ('XBPM4' in g['detectors'])):
# first plot current on 4 pads
y_string=' '
for i in range(len(g['ID_XBPM4'])):
y_string=y_string+' '+g['ID_XBPM4'][i]
# endfor
print 'ystring'
print y_string
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'XBPM4 '+'=f('+params['Id_X']+')'})
# plot position on XBPM
y_string=' '
for i in range(len(g['ID_XBPM4_POS'])):
y_string=y_string+' '+g['ID_XBPM4_POS'][i]
# endfor
print 'ystring'
print y_string
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'Beam position on XBPM4 '+'=f('+params['Id_X']+')'})
#endif
if (('PL_XBPM3' in g['detectors_to_plot']) and ('XBPM3' in g['detectors'])):
y_string=' '
for i in range(len(g['ID_XBPM3'])):
y_string=y_string+' '+g['ID_XBPM3'][i]
# endfor
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'XBPM3 '+'=f('+params['Id_X']+')'})
# plot position on XBPM
y_string=' '
for i in range(len(g['ID_XBPM3_POS'])):
y_string=y_string+' '+g['ID_XBPM3_POS'][i]
# endfor
print 'ystring'
print y_string
write_visualization(f,{ 'Type': params['Type']
, 'X' : params['Id_X']
, 'Y' : params['Id_Y']
, 'DATA' : y_string
, 'Title' : 'Beam position on XBPM3 '+'=f('+params['Id_X']+')'})
#endif
# ............................................. END Special visualizations (1-D)
# ................... write postactions channel type
def post_action_channel_action(channel,value,operation,type,delay):
post_action_channel_action='<postAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="'+channel+'" value="'+value+'" operation="'+operation+'" type="'+type+'" delay="'+delay+'" /> \n '
return post_action_channel_action
def post_action_shell_action(command,exitvalue):
post_action_channel_action='<postAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ShellAction" command="' + command + '" exitValue="'+exitvalue+'" /> \n '
return post_action_channel_action
# ______________ routine to creat strings for action and preaction
def write_shell_action(f,command):
f.write(' <preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ShellAction" checkExitValue="false" command="'+command+'"/>')
# end routine
# _______________________________________________________________--
def write_action_channel_action(f,params):
f.write('<action xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="' + params['Channel']
+ '" value="' + params['Value']
+ '" operation="' + params['Operation']
+ '" type="' + params['Data_type']
+ '" delay="' + params['Delay']+'"/>'+'\n')
# end routine
# _______________________________________________________________--
def write_preaction_channel_action(f,params):
preaction_channel_action = '<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="'+params['channel']+'" value="'+params['value']+'" operation="'+params['operation']+'" type="'+params['type']+'" delay="'+params['delay']+'"/>'+'\n'
f.write(preaction_channel_action)
# ===========================================================
def Write_Variable_Definitions(f,g):
# Write the default vaiables, to be defined in general
f.write('<variable name="K" value="0.0" description="Buffer K spacing for EXAFS k-spacing scans " />')
f.write('<variable name="N_cycles" value="0.0" description="Buffer N_cycles for EXAFS k-spacing scans " />')
f.write('<variable name="NINT" value="0.0" description="Counter for file number of Moche files" />')
# end Write_Variable_Definitions
# ===========================================================
def write_preactions(f,g):
print g['preactions']
print len(g['preactions'])
# write write currentt data file name into EPICS channel
# this is done by use of a shell script
# TMP CHANGES TO CODE 10.11.2018
write_shell_action(f,"/sls/X07MB/data/settings/Scripts/GUI_X07MB/X_X07MB_fda_file_to_EPICS.sh ${FILENAME}") # old version obosolete 14.4.2014 : 10.11.2018 disabled..
# first write the header file (save_phoenix) (tmp disable 10.11.2018)
write_shell_action(f,"/sls/X07MB/data/settings/Scripts/GUI_X07MB/X_X07MB_fda_write_header.py &amp;")
# write header file
# write_shell_action(f,"/sls/X07MB/data/settings/Scripts/GUI_X07MB/X_X07MB_fda_write_header.py -F ${FILENAME}")
# ............ Now write default preactions which arm the data aquisition
for i in range(len(g['preactions'])):
write_preaction_channel_action(f,g['preactions'][i])
# endfor
if 'MOENCH' in g['detectors']:
print(' finally create dir to make sure moench files are write to correct dir')
#write_shell_action(f,"/sls/X07MB/data/x07mbop/Data1/Commissioning/Develop/Develop_Moench/X_X07MB_Moench.py &amp;")
write_shell_action(f,"/sls/X07MB/data/x07mbop/Data1/Commissioning/Develop/Develop_Moench/X_X07MB_Moench.py ")
#endif
# ............ second write the user defined preactions...
if g['CH_INITIAL'][0] <> 'NO_INITIAL_VALUES':
for i in range(len(g['CH_INITIAL'])):
user_preaction={'channel' : g['CH_INITIAL'][i],'value' : str(g['CH_INITIAL_V'][i])
,'operation' : 'put'
,'type' : 'String'
,'delay' : '.1'}
print user_preaction
write_preaction_channel_action(f,user_preaction)
# endfor
# endif
# .................... write default post actions....
def write_default_postactions(f,g):
f.write(post_action_shell_action('/sls/X07MB/data/settings/Scripts/GUI_X07MB/X_X07MB_write_filename_to_file.sh ${FILENAME} &amp;','0'))
# post action for MONCH reset
f.write(post_action_shell_action('/sls/X07MB/data/x07mbop/Data1/Commissioning/Develop/Develop_Moench/X_X07MB_reset_Moench.py &amp;','0'))
f.write(post_action_channel_action('X07MB-OP2:START-CSMPL','1','put','String','0.1'))
# finally close shutter PHOENIX I
f.write(post_action_channel_action('X07MB-OP-WV1:WT_SET','0','put','String','0.1'))
f.write(post_action_channel_action('X07MB-ES1:userCalc4.INPL','0','put','String','2'))
if 'MOENCH' in g['detectors']:
print('missing...')
#endif
#endif
# ==========================================================
def write_detector_actions(f,g):
print g['detector_actions']
print len(g['detector_actions'])
for i in range(len(g['detector_actions'])):
write_action_channel_action(f,g['detector_actions'][i])
# endfor
write_guard(f,{'Channel' : 'ACOAU-ACCU:OP-MODE'
,'Value' : 6 })
# For PHOENIX II chek whether MONO is initialzed
#f.write('<condition channel="' + 'ACOAU-ACCU:OP-MODE' + '" value="' +str(6) + '" type="Integer"/> \n')
#f.write('<condition channel="' + 'X07MA:m1.URIP' + '" value="' +str(1) + '" type="Integer"/> \n')
#f.write('<condition channel="' + 'X07MA:m2.URIP' + '" value="' +str(1) + '" type="Integer"/> \n')
#f.write('<condition channel="' + 'X07MA-PGM:rbkcrashrisk' + '" value="' +str(0) + '" type="Integer"/> \n')
# ______________ routine to write positioner
# ...........................
def write_start_positioner(f,params):
# routine opens positioner (needed to write region positioner with several regions..)
# later add possibility to have different regions here..
# f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'+type+'" name="'+channel_set+'" settlingTime="'+settling_time+'" done="'+channel_done+'" id="'+Id+'"> \n')
if params['Ch_done'] <> 'None':
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'
+ params['Type']+'" name="'
+ params['Ch_set']
+ '" settlingTime="'+params['Settling_time']
+ '" done="'+params['Ch_done']
+ '" id="'
+ params['Id']+'"> \n')
else:
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'
+ params['Type']+'" name="'
+ params['Ch_set']
+ '" settlingTime="'+params['Settling_time']
+ '" readback="'+params['Ch_readback']
+ '" id="'
+ params['Id']+'"> \n')
# ______________ routine to write individual regions for region positioner..
def write_region(f,params):
f.write('<region> \n')
f.write('<preAction xsi:type="ChannelAction" channel="'
+ params['Ch_preaction']
+ '" value="'
+ str(params['Ch_preaction_value'])
+ '" /> \n ')
f.write('<start>' + str(params['V_ini']) + '</start> \n ' )
f.write('<end>'+str(params['V_final'])+'</end>')
f.write('<stepSize>'+str(params['V_delta'])+'</stepSize> \n')
print params.keys()
print 'Not_close_region' in params.keys()
if 'Not_close_region' in params.keys():
print 'do not write region close '
else:
print 'close region (Default)'
f.write('</region> \n')
# endif
# ..........................................................
def write_EXAFS_region(f,g):
# this routine just adds the region definitione needed to define a constant k spacing scan
#
print 'in write_EXAFS'
print g['n_exafs']
print g['e_ex_e_i']
print g['e_ex_e_f'] # Eini
print g['e_ex_k_i'] # k ini
print g['e_ex_k_f'] # k final
print g['e_ex_d_i'] # Delta_E (at begin)
print g['e_ex_ncy']
print g['e_ex_ncy_f']
print g['e_ex_nst']
print g['e_ex_t']
print 'sart loop'
ch_preaction='X07MB-OP2:TOTAL-CYCLES'
for i in range(g['n_exafs']):
print i
# first write region (for now stet # cycles to,
# set cycles to initial value of e_ex_ncy
write_region(f,{'V_ini' : g['e_ex_k_i'][i]
,'V_final' : g['e_ex_k_f'][i]
,'V_delta' : g['e_ex_d_i'][i]
,'Ch_preaction' : ch_preaction
,'Ch_preaction_value' : g['e_ex_ncy'][i]
,'Not_close_region' : 0}) # close region later as we need to add a function here...
#endfor
# Now write the function for EXAFS
f.write('<function> \n')
f.write('<mapping xsi:type="VariableParameterMapping" name="K" variable="K_v" />')
f.write('<mapping xsi:type="ChannelParameterMapping" channel="X07MB-OP2:TOTAL-CYCLES" type="Double" variable="N_Cycles" />')
f.write('<script> \n')
f.write('def calculate(parameter): \n')
f.write(' nc=N_Cycles.getValue() \n') #read current value for cycles
f.write(' nc=nc*'+str(g['e_ex_icy'][i])+' \n') #multiplty with fudge factor
f.write(' N_Cycles.setValue(nc) \n') # write new dwell time in channel
f.write(' E_0='+str(g['e_ex_E_edge'][0])+'\n')
f.write(' h=6.626e-34 \n')
f.write(' m=9.109e-31 \n')
f.write(' k=parameter*1e10 \n')
f.write(' K_v=k*1e-10 \n')
f.write(' hk=(h/(2.*3.1415926))*k \n')
f.write(' E_joule=hk*hk / (2.*m) \n')
f.write(' E_eV=E_joule/1.6021e-19+E_0 \n')
f.write(' return E_eV \n')
f.write('</script> \n')
f.write('</function> \n')
f.write('</region> \n')
# end write_EXAFS_region
# ..........................................................
def write_array_positioner(f,params):
print params
# case 1 use readback value for positioner (this is the default)
if params['Use_done_value'] == 0:
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type=" ArrayPositioner" name="'+params['Channel']
+'" readback="'+params['Channel_rbv']
+'" id="'+params['Id']+'">\n')
# endif
# case 2 use done value for positioner (e.g. for soft motors)
# case II use done value must be 1 if positioner is finished. Use settling time of 0.05 sec. This is the time likely needed to change the done field to 'moving' state.
if params['Use_done_value'] == 1:
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type=" ArrayPositioner"'
+ ' doneDelay="0.05" type="Integer"'
+ ' done="'+ params['Channel_done']+'" settlingTime="0.0"'
# + ' readback="' + params['Channel_rbv'] +'" ' # no in use as soft motor do not have default name convention
+ ' name="' + params['Channel']+'" '
+ ' id="' + params['Id']+'">\n')
# endif
f.write('<positions>' + array_to_string(params['Positions']) + '</positions> \n')
# write preactions...
if params.has_key('Ch_preaction'):
f.write('<preAction xsi:type="ChannelAction" channel="'
+ params['Ch_preaction']
+ '" value="'
+ str(params['Ch_preaction_value'])
+ '" /> \n ')
#endif
f.write('</positioner> \n')
#, 'Channel_done': g['p_done'][i]
#, 'Use_done_value': g['p_done_switch'][i]
def write_linear_positioner(f,params):
# ... routine write linear positioner.
#
# f----- file object for writing...
#
# keys in list params for input are:
#
# 'Channel'
# 'Channel_rbv'
# 'Settling_time'
# 'Id'
# 'V_ini'
# 'V_final'
# 'V_delta'
#
#
# =================================================
if params['Use_done_value'] == 0:
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinearPositioner" name="'+params['Channel']+'" readback="'+params['Channel_rbv']+'" settlingTime="'+params['Settling_time']+'" id="'+params['Id']+'"\n >' )
# endif
if params['Use_done_value'] == 1:
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinearPositioner"'
+ ' doneDelay="0.05" type="Integer"'
+ ' done="' + params['Channel_done'] + '"'
+ ' name="' + params['Channel'] + '"'
# + ' readback="' + params['Channel_rbv'] + '"'# not in use soft motor do not follow name convention
+ ' settlingTime="' +params['Settling_time'] + '"'
+ ' id="'+params['Id']+'"'
+ '\n >' )
# endif
f.write('<start>' + str(params['V_ini']) + '</start> \n')
f.write('<end>' + str(params['V_final']) + '</end> \n')
f.write('<stepSize>' + str(params['V_delta']) + '</stepSize> \n')
f.write('</positioner> \n')
def write_function_positioner_MOENCH(f,params):
# ... routine write fcuntion positioner.
#
# f----- file object for writing...
#
# keys in list params for input are:
#
# 'Channel'
# 'Channel_rbv'
# 'Settling_time'
# 'Id'
# 'V_ini'
# 'V_final'
# 'V_delta'
#
#
# =================================================
if params['Use_done_value'] == 0:
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="FunctionPositioner" name="'+params['Channel']+'" readback="'+params['Channel_rbv']+'" settlingTime="'+params['Settling_time']+'" id="'+params['Id']+'"\n >' )
# endif
if params['Use_done_value'] == 1:
f.write('<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinearPositioner"'
+ ' doneDelay="0.05" type="Integer"'
+ ' done="' + params['Channel_done'] + '"'
+ ' name="' + params['Channel'] + '"'
# + ' readback="' + params['Channel_rbv'] + '"'# not in use soft motor do not follow name convention
+ ' settlingTime="' +params['Settling_time'] + '"'
+ ' id="'+params['Id']+'"'
+ '\n >' )
# endif
f.write('<start>' + str(params['V_ini']) + '</start> \n')
f.write('<end>' + str(params['V_final']) + '</end> \n')
f.write('<stepSize>' + str(params['V_delta']) + '</stepSize> \n')
f.write('<function> \n')
f.write('<mapping xsi:type="VariableParameterMapping" name="NINT" variable="N_IN" />')
f.write('<mapping xsi:type="ChannelParameterMapping" channel="X07MB-ES1-SD1:cam1:FileNumber" variable="A" />')
f.write('<script> \n')
f.write('def calculate(parameter): \n')
f.write(' N_OUT=A.getValue()+1 \n') #read current value for cycles
f.write(' A.setValue(N_OUT) \n') #multiplty with fudge factor
f.write(' return N_OUT \n')
f.write('</script> \n')
f.write('</function> \n')
f.write('</positioner> \n')
# end fucntion_positiner_MOENCH
def write_all_detectors(f,g):
print g['detectors']
# .............. First store set values of standard positioner:
for i in range(len(g['p_channel'])):
if g['p_id'][i] <> ' ': # change 3.5.2012: do not write positioniner,
# if there is not positioner
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['p_channel'][i]
,'Id' : g['p_id'][i] +'_set'})
#endif
# endfor
# the write a few other standard detectors as well:
# in case CCD's are used write the number of the image
if 'MOENCH' in g['detectors']:
# special case for using Moench detector plot also the file number of general file
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-ES1-SD1:cam1:FileNumber_RBV'
,'Id' : 'MOENCH_FN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-ES1-SD1:TIFF1:FileNumber_RBV'
,'Id' : 'MOENCH_TIFF_FN'})
#endif
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['e_channel'] ############## general g
,'Channel' : 'X07MB-OP-MO:E-SET' ############## PHOENIX ###########
# ,'Channel' : 'X07MA-PHS-E:GO.A' ############## XTREME ###########
,'Id' : 'Energy_set'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP-MO:BEAM-OFS'
,'Id' : 'Mono_offset'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'ARIDI-PCT:CURRENT'
,'Id' : 'I_SLS'})
# write user defined detectors
if g['CH_User_detector'] <> ['noUserDetector']:
for i in range(len(g['CH_User_detector'])):
print i
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['CH_User_detector'][i]
,'Id' : g['User_detector_fda_id'][i]})
#endfor
#endif
# write fluo detectors...................
# first set some default values for the case of no FLUO detector
n_det_vortex = 0
n_roi_vortex = -1
channel_roi_vortex = -1
id_roi_vortex = '-1'
id_trueicr_vortex = '-1'
id_icr_vortex = '-1'
id_ocr_vortex = '-1'
id_eltm_vortex = -1
id_ertm_vortex = -1
# write Keithleys............
if 'KEITHLEY1' in g['detectors']:
print ' write Detector Keithley 1'
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_07:MEAN'
,'Id' : 'I0_KEITHLEY1'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP-KEITH1:setGain'
,'Id' : 'KEITHLEY1_GAIN'})
#endif
if 'KEITHLEY2' in g['detectors']:
print ' write Detector Keithley 2'
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_08:MEAN'
,'Id' : 'I1_KEITHLEY2'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP-KEITH2:setGain'
,'Id' : 'KEITHLEY2_GAIN'})
#endif
if 'KEITHLEY3' in g['detectors']:
print ' write Detector Keithley 3'
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_06:MEAN'
,'Id' : 'KEITHLEY3'})
#write_detector(f,{'Det_type' : 'ScalarDetector'
# ,'Data_type' : 'Double'
# ,'Channel' : 'X07MB-OP-KEITH3:setGain'
# ,'Id' : 'KEITHLEY3_GAIN'})
#endif
if 'XBPM3' in g['detectors']:
print ' write Detector XBPM3 '
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2:LCAD3-GAIN'
,'Id' : 'XBPM3_GAIN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_14:CUR-MEAN'
,'Id' : 'XBPM3_SAI14_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_15:CUR-MEAN'
,'Id' : 'XBPM3_SAI15_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_16:CUR-MEAN'
,'Id' : 'XBPM3_SAI16_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_17:CUR-MEAN'
,'Id' : 'XBPM3_SAI17_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP-BPM3:POSX'
,'Id' : 'XBPM3_POSX'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP-BPM3:POSY'
,'Id' : 'XBPM3_POSY'})
#endif
if 'XBPM4' in g['detectors']:
print ' write Detector XBPM 4'
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2:LCAD3-GAIN'
,'Id' : 'XBPM4_GAIN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_19:CUR-MEAN'
,'Id' : 'XBPM4_SAI19_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_20:CUR-MEAN'
,'Id' : 'XBPM4_SAI20_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_21:CUR-MEAN'
,'Id' : 'XBPM4_SAI21_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP2-SAI_22:CUR-MEAN'
,'Id' : 'XBPM4_SAI22_CUR_MEAN'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP-BPM4:POSX'
,'Id' : 'XBPM4_POSX'})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : 'X07MB-OP-BPM4:POSY'
,'Id' : 'XBPM4_POSY'})
#endif
# ........... vortex 4-element
if 'Vortex' in g['detectors']:
n_det = 4
[n_det_vortex,n_roi_vortex,channel_roi_vortex
,id_roi_vortex,channel_roi_vortex_dxp,id_roi_vortex_dxp,id_icr_vortex,id_trueicr_vortex,id_ocr_vortex
,id_eltm_vortex,id_ertm_vortex]=write_vortex(f,g,n_det)
else:
# The next line makes sure that the variables will be defined in any case .
# The will be overwriten with reasonable numbers, in case either KETEK or ROENTEK are chosen
[n_det,n_det_vortex,n_roi_vortex,channel_roi_vortex,id_roi_vortex,channel_roi_vortex_dxp,id_roi_vortex_dxp,id_icr,id_true_icr_vortex,id_ocr,id_eltm,id_ertm]=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
#endif
print n_roi_vortex
# ........... Roentex via XMAP 1-element
if 'ROENTEC_XMAP' in g['detectors']:
n_det=1
[n_det_vortex,n_roi_vortex,channel_roi_vortex
,id_roi_vortex,channel_roi_vortex_dxp,id_roi_vortex_dxp,id_icr_vortex,id_trueicr_vortex,id_ocr_vortex
,id_eltm_vortex,id_ertm_vortex]=write_vortex(f,g,n_det)
#endif
print id_roi_vortex
print n_det
# ........... KETEK via XMAP 1-element
if 'KETEK_XMAP' in g['detectors']:
n_det=1
[n_det_vortex,n_roi_vortex,channel_roi_vortex
,id_roi_vortex,channel_roi_vortex_dxp,id_roi_vortex_dxp,id_icr_vortex,id_trueicr_vortex,id_ocr_vortex
,id_eltm_vortex,id_ertm_vortex]=write_vortex(f,g,n_det)
#endif
print id_roi_vortex
print n_det
# beamline pressures
if 'BL_PRESS' in g['detectors']:
for i in range(len(g['ID_BL_PRESS'])):
print i,g['CH_BL_PRESS'][i],g['ID_BL_PRESS'][i]
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['CH_BL_PRESS'][i]
,'Id' : g['ID_BL_PRESS'][i]})
# endif
if 'BL_TEMP' in g['detectors']:
for i in range(len(g['ID_BL_TEMP'])):
print i,g['CH_BL_TEMP'][i],g['ID_BL_TEMP'][i]
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['CH_BL_TEMP'][i]
,'Id' : g['ID_BL_TEMP'][i]})
# endif
if 'MONO_TEMP' in g['detectors']:
for i in range(len(g['ID_MONO_TEMP'])):
print i,g['CH_MONO_TEMP'][i],g['ID_MONO_TEMP'][i]
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['CH_MONO_TEMP'][i]
,'Id' : g['ID_MONO_TEMP'][i]})
# endif
if 'MONO_ENC' in g['detectors']:
for i in range(len(g['ID_MONO_ENC'])):
print i,g['CH_MONO_ENC'][i],g['ID_MONO_ENC'][i]
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['CH_MONO_ENC'][i]
,'Id' : g['ID_MONO_ENC'][i]})
# endif
if 'ES1_PRESS' in g['detectors']:
for i in range(len(g['ID_ES1_PRESS'])):
print i,g['CH_ES1_PRESS'][i],g['ID_ES1_PRESS'][i]
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['CH_ES1_PRESS'][i]
,'Id' : g['ID_ES1_PRESS'][i]})
# endif
# write detector group microscope position
if 'CAM1_POS' in g['detectors']:
for i in range(len(g['ID_CAM1_POS'])):
print i
print i,g['CH_CAM1_POS'][i],g['ID_CAM1_POS'][i]
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : g['CH_CAM1_POS'][i]
,'Id' : g['ID_CAM1_POS'][i]})
# endif
return n_det_vortex,n_roi_vortex,channel_roi_vortex,id_roi_vortex,channel_roi_vortex_dxp,id_roi_vortex_dxp,id_icr_vortex,id_trueicr_vortex,id_ocr_vortex,id_eltm_vortex,id_ertm_vortex
#............................... end ........
def write_detector(f,params):
print params
if params['Det_type'] =='ScalarDetector':
f.write('<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'
+ params['Det_type']
+ '" type="' + params['Data_type']
+ '" name="' + params['Channel']
+ '" id="' + params['Id']
+ '" /> \n ')
# endif
if params['Det_type'] =='ArrayDetector':
f.write('<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'
+ params['Det_type']
+ '" arraySize="' + params['arraySize']
+ '" name="' + params['Channel']
+ '" id="' + params['Id']
+ '" /> \n ')
if params['Det_type'] =='String':
f.write('<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="'
+ params['Det_type']
+ '" type="' + params['Data_type']
+ '" name="' + params['Channel']
+ '" id="' + params['Id']
+ '" /> \n ')
# end routine
# =============================================================
def write_vortex(f,g,n_det):
# this routine write all detectors for the VORTEX detector
# Author T.Huthwelker, October 2011
# ------------------------------------------------
# input
# f file object (xml file)
# g readout from user gui as defined in routine get_channels
# g is a structures variable (i.e. variable with directory)
# from g we need these entries
# g['n_roi_for_xas'] : Roi number, which is used in XAS measurements
# ------------------------------------------------
# -------- configuration parameter for thie routine, might be added as input parameter later.
n_roi = g['n_roi'] # get number of rois as determined from XMAP software.....
# the number of rois from the actual entries in the XMAP software
ch_base_vortex=g['beamline']+'-XMAP:mca'
ch_base_vortex_dxp=g['beamline']+'-XMAP:dxp'
#..variable channel_roi contains epics channels fo all rois available
# now create 2-D list to store all rois for all detectors and
# as the corresponding id as used in XML script. Here we nake sure that we define only the ID values for the rois used later
# This will alow in later use of these variable, just to work through the list id_roi_this_detector.
# for the case XMAP_save_only_xas_roi, we reduce the list to one single value in list id_roi_this_detector.
# UNfortunatly, we need to reset the variable n_roi to 1, as we use only one single roi here...
# It is a quite bad looking code...
# g['Id_XMAP_roi_by_name'] stores roi names ast list
# g[XMAP_roi_numbers'] stores number of rois in Id list as as list
# new list based code...
print '......... use all rois as detectors...'
print g['XMAP_save_only_xas_roi']
print g['Id_XMAP_roi_by_name']
print g['XMAP_roi_numbers']
print g['n_roi']
d_list =g['d_list_fluo'] # get the list, which contains the numbers of the choosen detectors
n_det_from_list = len(d_list) # only local variable. In principle g['n_det_fluo'] should contain the same number...
#for i in range(n_det): # =============== CHANGE
# 16.4.2015 start adding roi readout from SCA variable
det_nr=-1 # counts detectors used, if zero start ne list, if higher, add elemenst to list
print 'ddddddddddddddddd'
#print ch_base_vortex
for i in d_list:
det_nr=det_nr+1
# inner loop: walk through all regions of interest....
for j in range(len(g['XMAP_roi_numbers'])):
print 'j',j
print 'list',g['XMAP_roi_numbers']
if j == 0:
# create 1st element of list
rois_this_detector = [ch_base_vortex+str(i)+'.R'+str( g['XMAP_roi_numbers'][j] )]
rois_this_detector_dxp = [ch_base_vortex_dxp+str(i)+':SCA'+str( g['XMAP_roi_numbers'][j] )+'Counts']
if g['XMAP_name_convention'].lower() == 'roi':
id_roi_this_detector=['D'+str(i)+'_'+g['Id_XMAP_roi_by_name'][j]]
id_roi_this_detector_dxp=['D'+str(i)+'_'+g['Id_XMAP_roi_by_name'][j] +'_dxp']
else:
id_roi_this_detector=['D'+str(i)+'_ROI_'+str( g['XMAP_roi_numbers'][j] )]
id_roi_this_detector_dxp=['D'+str(i)+'_ROI_'+str( g['XMAP_roi_numbers'][j] ) +'_dxp']
#endelse
else:
# for list for det i
rois_this_detector.append(ch_base_vortex+str(i)+'.R'+str( g['XMAP_roi_numbers'][j] ))
rois_this_detector_dxp.append(ch_base_vortex_dxp+str(i)+':SCA'+str( g['XMAP_roi_numbers'][j] )+'Counts' )
if g['XMAP_name_convention'].lower() == 'roi':
id_roi_this_detector.append('D'+str(i)+'_'+g['Id_XMAP_roi_by_name'][j])
id_roi_this_detector_dxp.append('D'+str(i)+'_'+g['Id_XMAP_roi_by_name'][j] +'_dxp')
else:
id_roi_this_detector.append('D'+str(i)+'_ROI_'+str( g['XMAP_roi_numbers'][j] ))
id_roi_this_detector_dxp.append('D'+str(i)+'_ROI_'+str( g['XMAP_roi_numbers'][j] ) +'_dxp' # endfor
)
# endelse
# endelse
# endfor
# now add rois to fill 2-D list
if det_nr == 0:
channel_roi_vortex = [rois_this_detector]
id_roi_vortex = [id_roi_this_detector]
channel_roi_vortex_dxp = [rois_this_detector_dxp]
id_roi_vortex_dxp = [id_roi_this_detector_dxp]
else:
channel_roi_vortex.append(rois_this_detector)
id_roi_vortex.append(id_roi_this_detector)
channel_roi_vortex_dxp.append(rois_this_detector_dxp)
id_roi_vortex_dxp.append(id_roi_this_detector_dxp)
# endelse
# endfor
# now we have created a list with all chhoses detectors from the list det_nr
print 'channel_roi_vortex',channel_roi_vortex
print ' id_roi_vortex' ,id_roi_vortex
print 'channel_roi_vortex_dxp',channel_roi_vortex_dxp
print 'id_roi_vortex_dxp',id_roi_vortex_dxp
print 'det_nr',det_nr
# now write all detectors to file...
#
#for i in range(n_det): # =============== CHANGE
# Now loop goes through the list which is generated above and contains only the channels/detectors choosen
# Therefore here we count only in range n_det_from_list, the index i is here lits number of the generated lists.
for i in range(n_det_from_list):
for j in range(len(g['XMAP_roi_numbers'])):
print 'next j',j
print g['XMAP_roi_numbers']
print range(len(g['XMAP_roi_numbers']))
print i,j,'000000000000000000000000000000000'
# write MCA channel detector
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : channel_roi_vortex[i][j]
,'Id' : id_roi_vortex[i][j]})
# write sca channel roi detector
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : channel_roi_vortex_dxp[i][j]
,'Id' : id_roi_vortex_dxp[i][j]})
# endif
# endfor
# endfor
print channel_roi_vortex
print id_roi_vortex
# Finally write all detector parameters relevant to standard user.
# create FDA Id for ICR, OCR, ELTIM and ERTIM
# 19.5.2012 add dead time to default detectors.
# give names with DD to technical parameters to ease data extraction ...
# next loop loops needs to adress the physical number of the detectors in the index again there fore loop
# loop thorugh the entries of the full list.
#for i in range(n_det): # =============== CHANGE
det_nr=-1 # counts detectors used, if zero start ne list, if higher, add elemenst to list
for i in d_list:
det_nr=det_nr+1
#print i
if det_nr == 0:
# creat the ID' for the different channels
id_trueicr = [ 'D'+str(i)+'_TrueICR' ]
id_icr = [ 'D'+str(i)+'_ICR' ]
id_ocr = [ 'D'+str(i)+'_OCR' ]
id_eltm = [ 'DD'+str(i)+'_ELTM' ]
id_ertm = [ 'DD'+str(i)+'_ERTM' ]
id_dtim = [ 'DD'+str(i)+'_DTIM' ]
id_dtim = [ 'DD'+str(i)+'_DTIM' ]
# create a list with the channels for the id's
ch_icr = [ g['beamline']+'-XMAP:dxp'+str(i)+':InputCountRate' ]
ch_ocr = [ g['beamline']+'-XMAP:dxp'+str(i)+':OutputCountRate' ]
ch_eltm = [ g['beamline']+'-XMAP:mca'+str(i)+'.ELTM' ]
ch_ertm = [ g['beamline']+'-XMAP:mca'+str(i)+'.ERTM' ]
ch_dtim = [ g['beamline']+'-XMAP:mca'+str(i)+'.DTIM' ]
else:
# ADD ID's
id_trueicr.append('D'+str(i)+'_TrueICR')
id_icr.append('D'+str(i)+'_ICR')
id_ocr.append('D'+str(i)+'_OCR')
id_eltm.append('DD'+str(i)+'_ELTM')
id_ertm.append('DD'+str(i)+'_ERTM')
id_dtim.append('DD'+str(i)+'_DTIM')
# ADD Channels
ch_icr.append( g['beamline']+'-XMAP:dxp'+str(i)+':InputCountRate' )
ch_ocr.append( g['beamline']+'-XMAP:dxp'+str(i)+':OutputCountRate' )
ch_eltm.append( g['beamline']+'-XMAP:mca'+str(i)+'.ELTM' )
ch_ertm.append( g['beamline']+'-XMAP:mca'+str(i)+'.ERTM' )
ch_dtim.append( g['beamline']+'-XMAP:mca'+str(i)+'.DTIM' )
# endelse
# endfor
print id_icr
print ch_icr
print 'kkkkkkkkkkkkk'
print id_ocr
#
#Now loop goes through the list which is generated above and contains only the channels/detectors choosen
# Therefore here we count only in range n_det_from_list, the index i is here lits number of the generated lists.
for i in range(n_det_from_list):
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : ch_icr[i]
,'Id' : id_icr[i]})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : ch_ocr[i]
,'Id' : id_ocr[i]})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : ch_eltm[i]
,'Id' : id_eltm[i]})
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : ch_ertm[i]
,'Id' : id_ertm[i] })
write_detector(f,{'Det_type' : 'ScalarDetector'
,'Data_type' : 'Double'
,'Channel' : ch_dtim[i]
,'Id' : id_dtim[i] })
#endfor
#print n_det,n_roi,channel_roi_vortex,id_roi_vortex,id_icr,id_ocr,id_eltm,id_ertm
#.......... finally generate detectors for the full spectra..........
print g['XMAP_save_spectra']
if g['XMAP_save_spectra'] == 1:
print ' write detector to save Flourescence spectra'
for i in d_list:
print i
write_detector(f,{'Det_type' : 'ArrayDetector'
,'arraySize' : '2048'
,'Channel' : g['beamline']+'-XMAP:mca'+str(i)+'.VAL'
,'Id' : 'Spec_'+str(i)})
# endfor
# endif
return n_det,n_roi,channel_roi_vortex,id_roi_vortex,channel_roi_vortex_dxp,id_roi_vortex_dxp,id_icr,id_trueicr,id_ocr,id_eltm,id_ertm
# end routine write_vortex
# ==================================================================
#
#
# MANIPULATIONS..
#
#
#
# ===================================================================
def write_manip_calc_TrueICR(f,params):
# .... call of routine:
#
# write_manip_calc_TrueICR(f,{ , 'Id_icr':'Det1_icr'
# , 'Id_ocr':'DET1_ocr'
# , 'id_elapsedLT:'Elap_real''
# , 'Id_out':'Det_corr'})
# f File object for xml output
# 'id_roi' ------ ID (in FDA) for ROI, which is processed (input manipulation)
# 'id_icr' ------ ID for ICR :'Det1_icr' (input manipulation)
# 'id_ocr' ------ ID for OCR (input manipulation)
# 'id_elapsedTR' ------ ID elapsed real time for detector which is processed(input manipulation)
#
# 'id_out ------ ID of results (ouput manipulation)
f.write('<manipulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScriptManipulation" id="'+params['Id_out']+'"> \n ')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_icr']+'" variable="b"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_ocr']+'" variable="c"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_elapsedTime']+'" variable="d"/> \n')
f.write('<script>import math \n')
f.write('def process(b,c,d): \n')
f.write(' DeadTime = 1.182e-7 \n')
f.write(' ICR = b \n')
f.write(' OCR = c \n')
f.write(' \n')
f.write(' if (OCR) == 0: \n')
f.write(' box = 0 \n')
f.write(' return box \n')
f.write(' if (ICR) == 0: \n')
f.write(' box = 0 \n')
f.write(' return box \n')
f.write(' \n')
f.write(' Test = 1.e8 \n')
f.write(' TestICR = ICR \n')
f.write(' n = 0 \n')
f.write(' while ((Test &gt; DeadTime) and (n &lt; 30)): \n')
f.write(' TrueICR = ICR * math.exp(TestICR * DeadTime) \n')
f.write(' Test = (TrueICR - TestICR) / TestICR \n')
f.write(' TestICR = TrueICR \n')
f.write(' n = n + 1 \n')
f.write(' if (OCR) &lt;&gt; 0: \n')
f.write(' box = TrueICR \n')
f.write(' if (OCR*d) == 0: \n')
f.write(' box=0.0 \n')
f.write(' return box </script> \n')
f.write('\n')
f.write('</manipulation> \n ')
def write_manip_dead_time_roi(f,params):
# .... call of routine:
#
# write_manip_dead_time_peamp(f,{'Id_roi':'Det1ROI1'
# , 'Id_icr':'Det1_icr'
# , 'Id_ocr':'DET1_ocr'
# , 'id_elapsedLT:'Elap_real''
# , 'Id_out':'Det_corr'})
#
# f File object for xml output
# 'id_roi' ------ ID (in FDA) for ROI, which is processed (input manipulation)
# 'id_icr' ------ ID for ICR :'Det1_icr' (input manipulation)
# 'id_ocr' ------ ID for OCR (input manipulation)
# 'id_elapsedTR' ------ ID elapsed real time for detector which is processed(input manipulation)
#
# 'id_out ------ ID of results (ouput manipulation)
f.write('<manipulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScriptManipulation" id="'+params['Id_out']+'"> \n ')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_roi']+'" variable="a"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_icr']+'" variable="b"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_ocr']+'" variable="c"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_elapsedTime']+'" variable="d"/> \n')
f.write('<script>import math \n')
f.write('def process(a,b,c,d): \n')
f.write(' DeadTime = 1.182e-7 \n')
f.write(' ICR = b \n')
f.write(' OCR = c \n')
f.write(' \n')
f.write(' if (OCR) == 0: \n')
f.write(' box = 0 \n')
f.write(' return box \n')
f.write(' if (ICR) == 0: \n')
f.write(' box = 0 \n')
f.write(' return box \n')
f.write(' \n')
f.write(' Test = 1.e8 \n')
f.write(' TestICR = ICR \n')
f.write(' n = 0 \n')
f.write(' while ((Test &gt; DeadTime) and (n &lt; 30)): \n')
f.write(' TrueICR = ICR * math.exp(TestICR * DeadTime) \n')
f.write(' Test = (TrueICR - TestICR) / TestICR \n')
f.write(' TestICR = TrueICR \n')
f.write(' n = n + 1 \n')
f.write(' if (OCR*d) &lt;&gt; 0: \n')
f.write(' box = a * TrueICR / OCR / d \n')
f.write(' if (OCR*d) == 0: \n')
f.write(' box=0.0 \n')
f.write(' return box </script> \n')
f.write('\n')
f.write('</manipulation> \n ')
def write_manip_fyxas(f,params):
f.write('<manipulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScriptManipulation" id="'+params['Id_out']+'" \n>')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params('Id_roi')+'" variable="a"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params('Id_icr')+'" variable="b"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params('Id_ocr')+'" variable="c"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params('Id_io')+'" variable="d"/> \n')
f.write('<script>import math \n ')
f.write('def process(a,b,c,d): \n ')
f.write(' return (a*c/b)/d</script> \n ')
f.write('</manipulation> \n ')
# --------------------------------------
def write_manip_divide_channels(f,params):
print params
f.write('<manipulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScriptManipulation" id="'+params['Id_out']+'" \n>')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_1']+'" variable="a"/> \n')
f.write('<mapping xsi:type="IDParameterMapping" refid="'+params['Id_2']+'" variable="b"/> \n')
f.write('<script>import math \n')
f.write('def process(a,b): \n ')
f.write(' return (a/b)</script> \n ')
f.write('</manipulation> \n ')
# ----------------------------------------------------------------------------------------
def write_manip_sum_vortex(f,params):
#
#
# routine calculates the summ of all four vortex detctors
# .... call of routine:
#
# write_manip_dead_time_roi(f,{'Id_roi' : id_roi_vortex[j][k]
# , 'Id_icr' : id_icr_vortex[j]
# , 'Id_ocr' : id_ocr_vortex[j]
# , 'Id_elapsedLT': id_eltm_vortex[j]
# , 'Id_out' : id_roi_vortex[j][k]+'_corr'})
print 'routine write_manip_sum_vortex'
print params
f.write('<manipulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScriptManipulation" id="'+params['Id_out']+'"> \n ')
# define the mapping of all variables...
string_for_params=''
n_det=0
for ID_ROI in params['Id_roi']:
f.write('<mapping xsi:type="IDParameterMapping" refid="' + ID_ROI + ' " variable="'+ID_ROI+'"/> \n')
string_for_params=string_for_params+ID_ROI+' , '
n_det=n_det+1
#endfor
##for Id_elapsedLT in params['Id_elapsedLT']:
## print Id_elapsedLT
## f.write('<mapping xsi:type="IDParameterMapping" refid="'+Id_elapsedLT+'" variable="'+Id_elapsedLT+'"/> \n')
## string_for_params=string_for_params+Id_elapsedLT+' , '
# endfor
# remove coma at end of string_for_params
string_for_params=string_for_params[0:len(string_for_params)-3]
f.write('<script>import math \n')
f.write('def process('+string_for_params+'): \n')
#f.write(' DeadTime = 1.182e-7 \n')
f.write(' SUM_DET = 0.\n')
for i in range(n_det):
f.write(' SUM_DET = SUM_DET + '
+ params['Id_roi'][i]
+'\n')
# endfor
f.write(' return SUM_DET </script> \n')
f.write('\n')
f.write('</manipulation> \n ')
# ===================================================================
def read_list(detectors, e_active,e_i,E_f,Delta_e, p_active,Scanx, Scany, Theta, Trx, TRZ ):
f = open('list.txt', "r")
box=' '
box = f.readline()
#print 'box',box
# .............................. read 2 detectors..........
detectors[0]=f.readline()
detectors[1]=f.readline()
detectors[0] =detectors[0][0:len(detectors[0])-2]
detectors[1] =detectors[1][0:len(detectors[1])-2]
#print 'detectors',detectors
# .............................. read energy arrays ..........
box = f.readline()
#print box
# r_box=create_real_zeros(5)
for i in range(5):
box = f.readline()
r_box=box.split()
#print 'r_box',r_box
e_active[i]=r_box[0]
e_i[i]=r_box[1]
e_f[i]=r_box[2]
e_delta[i]=r_box[3]
#print e_active
#print e_i
#print e_f
#print e_delta
# ......................................................................
# o.k. tro here
def get_channels(scan_type):
#
# This routine reads the epics chanels and stores the inout data into the correct
# variables in the python script epics chanels to be defined later.
# detectors, e_active,e_i,E_f,Delta_e, p_active,Scanx, Scany, Theta, Trx, TRZ ):
#
# Author T.Huthwelker October 2011
#
#
# INPUT scan_type defines the type of scan.
# needs to be defined in the scan
# currently we have
#
# 'IMAGE' (for imaging) X_X07MB_regions.py
#
# 'SPECTRA' spectra, all data sets into one single data file (file X_X07MB_XAS_points.py)
#
# 'SPETRA_QUEUE' spectra, but each spectrum into a singl data file
#
# currently only used to check for consistencies of data input.
# On long term, we can minimize the number of chanles to be read
#import os
##os.system ("ls -altr")
#try:
# from CaChannel import *
# from epicsMotor import *
# from epicsPV import *
# import time
# import string
#except:
# try:
# sys.path.insert(0, os.path.expandvars("$SLSBASE/sls/lib/python22/CaChannel"))
# sys.path.insert(0, os.path.expandvars("/exchange/share/mXAS/pyth/mod"))
# from CaChannel import *
# from epicsPV import *
# except:
# os.system ("xkbbell")
# os.system ("xmessage -nearmouse -timeout 30 \
# -buttons \"\" \"epicsPV or CaChannel module cannot be found\"")
# sys.exit(1)
# # endtry
# endtry
beamline='X07MB'
filename = get_epicsPV(beamline+'-PC-PSCAN:FdaFname')
# .... remove all blanks from filenam
filename=filename.replace(' ', '')
# ......... define general Channels....
# ........ define scan type
#scan_type=['XAS_several_points'] # options are
# 'XAS_several_points' : several XAS spectra
# at different points
# 'E_Image' : image for a given (or several energies)
n_roi_for_xas = int(get_epicsPV(beamline+'-PC-PSCAN:FdaXasRoi'))
# this is the roi we are choosing
# for taking the XAS spectrum (starts at 0)
XMAP_save_only_xas_roi = int(get_epicsPV(beamline+'-PC-PSCAN:FdaSRoi'))
# if 1 we store ony roi choosen for XAS,
# other wise store all rois defined.
XMAP_save_spectra = int(get_epicsPV(beamline+'-PC-PSCAN:FdaSSpec'))
# flag whether we store fluo spectra or not.
# ........... number of scans
number_of_executions = int(get_epicsPV(beamline+'-PC-PSCAN:FdaNexec'))
# number of repetitions in scan
# ............ read detectors....
# create a list of detetectors used in experiment
detectors=['no_Detector'] # define list of detectors by creating dumma
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:USE_ES1_SD1')):
detectors.append('MOENCH')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:USE_PS1_CAM1')):
detectors.append('PS1_CAM1')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:USE_PS2_CAM1')):
detectors.append('PS1_CAM2')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:VORT_XM')):
detectors.append('Vortex')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:ROENT_XM')):
detectors.append('ROENTEC_XMAP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:KETEK_XM')):
# Add KETK as option. This detector uses only Channel 2 of 4 XMAP Channels
detectors.append('KETEK_XMAP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:KEITH1')):
detectors.append('KEITHLEY1')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:KEITH2')):
detectors.append('KEITHLEY2')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:KEITH3')):
detectors.append('KEITHLEY3')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:BL_PRESS')):
detectors.append('BL_PRESS')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:BL_TEMP')):
detectors.append('BL_TEMP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:ES1_PRESS')):
detectors.append('ES1_PRESS')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:MO_ENC')):
detectors.append('MONO_ENC')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:MO_TEMP')):
detectors.append('MONO_TEMP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:XBPM3')):
detectors.append('XBPM3')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:XBPM4')):
detectors.append('XBPM4')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:XBPM3')):
detectors.append('XBPM3')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:CAM1_POS')):
detectors.append('CAM1_POS')
#endif
print get_epicsPV(beamline+'-PC-PSCAN:PL_USER_DET')
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_USER_DET')):
print 'gggggggg'
detectors.append('USER_DET')
#endif
#print detectors
if len(detectors) == 1:
error_stop('!!!!!!!!!!! no detector choosen')
# endif
# create a list of plots to be choosen
detectors_to_plot=['no_Plot'] # define list of detectors by creating dumma
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_VORT_XM')):
detectors_to_plot.append('PL_Vortex')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_ROENT_XM')):
detectors_to_plot.append('PL_ROENTEC_XMAP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_KETEK_XM')):
detectors_to_plot.append('PL_KETEK_XMAP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_KEITH1')):
detectors_to_plot.append('PL_KEITHLEY1')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_KEITH2')):
detectors_to_plot.append('PL_KEITHLEY2')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_KEITH3')):
detectors_to_plot.append('PL_KEITHLEY3')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_BL_PRESS')):
detectors_to_plot.append('PL_BL_PRESS')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_BL_TEMP')):
detectors_to_plot.append('PL_BL_TEMP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_ES1_PRESS')):
detectors_to_plot.append('PL_ES1_PRESS')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_MO_ENC')):
detectors_to_plot.append('PL_MONO_ENC')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_MO_TEMP')):
detectors_to_plot.append('PL_MONO_TEMP')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_XBPM3')):
detectors_to_plot.append('PL_XBPM3')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_XBPM4')):
detectors_to_plot.append('PL_XBPM4')
#endif
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_CAM1_POS')):
detectors_to_plot.append('PL_CAM1_POS')
if 1==int(get_epicsPV(beamline+'-PC-PSCAN:PL_USER_DET')):
detectors_to_plot.append('PL_USER_DET')
# GET NAMING CONVENTION FOR FDA
# if channel X07MB-PC-PSCAN:FdaNConv = 1 get names from XMAP rois
# other wise use standard definition det_i_roi_j
if get_epicsPV(beamline+'-PC-PSCAN:FdaNConv') == 1:
XMAP_name_convention= 'ROI' # if ROI is choosen, the column name in data file is the
else:
XMAP_name_convention= ' '
# endelse
#... if XMAP is used determine the number of ROIS chosen:
if ('Vortex' in detectors) and ('ROENTEC_XMAP' in detectors) and ('KETEK_XMAP' in detectors):
error_stop('!!!!!!!!!!! ERROR CANNOT USE BOTH VORTEX AND ROENTEC WITH XMAP ')
# endif
if ('Vortex' in detectors) and ('KETEK_XMAP' in detectors):
error_stop('!!!!!!!!!!! ERROR CANNOT USE BOTH VORTEX AND ROENTEC WITH XMAP ')
# endif
if ('ROENTEC_XMAP' in detectors) and ('KETEK_XMAP' in detectors):
error_stop('!!!!!!!!!!! ERROR CANNOT USE BOTH VORTEX AND ROENTEC WITH XMAP ')
# endif
n_roi=-1 # set to -1 as not yet defined, will be reset if XMAP is used, otherwise -1 means error
n_det_fluo = -1 # set to -1 as not yet defined, will be reset if XMAP is used, otherwise -1 means error
Id_XMAP_roi_by_name=-1
d_list_fluo =[-1] # changed 10.10. Need to give initial definition for d_list_fluo,
# as it will remain undefined of no Fluo detector is used.
# Define channel 0 as number for unused channel'
XMAP_roi_numbers =-1
if ('Vortex' in detectors) or ('ROENTEC_XMAP' in detectors) or ('KETEK_XMAP' in detectors):
if ('Vortex' in detectors):
n_det_fluo = 4 # do script for 4 detectors (VORTEX)
d_list_fluo =[1,2,3,4]
# endif
if ('ROENTEC_XMAP' in detectors):
n_det_fluo = 1 # do script for 1 detector (ROENTEC )
d_list_fluo =[1] # roentek by default in XMAP Channel # 1
# endif
if ('KETEK_XMAP' in detectors):
n_det_fluo = 1 # do script for 1 detector (Ketek )
d_list_fluo =[2] # Ketek by default in XMAP channel # 2
# endif
print 'analyse XMAP '
# case 1 roentec and vortex, use ROI's as defined for detector 1
if ('Vortex' in detectors) or ('ROENTEC_XMAP' in detectors):
print 'vortex assuming that rois defined for detector 1 are equal for all detectors...'
n_roi=0
for i1 in range(31):
this_name=get_epicsPV(beamline+'-XMAP:mca1.R'+str(i1)+'NM')
# note that this assumes that the
# same roi name is choosen for all four spectra.
# XMAP allow different labels for each roi and each detector.
# ..... remove blanks from string
box=''
for i2 in range(len(this_name.split())):
box=box+this_name.split()[i2]
# endfor
if box <> '':
n_roi=n_roi+1
if n_roi ==1:
Id_XMAP_roi_by_name=[box]
XMAP_roi_numbers=[i1]
else:
Id_XMAP_roi_by_name.append(box)
XMAP_roi_numbers.append(i1)
# endelse
# endif
# endfor
# endif
# case 2 Ketek, which is by defalut defined on channel 2
if ('KETEK_XMAP' in detectors):
print 'KETEC assuming that channel 2 is used in XMAP '
n_roi=0
for i1 in range(31):
this_name=get_epicsPV(beamline+'-XMAP:mca2.R'+str(i1)+'NM')
# note that this assumes that the
# same roi name is choosen for all four spectra.
# XMAP allow different labels for each roi and each detector.
# ..... remove blanks from string
box=''
for i2 in range(len(this_name.split())):
box=box+this_name.split()[i2]
# endfor
if box <> '':
n_roi=n_roi+1
if n_roi ==1:
Id_XMAP_roi_by_name=[box]
XMAP_roi_numbers=[i1]
else:
Id_XMAP_roi_by_name.append(box)
XMAP_roi_numbers.append(i1)
# endelse
# endif
# endfor
# endif
print n_roi
if n_roi == 0 :
error_stop('! NO ROI DEFINED IN XMAP (GOTO Phoenix user panel --> CHOOSE SDD/FLUO and ADD ROI ')
#endif
if n_roi_for_xas > n_roi:
print 'stop inconsistent input '
print ' value for n_roi_for_xas is larger that maximum value of defines roi'
print Id_XMAP_roi_by_name
print ' Use name convention: ',XMAP_name_convention
#endif
#endif
print Id_XMAP_roi_by_name
# finally define variable which contains the roi used fro XAs in the list of rois we use
n_roi_for_xas_index=n_roi_for_xas
# now, for case use onlz XAS roi, create the subset from ID_XMAP
# default is to store all ROI to data files. Now treat case where we need a data subset
n_roi_for_xas_index=n_roi_for_xas
print Id_XMAP_roi_by_name
if XMAP_save_only_xas_roi == 1:
# create list for headers for subset
Id_XMAP_roi_by_name=[Id_XMAP_roi_by_name[n_roi_for_xas]]
# create list with indices for roi chosen. by this prepare solution to make a list of rois to store
XMAP_roi_numbers=[n_roi_for_xas]
# set n_roi to 1 as we now consider only one region of interest
n_roi_for_xas_index=0
n_roi=1
# ............... now store the 21 possible regions for the energy scans
# once chanels are defined create array with chanle names and go through loop
n_e = 21 # start with maximun, reset number later
ch_e_base=beamline+'-PC-PSCAN:E-'
# faster code reads only active channels.....
i_0=0
if ('SPECTRA' == scan_type) or ('SPECTRA_QUEUE' == scan_type) or ('STACK' == scan_type):
# read parameter only if a spectrum is to be taken
for i in range(n_e):
print 'read energy points'+str(i)
this_active = get_epicsPV(ch_e_base+'ACT'+str(i))
if (i_0 ==0 ) and ( this_active== 1) :
print ' first region active'
e_active = [this_active] # must be one or zero
e_i = [get_epicsPV(ch_e_base+'I'+str(i))]
e_f = [get_epicsPV(ch_e_base+'F'+str(i))]
e_delta = [get_epicsPV(ch_e_base+'D'+str(i))]
e_n_cycles = [int(get_epicsPV(ch_e_base+'NCY'+str(i)))]
i_0=i_0+1
else:
if ( this_active== 1):
e_active.append(this_active) # must be one or zero
e_i.append(get_epicsPV(ch_e_base+'I'+str(i)))
e_f.append(get_epicsPV(ch_e_base+'F'+str(i)))
e_delta.append(get_epicsPV(ch_e_base+'D'+str(i)))
e_n_cycles.append(int(get_epicsPV(ch_e_base+'NCY'+str(i))))
i_0=i_0+1
# endif
# endelse
if i_0 == 0 :
box='!choose at least one ENERGY range with constant energy'
box2=box+'spacing for taking SPECTRA (Menue XAS SCANS)'
#error stop as no energy is defined for energy scan
error_stop(box2)
#error stop as no energy is defined for energy scan
# endif
else: # case data set is not a spectrum assign dummy values
e_active = ['undefined']
e_i = ['undefined']
e_f = ['undefined']
e_delta = ['undefined']
e_n_cycles = ['undefined']
i_0 = 0
# endelse
print e_f,e_i,i_0
# now READ POSITIONER FOR exafs DATA..
n_e = i_0 # reset n_e to number of real data points
ch_ex_base=beamline+'-PC-PSCAN:EX-'
e_ex_E_edge = [get_epicsPV(ch_ex_base+'E-EDGE')]
# do not check whether i_0 is zero, program assumes that at least
# on range with constant range is chosen.
n_exafs=2 # currently allow for 2 region
i_0 = 0
e_ex_active=[-1] # set to -1. If there is no active region for EXAFS scans, e_ex_active = -1
print n_exafs
for i in range(n_exafs):
this_active = get_epicsPV(ch_ex_base+'ACT'+str(i))
if (i_0 ==0 ) and ( this_active== 1) :
e_ex_active = [this_active] # must be one or zero
e_ex_e_i = [get_epicsPV(ch_ex_base+'E-I'+str(i)) ]
e_ex_e_f = [get_epicsPV(ch_ex_base+'E-F'+str(i)) ]
e_ex_k_i = [get_epicsPV(ch_ex_base+'K-I'+str(i)) ]
e_ex_k_f = [get_epicsPV(ch_ex_base+'K-F'+str(i)) ]
e_ex_d_i = [get_epicsPV(ch_ex_base+'D'+str(i)) ]
e_ex_ncy = [get_epicsPV(ch_ex_base+'NCY'+str(i)) ]
e_ex_ncy_f = [get_epicsPV(ch_ex_base+'NCY-F'+str(i)) ]
e_ex_icy = [get_epicsPV(ch_ex_base+'ICY'+str(i)) ]
e_ex_nst = [get_epicsPV(ch_ex_base+'NST'+str(i)) ]
e_ex_t = [get_epicsPV(ch_ex_base+'T'+str(i)) ]
i_0=i_0+1
else:
if ( this_active== 1):
e_ex_active.append(this_active) # must be one or zero
e_ex_e_i.append(get_epicsPV(ch_ex_base+'E-I'+str(i)) )
e_ex_e_f.append(get_epicsPV(ch_ex_base+'E-F'+str(i)) )
e_ex_k_i.append(get_epicsPV(ch_ex_base+'K-I'+str(i)) )
e_ex_k_f.append(get_epicsPV(ch_ex_base+'K-F'+str(i)) )
e_ex_d_i.append(get_epicsPV(ch_ex_base+'D'+str(i)) )
e_ex_ncy.append(get_epicsPV(ch_ex_base+'NCY'+str(i)) )
e_ex_ncy_f.append(get_epicsPV(ch_ex_base+'NCY-F'+str(i)))
e_ex_icy.append(get_epicsPV(ch_ex_base+'ICY'+str(i)))
e_ex_nst.append(get_epicsPV(ch_ex_base+'NST'+str(i)))
e_ex_t.append(get_epicsPV(ch_ex_base+'T'+str(i)))
i_0=i_0+1
# endif
# endelse
# endfor
n_exafs = i_0 # determine the number of EXAFS ranegs choosen.
if i_0 == 0 :
print 'NO EXAFS REABGE CHOOSEN '
e_ex_e_i = [-1]
e_ex_e_f = [-1]
e_ex_k_i = [-1]
e_ex_k_f = [-1]
e_ex_d_i = [-1]
e_ex_ncy = [-1]
e_ex_ncy_f = [-1]
e_ex_icy = [-1]
e_ex_nst = [-1]
e_ex_t = [-1]
# endif
#print e_ex_e_i
#print e_ex_e_f
#print e_ex_k_i
#print e_ex_k_f
#print e_ex_d_i
#print e_ex_ncy
#print e_ex_ncy_f
#print e_ex_nst
#print e_ex_t
# Now read also the parameters for the region with non equi distant energy spacing
#print n_e
#print e_active
#print e_i
#print e_f
#print e_delta
# ............ now store the various data point for the energy scans....
# ............ put these names into a configuration file ????
ch_p_base=beamline+'-PC-PSCAN:P-'
# first read all positions for standard detectors for regions
# to do read only active columns ...
n_p = 21 # set first to max number of datapoints, reset later
# faster code read only active chanels ........(but still all positioner, even if undefined..)
i_0_tmp=0
p_label='undefined_label'
for i in range(n_p):
print ' read positions for point scans '+str(i)+str(n_p)
this_active = int(get_epicsPV(ch_p_base+'ACT'+str(i))) # read channel with active / inactive...
print i, this_active
if (i_0_tmp ==0 ) and ( this_active== 1) :
p_label = [get_epicsPV(ch_p_base+'LABEL'+str(i))]
p_active = [this_active]
p_0 = [get_epicsPV(ch_p_base+'P0D'+str(i))]
p_1 = [get_epicsPV(ch_p_base+'P1D'+str(i))]
p_2 = [get_epicsPV(ch_p_base+'P2D'+str(i))]
p_3 = [get_epicsPV(ch_p_base+'P3D'+str(i))]
p_4 = [get_epicsPV(ch_p_base+'P4D'+str(i))]
p_5 = [get_epicsPV(ch_p_base+'P5D'+str(i))]
print 'First found'
i_0_tmp=i_0_tmp+1
else:
if ( this_active== 1):
print 'next found '
print i
p_label.append(get_epicsPV(ch_p_base+'LABEL'+str(i)))
p_active.append(this_active)
p_0.append(get_epicsPV(ch_p_base+'P0D'+str(i)))
p_1.append(get_epicsPV(ch_p_base+'P1D'+str(i)))
p_2.append(get_epicsPV(ch_p_base+'P2D'+str(i)))
p_3.append(get_epicsPV(ch_p_base+'P3D'+str(i)))
p_4.append(get_epicsPV(ch_p_base+'P4D'+str(i)))
p_5.append(get_epicsPV(ch_p_base+'P5D'+str(i)))
i_0_tmp=i_0_tmp+1
#endif
#endif
if i_0_tmp == 0 :
print 'error stop removed'
#error_stop('!!!!! INCONSISTENT INPUT: choose at least one POSITION
# for SPECTRA (MENUE XAS SCANS)')
# create mark in positioner variables that no position has been chosen
p_0='no pos'
p_1='no pos'
p_2='no pos'
p_3='no pos'
p_4='no pos'
p_5='no pos'
# set count of data points to 1, this is the case where we take a spectrum
# at all current positioners without moving the positioner
i_0_tmp = 1
# endif
print p_label
n_p = i_0_tmp # reset n_p to real number of data points
print n_p
# put all data into one full list
p_data_full=[[p_0],[p_1],[p_2],[p_3],[p_4],[p_5]]
#print i_0_tmp
# ........... done reading all positions for standard positioner ...
# .... get epics chanels of defau;lt positioner (set value)
print ' read actuators'
# CHANNEL NEEDED .rbv is as default in channel.remove .rbv and create .val for p_channel_full here
# case 1 extension of
ch0 = get_epicsPV(beamline+'-PC-PSCAN:POS-CHN0')
ch1 = get_epicsPV(beamline+'-PC-PSCAN:POS-CHN1')
ch2 = get_epicsPV(beamline+'-PC-PSCAN:POS-CHN2')
ch3 = get_epicsPV(beamline+'-PC-PSCAN:POS-CHN3')
ch4 = get_epicsPV(beamline+'-PC-PSCAN:POS-CHN4')
ch5 = get_epicsPV(beamline+'-PC-PSCAN:POS-CHN5')
[ch0_rbv,ch0_val] = create_rbv_val(ch0)
[ch1_rbv,ch1_val] = create_rbv_val(ch1)
[ch2_rbv,ch2_val] = create_rbv_val(ch2)
[ch3_rbv,ch3_val] = create_rbv_val(ch3)
[ch4_rbv,ch4_val] = create_rbv_val(ch4)
[ch5_rbv,ch5_val] = create_rbv_val(ch5)
p_channel_full = [ch0_val,ch1_val,ch2_val,ch3_val,ch4_val,ch5_val]
print ' read actuator rbv '
# .... get epics chanels of default positioner (rbv value)
p_channel_rbv_full = [ch0_rbv,ch1_rbv,ch2_rbv,ch3_rbv,ch4_rbv,ch5_rbv]
#print p_channel_full
#print p_channel_rbv_full
# names for identifier for 6 default positioner in point scans..)
print ' read actuator FDA ID '
p_id_full = [get_epicsPV(beamline+'-PC-PSCAN:POS-FDAID0'),
get_epicsPV(beamline+'-PC-PSCAN:POS-FDAID1'),
get_epicsPV(beamline+'-PC-PSCAN:POS-FDAID2'),
get_epicsPV(beamline+'-PC-PSCAN:POS-FDAID3'),
get_epicsPV(beamline+'-PC-PSCAN:POS-FDAID4'),
get_epicsPV(beamline+'-PC-PSCAN:POS-FDAID5')
]
# read done channels for positioner
p_done_full = [get_epicsPV(beamline+'-PC-PSCAN:POS-RBC0'),
get_epicsPV(beamline+'-PC-PSCAN:POS-RBC1'),
get_epicsPV(beamline+'-PC-PSCAN:POS-RBC2'),
get_epicsPV(beamline+'-PC-PSCAN:POS-RBC3'),
get_epicsPV(beamline+'-PC-PSCAN:POS-RBC4'),
get_epicsPV(beamline+'-PC-PSCAN:POS-RBC5')
]
#print p_done_full
# read on / off for done mode done channels for positioner
p_done_switch_full = [get_epicsPV(beamline+'-PC-PSCAN:POS-DN0-ACT'),
get_epicsPV(beamline+'-PC-PSCAN:POS-DN1-ACT'),
get_epicsPV(beamline+'-PC-PSCAN:POS-DN2-ACT'),
get_epicsPV(beamline+'-PC-PSCAN:POS-DN3-ACT'),
get_epicsPV(beamline+'-PC-PSCAN:POS-DN4-ACT'),
get_epicsPV(beamline+'-PC-PSCAN:POS-DN5-ACT')
]
#print p_done_switch_full
# ................................... read additional predefined user detectors
i_tmp=0
CH_User_detector = ['noUserDetector']
User_detector_fda_id = ['noUserDetector']
for i in range(10):
User_detector_box = get_epicsPV(beamline+'-PC-PSCAN:UDET'+str(i))
User_detector_fda_id_box = get_epicsPV(beamline+'-PC-PSCAN:UDET'+str(i)+'-FDAID')
if (remove_blanks_from_str(User_detector_box) <> '') :
if i_tmp == 0 :
CH_User_detector = [remove_blanks_from_str(User_detector_box)]
if User_detector_box <> '':
User_detector_fda_id = [remove_blanks_from_str(User_detector_fda_id_box)]
else:
User_detector_fda_id = ['User_det_'+str(i)]
#endelse
i_tmp = i_tmp + 1
else:
CH_User_detector.append(remove_blanks_from_str(User_detector_box))
User_detector_fda_id.append(remove_blanks_from_str(User_detector_fda_id_box))
# endelse
# endif
# endfor
print CH_User_detector
print User_detector_fda_id
# get the active detectors now...
p_positioner_active=[0,0,0,0,0,0] # variable which of the default positioner is active
p_positioner_active[0] = int(get_epicsPV(beamline+'-PC-PSCAN:POS-ACT0')) # Default scanx
p_positioner_active[1] = int(get_epicsPV(beamline+'-PC-PSCAN:POS-ACT1')) # Default scany
p_positioner_active[2] = int(get_epicsPV(beamline+'-PC-PSCAN:POS-ACT2')) # Default ROT
p_positioner_active[3] = int(get_epicsPV(beamline+'-PC-PSCAN:POS-ACT3')) # Default TRX
p_positioner_active[4] = int(get_epicsPV(beamline+'-PC-PSCAN:POS-ACT4')) # Default TRZ
p_positioner_active[5] = int(get_epicsPV(beamline+'-PC-PSCAN:POS-ACT5')) # Default DETECTOR
print p_positioner_active
# stop
# create array with Id values and EPICS channels for fda...
p_data_full=[p_0,p_1,p_2,p_3,p_4,p_5]
if sum(p_positioner_active) == 0 :
# case I no positioner defined
p_channel=[' ']
p_channel_rbv=[' ']
p_id =[' ']
p_data =[' ']
p_done =[' ']
p_done_switch =[' ']
else:
# case II no positioner are defined
i_0_tmp=0
for i in range(len(p_positioner_active)):
#print i_0_tmp
#print i
if (i_0_tmp == 0) and (p_positioner_active[i] == 1 ):
p_channel=[p_channel_full[i]]
p_channel_rbv= [p_channel_rbv_full[i]]
p_id = [p_id_full[i]]
p_data = [p_data_full[i]]
p_done = [p_done_full[i]]
p_done_switch =[p_done_switch_full[i]]
i_0_tmp =i_0_tmp+1
else:
if (p_positioner_active[i] == 1 ):
p_channel.append(p_channel_full[i])
p_channel_rbv.append(p_channel_rbv_full[i])
p_id.append(p_id_full[i])
p_data.append(p_data_full[i])
p_done.append(p_done_full[i])
p_done_switch.append(p_done_switch_full[i])
i_0_tmp =i_0_tmp+1
#endif
#endelse
#endfor
#endelse
#print 'i_0_tmp'
#print i_0_tmp
#print 'p_data'
#print p_data
#print p_done
#print p_done_switch
# now after we have stored all positions (including the non-active data sets...) into the matrices
# we create an array containing the complete data set...(Positioner ID and positions data)
#
#print 'p_positioner_active'
#print p_positioner_active
#print 'p0'
#print p_0
#print 'p_id'
#print p_id
# .................... done creation of full array for all positions...
# now connect the data to one variable with dictionary
# -----------------------------------------------------------------
#
# ............set up data for image regions .......
#
# ------------------------------------------------------------------
# ........... first the energies (currently as a few fixed energy values,
# we can think about stacks as well later
ch_r_base=beamline+'-PC-PSCAN:R'
r_n_e = 20 # start with max number of data points
i_0=0
for i in range(r_n_e):
print 'read energies for regions'+str(i)
#print ch_r_base+'-EACT'+str(i)
this_active = get_epicsPV(ch_r_base+'-EACT'+str(i))
#print 'this_active'
#xprint this_active
if (i_0 ==0 ) and ( this_active== 1) :
r_energies_active = [this_active]
time.sleep(0.05)
r_energies = [(get_epicsPV(ch_r_base+'-E'+str(i)))]
time.sleep(0.05)
r_energy_cycles = [int(get_epicsPV(ch_r_base+'-E-NCY'+str(i)))]
i_0 = i_0 + 1
#print 'first found '
else:
if (this_active == 1):
#print 'next found '
r_energies_active.append(1)
time.sleep(0.05)
r_energies.append( (get_epicsPV(ch_r_base+ '-E' +str(i))))
time.sleep(0.05)
r_energy_cycles.append( int(get_epicsPV(ch_r_base+ '-E-NCY' +str(i))))
i_0 = i_0 + 1
#print 'energies',r_energies
#endif
#endelse
# endfor
# ___________ stop, if there are no energies chosen.....
if i_0 == 0 :
# error_stop('!!!!! INCONSISTENT INPUT: choose at least one ENERGY for taking images')
# in case there no energy is chosen, work with current status of the beamline
r_energies = 'undefined'
r_energy_cycles = 'undefined'
r_energies_active = 'undefined'
#endif
r_n_e=i_0 # reset r_n_e
print r_energies
print r_energy_cycles
# ....................................... finally the image coordinates
n_r = 21 # maximum 10 images at current
# allow for scanx, scany and detector for now. Default for taking 2-D images
# this is by default in actuator 0,1, and 5. (ScanX, ScanY and Detector)
# the following code is historically grown and extremly unnice
# detector movement prepared, but not implemented yet in IOC
# TO DO REMOVE DETECTOR AS THIS IS USELESS:..
r_indices=[p_id_full[0]
,p_id_full[1]
,p_id_full[5]
]
r_channel = { p_id_full[0] : p_channel_full[0]
,p_id_full[1] : p_channel_full[1]
,p_id_full[5] :p_channel_full[5]
}
r_channel_rbv = { p_id_full[0] : p_channel_rbv_full[0]
,p_id_full[1] : p_channel_rbv_full[1]
,p_id_full[5] : p_channel_rbv_full[5]}
r_id = { p_id_full[0] : p_id_full[0]
,p_id_full[1] : p_id_full[1]
,p_id_full[5] : p_id_full[5]}
r_done = {p_id_full[0] : p_done_full[0]
,p_id_full[1] : p_done_full[1]
,p_id_full[5] : p_done_full[5]
}
r_done_switch = {p_id_full[0] : p_done_switch_full[0]
,p_id_full[1] : p_done_switch_full[1]
,p_id_full[5] : p_done_switch_full[5]
}
#print r_channel
# faster code , reads only active chanels
i_0 = 0
for i in range(n_r):
print 'read region'+str(i)
this_active = get_epicsPV(ch_r_base+'-ACT'+str(i))
if (i_0 ==0 ) and ( this_active== 1) :
#print ' first region active'
r_active = [this_active]
time.sleep(0.05)
r_ll_x = [get_epicsPV(ch_r_base+'-XLL'+str(i))]
time.sleep(0.05)
r_ll_y = [get_epicsPV(ch_r_base+'-YLL'+str(i))]
time.sleep(0.05)
r_ur_x = [get_epicsPV(ch_r_base+'-XUR'+str(i))]
time.sleep(0.05)
r_ur_y = [get_epicsPV(ch_r_base+'-YUR'+str(i))]
time.sleep(0.05)
r_delta_x = [get_epicsPV(ch_r_base+'-DX'+str(i))]
time.sleep(0.05)
r_delta_y = [get_epicsPV(ch_r_base+'-DY'+str(i))]
r_num = [i+1] # runing number for region to generate the numbering of filename
i_0=i_0+1
else:
if ( this_active== 1):
#print 'next found '
r_active.append( this_active)
r_ll_x.append( get_epicsPV(ch_r_base+'-XLL'+str(i)))
time.sleep(0.05)
r_ll_y.append( get_epicsPV(ch_r_base+'-YLL'+str(i)))
time.sleep(0.05)
r_ur_x.append( get_epicsPV(ch_r_base+'-XUR'+str(i)))
time.sleep(0.05)
r_ur_y.append( get_epicsPV(ch_r_base+'-YUR'+str(i)))
time.sleep(0.05)
r_delta_x.append( get_epicsPV(ch_r_base+'-DX'+str(i)))
time.sleep(0.05)
r_delta_y.append( get_epicsPV(ch_r_base+'-DY'+str(i)))
r_num.append(i+1)
# endif
#endelse
if (i_0 == 0 ):
error_stop('!!!!! INCONSISTENT INPUT: choose at least one REGION for taking images')
# endif
n_r=i_0 # reset number of data points
# ..... configure general preactions (configure at end,
# ..... as preaction in later version wil be derived from general input.
# This is the case if KEthley and Vortex are used add distinction for case w/o keithley
# ... preactions for DAQ with XMAP ................
# First check whether we need XMAP Actions:
if (('Vortex' in detectors) or ('ROENTEC_XMAP' in detectors) or ('KETEK_XMAP' in detectors) ):
DAQ_XMAP = 1
else:
DAQ_XMAP = 0
# endif_else
preaction_1={'channel' : 'X07MB-OP2:START-CSMPL','value' : '0'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
preaction_2={'channel' : 'X07MB-XMAP:StopAll'
,'value' : '1'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
# set to mca spectac mode (later add option for OTF mapping)
preaction_2a={'channel' : 'X07MB-XMAP:CollectMode'
,'value' : '0'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
# force application of collection mode setting.
preaction_2b={'channel' : 'X07MB-XMAP:Apply'
,'value' : '1'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
preaction_3={'channel' : 'X07MB-XMAP:PresetReal'
,'value' : '0'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
preaction_4={'channel' : 'X07MB-OP2:TOTAL-CYCLES'
,'value' : '2'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
# 7.5.2018 press once start sampling to allow system to reset delay = 0.7 sec to maske sure
# that there is sufficient time to count up once for 2 cycles. This is a backup
# to ensure that the trigger EPIC setup does not hand when the system starts
preaction_4a={'channel' : 'X07MB-OP2:SMPL'
,'value' : '1'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.7'}
preaction_5={'channel' : 'X07MB-ES1-PP2:VO5'
,'value' : '0'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.01'}
# preaction: open local shutter automatically
preaction_6={'channel' : 'X07MB-OP-WV1:WT_SET'
,'value' : '1'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
preaction_Moench_1={'channel' : 'X07MB-ES1-SD1:cam1:FileNumber'
,'value' : '0'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
#Moench 2 and 3 DO NOT WORK WOTH FDA FDA CANNOT WRITE A STRING
preaction_Moench_2={'channel' : 'X07MB-ES1-SD1:cam1:FilePath'
,'value' : '/tmp'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
preaction_Moench_3={'channel' : 'X07MB-ES1-SD1:cam1:FileName'
,'value' : 'moench_'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.05'}
preaction_MO_ID_Off={'channel' : 'X07MB-OP-MO:E-SET.OUT'
,'value' : ' '
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.2'}
preaction_MO_ID_on={'channel' : 'X07MB-OP-MO:E-SET.OUT'
,'value' : 'X07MA-ID:ENERGY NPP NMS'
,'operation' : 'put'
,'type' : 'String'
,'delay' : '0.2'}
# general case ...
if DAQ_XMAP == 1:
# IDCOUPLING
preactions=[preaction_1
,preaction_2
,preaction_2a
,preaction_2b
,preaction_3
,preaction_4
,preaction_4a
# ,preaction_5 # 4.10 take light out tmp
# ,preaction_MO_ID_Off
# ,preaction_MO_ID_on
]
# endif DAQ_XMAP = 1
# case no XMAP in data aquisition
if DAQ_XMAP == 0:
preactions=[preaction_1,preaction_4,preaction_4a]
# endif DAQ_XMAP = 0
# add shutter auto opening if chosen
if get_epicsPV('X07MB-PC-PSCAN:MBWV1_OPEN') == 1:
preactions.append(preaction_6)
# endif
# NOw add ccd detectort id needed
# Case 1 Moenche deetctor
if 'MOENCH' in detectors:
print(' no Moench preaction for now...')
preactions.append(preaction_Moench_1)
#preactions.append(preaction_Moench_2) THESE DO NOT WORK WOTH FDA FDA CANNOT WRITE A STRING
#preactions.append(preaction_Moench_3)
#endif
# ... preactions for DAQ without XMAP ................
# Define actions to be taken for each measurement
detector_action_1 = { 'Channel' : 'X07MB-XMAP:EraseStart'
,'Value' : '1'
,'Operation' : 'putq'
,'Data_type' : 'String'
,'Delay' : '0.075' }
detector_action_2 = { 'Channel' : 'X07MB-OP2:SMPL'
,'Value' : '1'
,'Operation' : 'put'
,'Data_type' : 'String'
,'Delay' : '0.075' }
detector_action_3 = { 'Channel' : 'X07MB-OP2:SMPL-DONE'
,'Value' : '1'
,'Operation' : 'wait'
,'Data_type' : 'Integer'
,'Delay' : '0.03' }
detector_action_4 = { 'Channel' : 'X07MB-XMAP:StopAll'
,'Value' : '1'
,'Operation' : 'put'
,'Data_type' : 'String'
,'Delay' : '0.05' }
detector_action_moench_aquire = { 'Channel' : 'X07MB-ES1-SD1:cam1:Acquire'
,'Value' : '1'
,'Operation' : 'put'
,'Data_type' : 'String'
,'Delay' : '0.05' }
detector_action_moench_wait = { 'Channel' : 'X07MB-ES1-SD1:cam1:Acquire'
,'Value' : '0'
,'Operation' : 'wait'
,'Data_type' : 'Integer'
,'Delay' : '0.03' }
detector_action_MO_ID_Off={'Channel' : 'X07MB-OP-MO:E-SET.OUT'
,'Value' : ' '
,'Operation' : 'put'
,'Data_type' : 'String'
,'Delay' : '0.1'}
detector_action_MO_ID_on={'Channel' : 'X07MB-OP-MO:E-SET.OUT'
,'Value' : 'X07MA-ID:ENERGY NPP NMS'
,'Operation' : 'put'
,'Data_type' : 'String'
,'Delay' : '0.1'}
# now walk through different cases
if DAQ_XMAP == 1:
# IDCOUPLING
detector_actions=[detector_action_1
,detector_action_2
,detector_action_3
,detector_action_4
# ,detector_action_MO_ID_Off
# ,detector_action_MO_ID_on
]
print detector_actions
# endif DAQ_XMAP = 1
if DAQ_XMAP == 0:
detector_actions=[detector_action_2
,detector_action_3]
print detectors
if (DAQ_XMAP == 1) and ('MOENCH' in detectors):
detector_actions=[detector_action_1
,detector_action_2
,detector_action_moench_aquire
,detector_action_3
,detector_action_moench_wait
,detector_action_4]
# establish predefined detector groups....
# group 1 beamline pressures...
CH_BL_PRESS = ['X07MA-FE-CH2MP1:PRESSURE'
,'X07MB-OP-MI1MP1:PRESSURE'
,'X07MA-OP-CMMP:PRESSURE'
,'X07MA-OP-SCMP:PRESSURE'
,'X07MB-OP-IP1MP1:PRESSURE'
,'X07MB-OP-SL1MP1:PRESSURE'
,'X07MB-OP-FI1MP1:PRESSURE'
,'X07MB-OP-BM1MP1:PRESSURE'
,'X07MB-OP-IP2MP1:PRESSURE'
,'X07MB-OP-BM2MF1:PRESSURE'
,'X07MB-OP-MOMF1:PRESSURE' ]
ID_BL_PRESS = ['CH2MP1'
,'MI1MP'
,'CMMP'
,'SCMP'
,'IP1MP1'
,'SL1MP1'
,'FI1MP1'
,'BM1MP1'
,'IP2MP1'
,'BM2MF1'
,'MOMF1']
# group BL temperatures temperatures...
CH_BL_TEMP=['X07MB-OP-MI1:TC1'
,'X07MB-OP-MI1:TC3'
,'X07MA-OP-CMMI:TC1'
,'X07MA-OP-CMB:TC1'
,'X07MA-OP-SC:TC1'
,'X07MA-FE-SH1:TC1'
,'X07MA-FE-SH1:TC2'
,'X07MA-FE-SH1:TC3'
,'X07MA-FE-SH1:TC4'
,'X07MA-FE-SV1:TC1'
,'X07MA-FE-SV1:TC2'
,'X07MA-FE-SV1:TC3'
,'X07MA-FE-SV1:TC4'
,'X07MB-OP-SH1:TC_X1'
,'X07MB-OP-SH1:TC_X2'
,'X07MB-OP-SV1:TC_Y1'
,'X07MB-OP-SV1:TC_Y2'
]
ID_BL_TEMP=['MI1TC1'
,'MI1TC3'
,'CMMITC1'
,'CMBTC1'
,'SCTC1'
,'FE_SH1TC1'
,'FE_SH1TC2'
,'FE_SH1TC3'
,'FE_SH1TC4'
,'FE_SV1TC1'
,'FE_SV1TC2'
,'FE_SV1TC3'
,'FE_SV1TC4'
,'SL1_SH1TC_X1'
,'SL1_SH1TC_X2'
,'SL1_SV1TC_Y1'
,'SL1_SV1TC_Y2'
]
# DETECTOR GROUP .......... Mono temperatures
CH_MONO_TEMP=['X07MB-OP-MOTHETA:TC1'
,'X07MB-OP-MOTRX:TC1'
,'X07MB-OP-MOC2:TC_Z'
,'X07MB-OP-MOC2:TC_Y']
ID_MONO_TEMP=['MONO_THETA_TC1'
,'MONO_TRX_TC1'
,'MONO_C2_TC_Z'
,'MONO_C2_TC_Y']
for i in range(16):
CH_MONO_TEMP.append('X07MB-OP-MO:TC'+str(i+1))
ID_MONO_TEMP.append('MONO_TC'+str(i+1))
#endfor
# ............DETECTOR GROUP MONO ENCODERS ...
CH_MONO_ENC = [ 'X07MB-OP-MO:C1-EC_ROZ' , 'X07MB-OP-MO:C2-EC_ROX' , 'X07MB-OP-MO:C2-EC_ROZ'
,'X07MB-OP-MO:C1-ROZ.DRBV','X07MB-OP-MO:C2-ROX.DRBV','X07MB-OP-MO:C2-ROZ.DRBV'
,'X07MB-OP-MO:C1-ROZ.DIFF','X07MB-OP-MO:C2-ROX.DIFF','X07MB-OP-MO:C2-ROZ.DIFF'
,'X07MB-OP-MO:C1-EC_ROZ.VAL','X07MB-OP-MO:C2-EC_ROX.VAL','X07MB-OP-MO:C2-EC_ROZ.VAL'
,'X07MB-OP-MO:C2-TRZ.VAL'
,'X07MB-OP-MO:C2-TRZ.RBV'
,'X07MB-OP-MO:C2-TRZ.DIFF'
,'X07MB-OP-MO:C2-TRZ.REP'
,'X07MB-OP-MO:C2-TRY.VAL'
,'X07MB-OP-MO:C2-TRY.RBV'
,'X07MB-OP-MO:C2-TRY.DIFF'
,'X07MB-OP-MO:C2-TRY.REP'
,'X07MB-OP-MO:THETA.VAL'
,'X07MB-OP-MO:THETA.RBV'
,'X07MB-OP-MO:THETA.DIFF'
,'X07MB-OP-MO:THETA.REP']
ID_MONO_ENC = [ 'ROLL1_V' , 'PITCH2_V' , 'ROLL2_V'
,'ROLL1_MUR' , 'PITCH2_MUR' , 'ROLL2_MUR'
,'ROLL1_DIFF','PITCH2_DIFF','ROLL2_DIFF'
,'ROLL1_VOLT','PITCH2_VOLT','ROLL2_VOLT'
,'T1_VAL'
,'T1_RBV'
,'T1_DIFF'
,'T1_REP'
,'T2_VAL'
,'T2_RBV'
,'T2_DIFF'
,'T2_REP'
,'THETA_VAL'
,'THETA_RBV'
,'THETA_DIFF'
,'THETA_REP']
# .................... Detector group Pressures endstation .............................
CH_ES1_PRESS=['X07MB-ES1-MF1:PRESSURE'
,'X07MB-ES1-MC1:PRESSURE'
,'X07MB-OP-KBMF1:PRESSURE'
,'X07MB-OP-SL2MF1:PRESSURE'
]
ID_ES1_PRESS=['ES1MF1'
,'ES1MC1'
,'OPKBMF1'
,'OPSL2MF1'
]
# .................... Detector group XBPM and microscope missing .............................
# ........................................... XBPM 3
CH_XBPM4=['X07MB-OP2-SAI_19:CUR-MEAN'
,'X07MB-OP2-SAI_20:CUR-MEAN'
,'X07MB-OP2-SAI_21:CUR-MEAN'
,'X07MB-OP2-SAI_22:CUR-MEAN']
ID_XBPM4=['XBPM4_SAI19_CUR_MEAN'
,'XBPM4_SAI20_CUR_MEAN'
,'XBPM4_SAI21_CUR_MEAN'
,'XBPM4_SAI22_CUR_MEAN']
CH_XBPM4_POS=['X07MB-OP-BPM4:POSX'
,'X07MB-OP-BPM4:POSY']
ID_XBPM4_POS=['XBPM4_POSX'
,'XBPM4_POSY']
# ........................................... XBPM 4
CH_XBPM3=['X07MB-OP2-SAI_14:CUR-MEAN'
,'X07MB-OP2-SAI_15:CUR-MEAN'
,'X07MB-OP2-SAI_16:CUR-MEAN'
,'X07MB-OP2-SAI_17:CUR-MEAN']
ID_XBPM3=['XBPM3_SAI14_CUR_MEAN'
,'XBPM3_SAI15_CUR_MEAN'
,'XBPM3_SAI16_CUR_MEAN'
,'XBPM3_SAI17_CUR_MEAN']
CH_XBPM3_POS=['X07MB-OP-BPM3:POSX'
,'X07MB-OP-BPM3:POSY']
ID_XBPM3_POS=['XBPM3_POSX'
,'XBPM3_POSY']
# ........................................... XBPM 3
CH_CAM1_POS=['X07MB-PS1:Stats1:CentroidX_RBV'
,'X07MB-PS1:Stats1:CentroidY_RBV'
,'X07MB-PS1:Stats1:SigmaX_RBV'
,'X07MB-PS1:Stats1:SigmaY_RBV'
,'X07MB-PS1:Stats1:SigmaXY_RBV'
]
ID_CAM1_POS=['CentroidX_RBV'
,'CentroidY_RBV'
,'SigmaX_RBV'
,'SigmaY_RBV'
,'SigmaXY_RBV'
]
# read channel and initial values for
ch_ini_base=beamline+'-PC-PSCAN:'
N_initial=6 # for now limit to 5 initial channels
i_0 = 0
for i in range(N_initial):
print 'read initial value ' + str(i)
#print ch_ini_base+'ChInit'+str(i)+'-ACT'
this_active = get_epicsPV(ch_ini_base+'ChInit'+str(i)+'-ACT')
time.sleep(0.05)
#print this_active
if (i_0 ==0 ) and ( this_active== 1) :
#print ' first region active'
CH_INITIAL = [get_epicsPV(ch_ini_base+'ChInit'+str(i))]
time.sleep(0.05)
CH_INITIAL_V = [get_epicsPV(ch_ini_base+'VChInit'+str(i))]
time.sleep(0.05)
i_0=i_0+1
else:
if ( this_active== 1):
#print 'next found '
time.sleep(0.05)
CH_INITIAL.append(get_epicsPV(ch_ini_base+'ChInit'+str(i)))
time.sleep(0.05)
CH_INITIAL_V.append(get_epicsPV(ch_ini_base+'VChInit'+str(i)))
# endif
# endelse
# endfor
if (i_0 == 0 ):
CH_INITIAL = ['NO_INITIAL_VALUES']
CH_INITIAL_V = [0]
#print CH_INITIAL
#print CH_INITIAL_V
# ________________ finally do consistency checks on the input data
# CASE 1 emergengy stop if number of choosen roi is larger that the number of available rois
if ((n_roi_for_xas >= n_roi) and (n_roi <> -1) and (n_roi_for_xas <> -1)) and (XMAP_save_only_xas_roi <> 1 ) : # if values are negative, XMAP is not used..
error_stop('!!!!! INCONSISTENT INPUT: Number of Roi for XAS larger than choosen roi !!!')
# endif
# CASE 2 emergengy stop if there are no active regions
# finally collect all read data into one structure, which completely defines the scan.
# This structure is returned as result of thie routine.
# All all readouts of this structure are adressed by the structure names, and never by indices,
# the structure can be extendened in a very general way
# on the longterm one could envision that the python routine just monitors all chanels, and
# creates a regular update... this would avoid the -time consuming- rereading of all
# chanels for every creation
# of the measurements scripts.
box={ 'filename' : filename
, 'beamline' : beamline
, 'preactions' : preactions
, 'detector_actions' : detector_actions
, 'scan_type' : scan_type
, 'n_roi_for_xas' : n_roi_for_xas
, 'n_roi_for_xas_index' : n_roi_for_xas_index
, 'n_roi' : n_roi
, 'n_det_fluo' : n_det_fluo
, 'd_list_fluo' : d_list_fluo
, 'Id_XMAP_roi_by_name' : Id_XMAP_roi_by_name
, 'XMAP_roi_numbers' : XMAP_roi_numbers
, 'XMAP_name_convention' : XMAP_name_convention
, 'XMAP_save_only_xas_roi' : XMAP_save_only_xas_roi
, 'XMAP_save_spectra' : XMAP_save_spectra
, 'number_of_executions' : number_of_executions
, 'detectors' : detectors
, 'detectors_to_plot' : detectors_to_plot
, 'n_e' : n_e
, 'e_active' : e_active
, 'e_i' : e_i
, 'e_f' : e_f
, 'e_delta' : e_delta
, 'e_n_cycles' : e_n_cycles
, 'n_exafs' : n_exafs
, 'e_ex_E_edge' : e_ex_E_edge
, 'e_ex_active' : e_ex_active
, 'e_ex_e_i' : e_ex_e_i
, 'e_ex_e_f' : e_ex_e_f
, 'e_ex_k_i' : e_ex_k_i
, 'e_ex_k_f' : e_ex_k_f
, 'e_ex_d_i' : e_ex_d_i
, 'e_ex_ncy' : e_ex_ncy
, 'e_ex_ncy_f' : e_ex_ncy_f
, 'e_ex_icy' : e_ex_icy
, 'e_ex_nst' : e_ex_nst
, 'e_ex_t' : e_ex_t
# , 'e_channel' : 'X07MB-OP-MO:E-SET' # PHOENIX I NEED A CHECK that we canonly run the right mono in the script!
# , 'e_channel_rbv' : 'X07MB-OP-MO:E-GET'
#, 'e_channel' : 'X07MA-PHS-E:GO.A' # XTREME
#, 'e_channel_rbv' : 'X07MA-PGM:CERBK'
, 'e_channel' : 'X07MB-OP:userCalc1.L' # test write energy in calc record
, 'e_channel_rbv' : 'X07MB-OP:userCalc1.L'
, 'n_p' : n_p
, 'p_channel' : p_channel
, 'p_channel_rbv' : p_channel_rbv
, 'p_id' : p_id
, 'p_positioner_active': p_positioner_active
, 'p_label' : p_label
, 'p_data' : p_data
, 'p_done' : p_done
, 'p_done_switch' : p_done_switch
, 'r_energy_cycles' : r_energy_cycles
, 'r_energies' : r_energies
, 'r_energies_active' : r_energies_active
, 'r_channel' : r_channel
, 'r_channel_rbv' : r_channel_rbv
, 'r_indices' : r_indices
, 'r_id' : r_id
, 'r_active' : r_active
, 'r_ll_x' : r_ll_x
, 'r_ll_y' : r_ll_y
, 'r_ur_x' : r_ur_x
, 'r_ur_y' : r_ur_y
, 'r_delta_x' : r_delta_x
, 'r_delta_y' : r_delta_y
, 'r_num' : r_num
, 'r_done' : r_done
, 'r_done_switch' : r_done_switch
, 'CH_CAM1_POS' : CH_CAM1_POS
, 'ID_CAM1_POS' : ID_CAM1_POS
, 'CH_BL_PRESS' : CH_BL_PRESS
, 'ID_BL_PRESS' : ID_BL_PRESS
, 'CH_BL_TEMP' : CH_BL_TEMP
, 'ID_BL_TEMP' : ID_BL_TEMP
, 'CH_MONO_TEMP' : CH_MONO_TEMP
, 'ID_MONO_TEMP' : ID_MONO_TEMP
, 'CH_MONO_ENC' : CH_MONO_ENC
, 'ID_MONO_ENC' : ID_MONO_ENC
, 'CH_ES1_PRESS' : CH_ES1_PRESS
, 'ID_ES1_PRESS' : ID_ES1_PRESS
, 'CH_XBPM3' : CH_XBPM3
, 'ID_XBPM3' : ID_XBPM3
, 'CH_XBPM3_POS' : CH_XBPM3_POS
, 'ID_XBPM3_POS' : ID_XBPM3_POS
, 'CH_XBPM4' : CH_XBPM4
, 'ID_XBPM4' : ID_XBPM4
, 'CH_XBPM4_POS' : CH_XBPM4_POS
, 'ID_XBPM4_POS' : ID_XBPM4_POS
, 'DAQ_XMAP' : DAQ_XMAP
, 'CH_INITIAL' : CH_INITIAL
, 'CH_INITIAL_V' : CH_INITIAL_V
, 'CH_User_detector' : CH_User_detector
, 'User_detector_fda_id' : User_detector_fda_id
}
print box
print detectors
print('preactions')
print preactions
return box