Skip to content
Snippets Groups Projects
Commit 8de6328f authored by mwyman's avatar mwyman
Browse files

Begin refactor of CRL

parent d11e0916
No related branches found
No related tags found
No related merge requests found
Showing
with 2824 additions and 975 deletions
record(longin, "$(P)$(SYSID):$(OE):lenses") {
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_lenses_$(OE)')")
field(SCAN, "I/O Intr")
field(FLNK, "$(P)$(SYSID):$(OE):lens_decode.PROC CA")
}
record(transform, "$(P)$(SYSID):$(OE):lens_decode"){
field(INPA, "$(P)$(SYSID):$(OE):lenses PP")
field(CLCB, "A % 2")
field(CLCC, "(A >> 1) % 2")
field(CLCD, "(A >> 2) % 2")
field(CLCE, "(A >> 3) % 2")
field(CLCF, "(A >> 4) % 2")
field(CLCG, "(A >> 5) % 2")
field(CLCH, "(A >> 6) % 2")
field(CLCI, "(A >> 7) % 2")
field(CLCJ, "(A >> 8) % 2")
field(CLCK, "(A >> 9) % 2")
# field(CLCL, "(A >> 10) % 2")
# field(CLCM, "(A >> 11) % 2")
}
record(calcout, "$(P)$(SYSID):$(OE):lens_encode"){
field(OUT, "$(P)$(SYSID):$(OE):lensConfig_BW PP")
field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
}
record(longout, "$(P)$(SYSID):$(OE):lensConfig_BW") {
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateConfig(VAL, $(OE))")
}
record(calcout, "$(P)$(SYSID):$(OE):lens_RBV_encode"){
field(OUT, "$(P)$(SYSID):$(OE):lensConfig_RBV PP")
field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
}
record(longin, "$(P)$(SYSID):$(OE):lensConfig_RBV") {
}
record(waveform, "$(P)$(SYSID):$(OE):configs"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_configs_$(OE)')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "LONG")
field(NELM, "$(ELEM)")
}
record(waveform, "$(P)$(SYSID):$(OE):invF_indices"){
field(DESC, "inverse f indices")
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_invFind_list_$(OE)')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "DOUBLE")
field(NELM, "$(ELEM)")
}
record(waveform, "$(P)$(SYSID):$(OE):invF"){
field(DESC, "inverse f")
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_invF_list_$(OE)')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "DOUBLE")
field(NELM, "$(ELEM)")
}
record(calcout, "$(P)$(SYSID):$(OE):fSize_twk_up"){
field(INPA, "$(P)$(SYSID):$(OE):sortedIndex_RBV")
field(CALC, "MIN(A+1,$(ELEM)-1)")
field(OUT, "$(P)$(SYSID):$(OE):sortedIndex PP")
}
record(calcout, "$(P)$(SYSID):$(OE):fSize_twk_dn"){
field(INPA, "$(P)$(SYSID):$(OE):sortedIndex_RBV")
field(CALC, "MAX(0,A-1)")
field(OUT, "$(P)$(SYSID):$(OE):sortedIndex PP")
}
record(longout, "$(P)$(SYSID):$(OE):sortedIndex") {
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateIndex(VAL, $(OE))")
}
record(longin, "$(P)$(SYSID):$(OE):sortedIndex_RBV") {
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_index_$(OE)')")
field(SCAN, "I/O Intr")
}
# Select the source field for the energy
record(bo, "$(P)$(SYSID):EnergySelect") {
field(DESC, "energy selection")
field(DTYP, "Soft Channel")
field(ZNAM, "Mono")
field(ONAM, "Local")
field(VAL, "1")
field(FLNK, "$(P)$(SYSID):EnergyCalc")
}
# The local energy
record(ao, "$(P)$(SYSID):EnergyLocal") {
field(DESC, "local energy")
field(VAL, "12.398")
field(PREC, "4")
field(EGU, "keV")
field(FLNK, "$(P)$(SYSID):EnergyCalc")
}
# The beamline energy
record(ao, "$(P)$(SYSID):EnergyBeamline") {
field(DESC, "beamline energy")
field(DOL, "$(KEV) CP")
field(OMSL, "closed_loop")
field(PREC, "4")
field(EGU, "keV")
field(FLNK, "$(P)$(SYSID):EnergyCalc")
}
# Calculate the energy to be used
record(calcout, "$(P)$(SYSID):EnergyCalc"){
field(DESC, "Energy select calc")
field(SCAN, "Passive")
field(INPA, "$(P)$(SYSID):EnergySelect.RVAL")
field(INPB, "$(P)$(SYSID):EnergyBeamline")
field(INPC, "$(P)$(SYSID):EnergyLocal")
field(CALC, "(A==0)?B:C")
field(OUT, "$(P)$(SYSID):energy PP")
field(PREC, "4")
field(SCAN, "Passive")
}
record(ao, "$(P)$(SYSID):energy"){
field(EGU, "keV")
field(DOL, "$(KEV) CP")
field(OMSL, "closed_loop")
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateE(VAL)")
field(FLNK, "$(P)$(SYSID):recalc_table.PROC CA")
}
record(ai, "$(P)$(SYSID):energy_RBV"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('updated_E')")
field(SCAN, "I/O Intr")
field(PREC, "5")
}
record(ao, "$(P)$(SYSID):focalSize"){
field(EGU, "m")
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateFsize(VAL)")
}
record(bo, "$(P)$(SYSID):recalc_enable"){
field(DESC, "Lookup table calc enable")
field(SCAN, "Passive")
field(ZNAM, "Disabled")
field(ONAM, "Enabled")
}
# Not sure this would work -- how to get a PV to simply trigger code?
record(bo, "$(P)$(SYSID):recalc_table"){
field(DTYP, "pydev")
field(OUT, "@$(OBJ).construct_lookup_table()")
field(FLNK, "$(P)$(SYSID):refind_config.PROC CA")
field(SDIS, "$(P)$(SYSID):recalc_enable")
field(DISV, "0")
}
# Not sure this would work -- how to get a PV to simply trigger code?
record(bo, "$(P)$(SYSID):refind_config"){
field(DTYP, "pydev")
field(OUT, "@$(OBJ).find_config()")
}
record(bo, "$(P)$(SYSID):thickerr_flag"){
field(DTYP, "pydev")
field(ZNAM, "Off")
field(ONAM, "On")
field(OUT, "@$(OBJ).setThickerrFlag(VAL)")
field(FLNK, "$(P)$(SYSID):recalc_table.PROC CA")
}
record(bi, "$(P)$(SYSID):thickerr_flag_RBV"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('updated_thickerr_Flag')")
field(SCAN, "I/O Intr")
}
record(ai, "$(P)$(SYSID):fSize_actual"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_fSize')")
field(SCAN, "I/O Intr")
field(PREC, "5")
}
s
record(longout, "$(P)$(SYSID):previewIndex") {
field(DTYP, "pydev")
field(OUT, "@$(OBJ).getPreviewFocalSize(VAL)")
}
record(ai, "$(P)$(SYSID):fSize_preview"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_preview')")
field(SCAN, "I/O Intr")
field(PREC, "6")
}
record(bo, "$(P)$(SYSID):verbosity"){
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateVerbosity(VAL)")
field(ZNAM, "Off")
field(ONAM, "On")
}
record(waveform, "$(P)$(SYSID):fSizes"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_lookupTable')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "DOUBLE")
field(NELM, "$(ELEM)")
}
record(ao, "$(P)$(SYSID):$(OE):slitSize_H"){
field(EGU, "m")
field(DOL, "$(SLITH) CP")
field(OMSL, "closed_loop")
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateSlitSize(VAL, $(OE), 'hor')")
field(FLNK, "$(P)$(SYSID):recalc_table.PROC CA")
field(PREC, "6")
}
record(ai, "$(P)$(SYSID):$(OE):slitSize_H_RBV"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('updated_slitSize_$(OE)_hor')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(EGU, "m")
}
record(ao, "$(P)$(SYSID):$(OE):slitSize_V"){
field(EGU, "m")
field(DOL, "$(SLITV) CP")
field(OMSL, "closed_loop")
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateSlitSize(VAL, $(OE), 'vert')")
field(FLNK, "$(P)$(SYSID):recalc_table.PROC CA")
field(PREC, "6")
}
record(ai, "$(P)$(SYSID):$(OE):slitSize_V_RBV"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('updated_slitSize_$(OE)_vert')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(EGU, "m")
}
record(dfanout, "$(P)$(CRLID):stack$(M)_dfanout"){ record(dfanout, "$(P)$(SYSID):$(OE):stack$(M)_dfanout"){
field(DOL, "$(P)$(CRLID):lens_decode.$(DECODE) CP") field(DOL, "$(P)$(SYSID):$(OE):lens_decode.$(DECODE) CP")
field(OMSL, "closed_loop") field(OMSL, "closed_loop")
field(OUTA, "$(P)$(CRLID):stack$(M) PP") field(OUTA, "$(P)$(SYSID):$(OE):stack$(M) PP")
} }
record(bo, "$(P)$(CRLID):stack$(M)"){ record(bo, "$(P)$(SYSID):$(OE):stack$(M)"){
field(DESC, "$(NUMLENS), $(RADIUS), $(LOC), $(MAT), $(THICKERR)") field(DESC, "$(NUMLENS), $(RADIUS), $(LOC), $(MAT), $(THICKERR)")
field(ZNAM, "Out") field(ZNAM, "Out")
field(ONAM, "In") field(ONAM, "In")
field(DISV, "1") field(DISV, "1")
} }
record(calcout, "$(P)$(CRLID):stack$(M)_calc"){ record(calcout, "$(P)$(SYSID):$(OE):stack$(M)_calc"){
field(INPA, "$(P)$(CRLID):stack$(M) CP") field(INPA, "$(P)$(SYSID):$(OE):stack$(M) CP")
field(CALC, "A?$(INVAL):$(OUTVAL)") field(CALC, "A?$(INVAL):$(OUTVAL)")
field(OUT, "$(OUT)") field(OUT, "$(OUT)")
} }
record(calcout, "$(P)$(CRLID):stack$(M)_RBV_calc"){ record(calcout, "$(P)$(SYSID):$(OE):stack$(M)_RBV_calc"){
field(INPA, "$(INP) CP") field(INPA, "$(INP) CP")
field(CALC, "A==$(INRBVVAL)?1:0") field(CALC, "A==$(INRBVVAL)?1:0")
field(OUT, "$(P)$(CRLID):stack$(M)_RBV PP") field(OUT, "$(P)$(SYSID):$(OE):stack$(M)_RBV PP")
} }
record(bi, "$(P)$(CRLID):stack$(M)_RBV"){ record(bi, "$(P)$(SYSID):$(OE):stack$(M)_RBV"){
field(DESC, "$(NUMLENS), $(RADIUS), $(LOC), $(MAT), $(THICKERR)") field(DESC, "$(NUMLENS), $(RADIUS), $(LOC), $(MAT), $(THICKERR)")
field(ZNAM, "Out") field(ZNAM, "Out")
field(ONAM, "In") field(ONAM, "In")
} }
record(dfanout, "$(P)$(CRLID):stack$(M)_RBV_dfanout"){ record(dfanout, "$(P)$(SYSID):$(OE):stack$(M)_RBV_dfanout"){
field(OMSL, "closed_loop") field(OMSL, "closed_loop")
field(DOL, "$(P)$(CRLID):stack$(M)_RBV CP") field(DOL, "$(P)$(SYSID):$(OE):stack$(M)_RBV CP")
field(OUTA, "$(P)$(CRLID):lens_RBV_encode.$(ENCODE) PP") field(OUTA, "$(P)$(SYSID):$(OE):lens_RBV_encode.$(ENCODE) PP")
} }
record(ao, "$(P)$(CRLID):stack$(M)_NumLens"){ record(ao, "$(P)$(SYSID):$(OE):stack$(M)_NumLens"){
field(DESC, "Number of lens in stack") field(DESC, "Number of lens in stack")
field(VAL, "$(NUMLENS)") field(VAL, "$(NUMLENS)")
} }
record(ao, "$(P)$(CRLID):stack$(M)_LensRadius"){ record(ao, "$(P)$(SYSID):$(OE):stack$(M)_LensRadius"){
field(DESC, "Lens radii") field(DESC, "Lens radii")
field(PREC, "6") field(PREC, "6")
field(VAL, "$(RADIUS)") field(VAL, "$(RADIUS)")
} }
record(ao, "$(P)$(CRLID):stack$(M)_Location"){ record(ao, "$(P)$(SYSID):$(OE):stack$(M)_Location"){
field(DESC, "Stack Location, + US, - DS from center") field(DESC, "Stack Location, + US, - DS from center")
field(EGU, "stack_thick") field(EGU, "stack_thick")
field(PREC, "3") field(PREC, "3")
field(VAL, "$(LOC)") field(VAL, "$(LOC)")
} }
record(stringout, "$(P)$(CRLID):stack$(M)_Material"){ record(stringout, "$(P)$(SYSID):$(OE):stack$(M)_Material"){
field(DESC, "Lens Material") field(DESC, "Lens Material")
field(VAL, "$(MAT)") field(VAL, "$(MAT)")
} }
record(ao, "$(P)$(CRLID):stack$(M)_ThickErr"){ record(ao, "$(P)$(SYSID):$(OE):stack$(M)_ThickErr"){
field(DESC, "RMS Thickness Error") field(DESC, "RMS Thickness Error")
field(PREC, "6") field(PREC, "6")
field(VAL, "$(THICKERR)") field(VAL, "$(THICKERR)")
} }
record(dfanout, "$(P)$(CRLID):stack$(M)_BW_dfanout"){ record(dfanout, "$(P)$(SYSID):$(OE):stack$(M)_BW_dfanout"){
field(OMSL, "closed_loop") field(OMSL, "closed_loop")
field(DOL, "$(P)$(CRLID):stack$(M) CP") field(DOL, "$(P)$(SYSID):$(OE):stack$(M) CP")
field(OUTA, "$(P)$(CRLID):lens_encode.$(ENCODE)") field(OUTA, "$(P)$(SYSID):$(OE):lens_encode.$(ENCODE)")
field(FLNK, "$(P)$(CRLID):lens_encode.PROC CA") field(FLNK, "$(P)$(SYSID):$(OE):lens_encode.PROC CA")
} }
# The commented out records below were meant to replicate the lock feature used
# in filter control. BL staff indicated not required but kept in case needed.
# Will also have to update python code (in/out masks, culled tables/indices need
# to be uncommented).
# MW 2024.09.04
#!record(bo, "$(P)$(CRLID):stack$(M)_Lock"){
#! field(ZNAM, "Free")
#! field(ONAM, "Locked")
#! field(SDIS, "$(P)$(CRLID):stack$(M)_Enable")
#! field(DISV, "1")
#!}
#!
#!record(bo, "$(P)$(CRLID):stack$(M)_Enable"){
#! field(ZNAM, "Enabled")
#! field(ONAM, "Disabled")
#!}
#!
#!
#!record(calcout, "$(P)$(CRLID):disableOut$(M)_calc"){
#! field(INPA, "$(P)$(CRLID):stack$(M)_Enable CP")
#! field(INPB, "$(P)$(CRLID):stack$(M)")
#! field(CALC, "A=1?0:B")
#! field(OUT, "$(P)$(CRLID):stack$(M) PP")
#! field(FLNK, "$(P)$(CRLID):lockEnable$(M)_calc")
#!}
#!
#!record(calcout, "$(P)$(CRLID):lockEnable$(M)_calc"){
#! field(INPA, "$(P)$(CRLID):stack$(M)_Enable")
#! field(INPB, "$(P)$(CRLID):stack$(M)_Lock CP")
#! field(INPC, "$(P)$(CRLID):stack$(M)_RBV")
#! field(CALC, "A | B")
#! field(OUT, "$(P)$(CRLID):stack$(M).DISA PP")
#! field(FLNK, "$(P)$(CRLID):outMask$(M)_calc")
#!}
#!
#!record(calcout, "$(P)$(CRLID):outMask$(M)_calc"){
#! field(INPA, "$(P)$(CRLID):stack$(M)_Enable")
#! field(INPB, "$(P)$(CRLID):stack$(M)_Lock")
#! field(INPC, "$(P)$(CRLID):stack$(M)_RBV")
#! field(CALC, "A | (B & !C)")
#! field(OUT, "$(P)$(CRLID):outMask_encode.$(MASK) PP")
#! field(FLNK, "$(P)$(CRLID):inMask$(M)_calc")
#!}
#!
#!record(calcout, "$(P)$(CRLID):inMask$(M)_calc"){
#! field(INPA, "$(P)$(CRLID):stack$(M)_Enable")
#! field(INPB, "$(P)$(CRLID):stack$(M)_Lock")
#! field(INPC, "$(P)$(CRLID):stack$(M)_RBV")
#! field(CALC, "!A & (B & C)")
#! field(OUT, "$(P)$(CRLID):inMask_encode.$(MASK) PP")
#!}
# Select the source field for the energy
record(bo, "$(P)$(CRLID):EnergySelect") {
field(DESC, "energy selection")
field(DTYP, "Soft Channel")
field(ZNAM, "Mono")
field(ONAM, "Local")
field(VAL, "1")
field(FLNK, "$(P)$(CRLID):EnergyCalc")
}
# The local energy
record(ao, "$(P)$(CRLID):EnergyLocal") {
field(DESC, "local energy")
field(VAL, "12.398")
field(PREC, "4")
field(EGU, "keV")
field(FLNK, "$(P)$(CRLID):EnergyCalc")
}
# The beamline energy
record(ao, "$(P)$(CRLID):EnergyBeamline") {
field(DESC, "beamline energy")
field(DOL, "$(KEV) CP")
field(OMSL, "closed_loop")
field(PREC, "4")
field(EGU, "keV")
field(FLNK, "$(P)$(CRLID):EnergyCalc")
}
# Calculate the energy to be used
record(calcout, "$(P)$(CRLID):EnergyCalc"){
field(DESC, "Energy select calc")
field(SCAN, "Passive")
field(INPA, "$(P)$(CRLID):EnergySelect.RVAL")
field(INPB, "$(P)$(CRLID):EnergyBeamline")
field(INPC, "$(P)$(CRLID):EnergyLocal")
field(CALC, "(A==0)?B:C")
field(OUT, "$(P)$(CRLID):energy PP")
field(PREC, "4")
field(SCAN, "Passive")
}
record(ao, "$(P)$(CRLID):energy"){
field(EGU, "keV")
field(DOL, "$(KEV) CP")
field(OMSL, "closed_loop")
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateE(VAL)")
field(FLNK, "$(P)$(CRLID):recalc_table.PROC CA")
}
record(ai, "$(P)$(CRLID):energy_RBV"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('updated_E')")
field(SCAN, "I/O Intr")
field(PREC, "5")
}
record(ao, "$(P)$(CRLID):focalSize"){
field(EGU, "m")
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateFsize(VAL)")
}
record(calcout, "$(P)$(CRLID):fSize_twk_up"){
field(INPA, "$(P)$(CRLID):sortedIndex_RBV")
field(CALC, "MIN(A+1,$(ELEM)-1)")
field(OUT, "$(P)$(CRLID):sortedIndex PP")
}
record(calcout, "$(P)$(CRLID):fSize_twk_dn"){
field(INPA, "$(P)$(CRLID):sortedIndex_RBV")
field(CALC, "MAX(0,A-1)")
field(OUT, "$(P)$(CRLID):sortedIndex PP")
}
record(bo, "$(P)$(CRLID):recalc_enable"){
field(DESC, "Lookup table calc enable")
field(SCAN, "Passive")
field(ZNAM, "Disabled")
field(ONAM, "Enabled")
}
# Not sure this would work -- how to get a PV to simply trigger code?
record(bo, "$(P)$(CRLID):recalc_table"){
field(DTYP, "pydev")
field(OUT, "@$(OBJ).construct_lookup_table()")
field(FLNK, "$(P)$(CRLID):refind_config.PROC CA")
field(SDIS, "$(P)$(CRLID):recalc_enable")
field(DISV, "0")
}
# Not sure this would work -- how to get a PV to simply trigger code?
record(bo, "$(P)$(CRLID):refind_config"){
field(DTYP, "pydev")
field(OUT, "@$(OBJ).find_config()")
}
record(bo, "$(P)$(CRLID):thickerr_flag"){
field(DTYP, "pydev")
field(ZNAM, "Off")
field(ONAM, "On")
field(OUT, "@$(OBJ).setThickerrFlag(VAL)")
field(FLNK, "$(P)$(CRLID):recalc_table.PROC CA")
}
record(bi, "$(P)$(CRLID):thickerr_flag_RBV"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('updated_thickerr_Flag')")
field(SCAN, "I/O Intr")
}
#-------------------------------------------------------------------------------
# CRL 1 config/encode/decode
record(longin, "$(P)$(CRLID):1:lenses") {
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_lenses_1')")
field(SCAN, "I/O Intr")
field(FLNK, "$(P)$(CRLID):1:lens_decode.PROC CA")
}
record(transform, "$(P)$(CRLID):1:lens_decode"){
field(INPA, "$(P)$(CRLID):1:lenses PP")
field(CLCB, "A % 2")
field(CLCC, "(A >> 1) % 2")
field(CLCD, "(A >> 2) % 2")
field(CLCE, "(A >> 3) % 2")
field(CLCF, "(A >> 4) % 2")
field(CLCG, "(A >> 5) % 2")
field(CLCH, "(A >> 6) % 2")
field(CLCI, "(A >> 7) % 2")
field(CLCJ, "(A >> 8) % 2")
field(CLCK, "(A >> 9) % 2")
# field(CLCL, "(A >> 10) % 2")
# field(CLCM, "(A >> 11) % 2")
}
record(calcout, "$(P)$(CRLID):1:lens_encode"){
field(OUT, "$(P)$(CRLID):1:lensConfig_BW PP")
field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
}
record(calcout, "$(P)$(CRLID):1:lens_RBV_encode"){
field(OUT, "$(P)$(CRLID):1:lensConfig_RBV PP")
field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
}
record(longin, "$(P)$(CRLID):1:lensConfig_RBV") {
}
record(longout, "$(P)$(CRLID):1:lensConfig_BW") {
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateConfig1(VAL)")
}
#-------------------------------------------------------------------------------
# CRL 2 config/encode/decode
record(longin, "$(P)$(CRLID):2:lenses") {
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_lenses_2')")
field(SCAN, "I/O Intr")
field(FLNK, "$(P)$(CRLID):2:lens_decode.PROC CA")
}
record(transform, "$(P)$(CRLID):2:lens_decode"){
field(INPA, "$(P)$(CRLID):2:lenses PP")
field(CLCB, "A % 2")
field(CLCC, "(A >> 1) % 2")
field(CLCD, "(A >> 2) % 2")
field(CLCE, "(A >> 3) % 2")
field(CLCF, "(A >> 4) % 2")
field(CLCG, "(A >> 5) % 2")
field(CLCH, "(A >> 6) % 2")
field(CLCI, "(A >> 7) % 2")
field(CLCJ, "(A >> 8) % 2")
field(CLCK, "(A >> 9) % 2")
# field(CLCL, "(A >> 10) % 2")
# field(CLCM, "(A >> 11) % 2")
}
record(calcout, "$(P)$(CRLID):2:lens_encode"){
field(OUT, "$(P)$(CRLID):2:lensConfig_BW PP")
field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
}
record(calcout, "$(P)$(CRLID):2:lens_RBV_encode"){
field(OUT, "$(P)$(CRLID):2:lensConfig_RBV PP")
field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
}
record(longin, "$(P)$(CRLID):2:lensConfig_RBV") {
}
record(longout, "$(P)$(CRLID):2:lensConfig_BW") {
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateConfig2(VAL)")
}
#-------------------------------------------------------------------------------
record(ai, "$(P)$(CRLID):fSize_actual"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_fSize')")
field(SCAN, "I/O Intr")
field(PREC, "5")
}
record(longout, "$(P)$(CRLID):sortedIndex") {
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateIndex(VAL)")
}
record(longin, "$(P)$(CRLID):sortedIndex_RBV") {
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_index')")
field(SCAN, "I/O Intr")
}
record(longout, "$(P)$(CRLID):previewIndex") {
field(DTYP, "pydev")
field(OUT, "@$(OBJ).getPreviewFocalSize(VAL)")
}
record(ai, "$(P)$(CRLID):fSize_preview"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_preview')")
field(SCAN, "I/O Intr")
field(PREC, "6")
}
record(bo, "$(P)$(CRLID):verbosity"){
field(DTYP, "pydev")
field(OUT, "@$(OBJ).updateVerbosity(VAL)")
field(ZNAM, "Off")
field(ONAM, "On")
}
record(waveform, "$(P)$(CRLID):fSizes"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_lookupTable')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "DOUBLE")
field(NELM, "$(ELEM)")
}
record(waveform, "$(P)$(CRLID):invF_indices"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_invFind_list')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "DOUBLE")
field(NELM, "$(ELEM)")
}
record(waveform, "$(P)$(CRLID):invF"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_invF_list')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "DOUBLE")
field(NELM, "$(ELEM)")
}
record(waveform, "$(P)$(CRLID):configs"){
field(DTYP, "pydev")
field(INP, "@pydev.iointr('new_configs')")
field(SCAN, "I/O Intr")
field(PREC, "6")
field(FTVL, "LONG")
field(NELM, "$(ELEM)")
}
# The commented out records below were meant to replicate the lock feature used
# in filter control. BL staff indicated not required but kept in case needed.
# Will also have to update python code (in/out masks, culled tables/indices need
# to be uncommented).
# MW 2024.09.04
#!record(calcout, "$(P)$(CRLID):outMask_encode"){
#! field(OUT, "$(P)$(CRLID):outMask PP")
#! field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
#!}
#!
#!record(longout, "$(P)$(CRLID):outMask") {
#! field(DTYP, "pydev")
#! field(DESC, "Fixed-out lens mask")
#! field(OUT, "@$(OBJ).setOutMask(VAL)")
#!}
#!
#!record(calcout, "$(P)$(CRLID):inMask_encode"){
#! field(OUT, "$(P)$(CRLID):inMask PP")
#! field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
#!}
#!
#!record(longout, "$(P)$(CRLID):inMask") {
#! field(DTYP, "pydev")
#! field(DESC, "Fixed-in lens mask")
#! field(OUT, "@$(OBJ).setInMask(VAL)")
#!}
#!record(longin, "$(P)$(CRLID):inMask_RBV") {
#! field(DTYP, "pydev")
#! field(INP, "@pydev.iointr('new_inMask')")
#! field(SCAN, "I/O Intr")
#!}
#!
#!record(longin, "$(P)$(CRLID):outMask_RBV") {
#! field(DTYP, "pydev")
#! field(INP, "@pydev.iointr('new_outMask')")
#! field(SCAN, "I/O Intr")
#!}
#! record(waveform, "$(P)$(CRLID):fSizes_culled"){
#! field(DTYP, "pydev")
#! field(INP, "@pydev.iointr('new_culledTable')")
#! field(SCAN, "I/O Intr")
#! field(PREC, "6")
#! field(FTVL, "DOUBLE")
#! field(NELM, "$(ELEM)")
#! }
#! record(waveform, "$(P)$(CRLID):configs_culled"){
#! field(DTYP, "pydev")
#! field(INP, "@pydev.iointr('new_culledConfigs')")
#! field(SCAN, "I/O Intr")
#! field(PREC, "6")
#! field(FTVL, "LONG")
#! field(NELM, "$(ELEM)")
#! }
...@@ -65,7 +65,7 @@ record(ao, "$(P)$(CRLID):focalSize"){ ...@@ -65,7 +65,7 @@ record(ao, "$(P)$(CRLID):focalSize"){
record(calcout, "$(P)$(CRLID):fSize_twk_up"){ record(calcout, "$(P)$(CRLID):fSize_twk_up"){
field(INPA, "$(P)$(CRLID):sortedIndex_RBV") field(INPA, "$(P)$(CRLID):sortedIndex_RBV")
field(CALC, "MIN(A+1,2**$(NUM)-1)") field(CALC, "MIN(A+1,$(ELEM)-1)")
field(OUT, "$(P)$(CRLID):sortedIndex PP") field(OUT, "$(P)$(CRLID):sortedIndex PP")
} }
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>445</width> <width>504</width>
<height>608</height> <height>610</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>Filters $(P)$(F)</string> <string>$(P)$(F)</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
......
This diff is collapsed.
11/12/2024 - 05:45:02 - ravioli
This diff is collapsed.
...@@ -275,28 +275,6 @@ class transfocator(): ...@@ -275,28 +275,6 @@ class transfocator():
self.updateLookupConfigs() self.updateLookupConfigs()
# def sort_lookup_table(self):
# '''
#
# '''
# if self.verbose: print(f'Sorting lookup table of length {len(self.lookupTable)}')
# self.sorted_L_index = np.argsort(self.lookupTable)
def updateConfig(self, config_BW):
'''
When user manually changes lenses, this gets focal size and displays it
along with updated RBVs but it doesn't set the config PV
'''
self.index = int(config_BW)
# Find the configuration in the 1/f sorted list
self.indexSorted = self.sorted_invF_index.tolist().index(self.index)
self.setFocalSizeActual()
self.updateLensRBV()
self.updateFocalSizeRBVs()
def setFocalSizeActual(self): def setFocalSizeActual(self):
''' '''
...@@ -509,12 +487,61 @@ class singleTF(transfocator): ...@@ -509,12 +487,61 @@ class singleTF(transfocator):
beamline_config = DEFAULT_CONFIG['beamline'], beamline_config = DEFAULT_CONFIG['beamline'],
crl_config = DEFAULT_CONFIG['crl']): crl_config = DEFAULT_CONFIG['crl']):
super().__init__(crl_setup = None, beam_config = DEFAULT_CONFIG['beam'], super().__init__(crl_setup = crl_setup, beam_config = beam_config,
beamline_config = DEFAULT_CONFIG['beamline'], beamline_config = beamline_config, crl_config = crl_config)
crl_config = DEFAULT_CONFIG['crl'])
def updateConfig(self, config_BW):
'''
When user manually changes lenses, this gets focal size and displays it
along with updated RBVs but it doesn't set the config PV
'''
self.index = int(config_BW)
# Find the configuration in the 1/f sorted list
self.indexSorted = self.sorted_invF_index.tolist().index(self.index)
self.setFocalSizeActual()
self.updateLensRBV()
self.updateFocalSizeRBVs()
class doubleTF(transfocator): class doubleTF(transfocator):
pass def __init__(self, crl_setup = None, beam_config = DEFAULT_CONFIG['beam'],
beamline_config = DEFAULT_CONFIG['beamline'],
crl_config = DEFAULT_CONFIG['crl']):
super().__init__(crl_setup = crl_setup, beam_config = beam_config,
beamline_config = beamline_config, crl_config = crl_config)
def updateConfig1(self, config_BW):
'''
When user manually changes lenses, this gets focal size and displays it
along with updated RBVs but it doesn't set the config PV
'''
self.index = int(config_BW)
# Find the configuration in the 1/f sorted list
#TODO how to find in double-list? ?????
self.indexSorted = self.sorted_invF_index.tolist().index(self.index)
self.setFocalSizeActual()
self.updateLensRBV()
self.updateFocalSizeRBVs()
def updateConfig2(self, config_BW):
'''
When user manually changes lenses, this gets focal size and displays it
along with updated RBVs but it doesn't set the config PV
'''
self.index = int(config_BW)
# Find the configuration in the 1/f sorted list
#TODO how to find in double-list? ?????
self.indexSorted = self.sorted_invF_index.tolist().index(self.index)
self.setFocalSizeActual()
self.updateLensRBV()
self.updateFocalSizeRBVs()
class singeTFandKB(transfocator): class singeTFandKB(transfocator):
pass pass
......
This diff is collapsed.
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
# PyDevice Support for Transfocator # PyDevice Support for Transfocator
################################################################################ ################################################################################
epicsEnvSet("PY_OBJECT", "CRL") epicsEnvSet("PY_OBJECT", "CRL")
epicsEnvSet("CRL_ID", "CRL1") epicsEnvSet("SYS_ID", "CRL")
# Set CRL numbers # Set CRL numbers
epicsEnvSet("_STACKS","10") # Number of stacks epicsEnvSet("_STACKS1","10") # Number of stacks
epicsEnvSet("_ELEM","1024") # Possible configurations: 2^(Number of stacks) epicsEnvSet("_STACKS2","10") # Number of stacks
epicsEnvSet("_ELEM","1024") # Possible configurations: 2^(min(stacks1, stacks2))
epicsEnvSet("MONOE","testMonoE") # for testing -- replace with real mono energy PV epicsEnvSet("MONOE","testMonoE") # for testing -- replace with real mono energy PV
epicsEnvSet("IDENERGY","testIDE") # for testing -- replace with real ID energy PV epicsEnvSet("IDENERGY","testIDE") # for testing -- replace with real ID energy PV
...@@ -14,29 +15,53 @@ epicsEnvSet("IDENERGY","testIDE") # for testing -- replace with real ID energy P ...@@ -14,29 +15,53 @@ epicsEnvSet("IDENERGY","testIDE") # for testing -- replace with real ID energy P
dbLoadRecords("${TOP}/db/energyTestTools.db","P=$(PREFIX), MONOE=$(MONOE), IDENERGY=$(IDENERGY)") dbLoadRecords("${TOP}/db/energyTestTools.db","P=$(PREFIX), MONOE=$(MONOE), IDENERGY=$(IDENERGY)")
dbLoadRecords("${TOP}/db/slitTestTools.db","P=$(PREFIX), SLITH=testSSH, SLITV=testSSV") dbLoadRecords("${TOP}/db/slitTestTools.db","P=$(PREFIX), SLITH=testSSH, SLITV=testSSV")
# Setting some variables beamline-dependent PVs # Setting slit PVs
epicsEnvSet('_SLITH',"$(PREFIX)testSSH") # Horizontal size of slit PV before CRL (testing) epicsEnvSet('_SLIT1H',"$(PREFIX)testSSH1") # Horizontal size of slit PV before CRL 1 (testing)
#epicsEnvSet('_SLITH',"$(PREFIX)testSSH") # Horizontal size of slit PV before CRL epicsEnvSet('_SLIT1V',"$(PREFIX)testSSV1") # Vertical size of slit PV before CRL 1 (testing)
epicsEnvSet('_SLITV',"$(PREFIX)testSSV") # Vertical size of slit PV before CRL (testing) #epicsEnvSet('_SLIT1H',"") # Horizontal size of slit PV before CRL 1
#epicsEnvSet('_SLITV',"$(PREFIX)testSSV") # Vertical size of slit PV before CRL #epicsEnvSet('_SLIT1V',"") # Vertical size of slit PV before CRL 1
epicsEnvSet('_SLIT2H',"$(PREFIX)testSSH2") # Horizontal size of slit PV before CRL 2 (testing)
epicsEnvSet('_SLIT2V',"$(PREFIX)testSSV2") # Vertical size of slit PV before CRL 2 (testing)
#epicsEnvSet('_SLIT2H',"") # Horizontal size of slit PV before CRL 2
#epicsEnvSet('_SLIT2V',"") # Vertical size of slit PV before CRL 2
#epicsEnvSet('_SLITKBH',"$(PREFIX)testSSHKB") # Horizontal size of slit PV before KB (testing)
#epicsEnvSet('_SLITKBV',"$(PREFIX)testSSVKB") # Vertical size of slit PV before KB (testing)
#epicsEnvSet('_SLITKBH',"") # Horizontal size of slit PV before KB
#epicsEnvSet('_SLITKBV',"") # Vertical size of slit PV before KB
# Setting Mono energy PV
epicsEnvSet("BLE","$(PREFIX)$(MONOE)") # Beam energy PV at CRL (testing) epicsEnvSet("BLE","$(PREFIX)$(MONOE)") # Beam energy PV at CRL (testing)
# CRL DBs and defining substitution file to get stack properties # CRL DBs and defining substitution file to get stack properties
dbLoadTemplate("substitutions/pyDeviceTfor.substitutions","P=$(PREFIX),CRLID=$(CRL_ID)") dbLoadTemplate("substitutions/pyDevCRL_stacks.substitutions","P=$(PREFIX),SYSID=$(SYS_ID)")
pydev("stack_subFile = 'substitutions/pyDeviceTfor.substitutions'") pydev("stack_subFile = 'substitutions/pyDevCRL_stacks.substitutions'")
# Add elements
dbLoadRecords("${TOP}/db/pyDevCRL_elem.db","P=$(PREFIX),SYSID=$(SYS_ID),OBJ=$(PY_OBJECT),OE=1,ELEM=$(_ELEM)")
dbLoadRecords("${TOP}/db/pyDevCRL_elem.db","P=$(PREFIX),SYSID=$(SYS_ID),OBJ=$(PY_OBJECT),OE=2,ELEM=$(_ELEM)")
# Add slits for each element
# Transforcators are numbered (1, 2); KB has string identifier ('kb') for OE ID
dbLoadRecords("${TOP}/db/pyDevCRL_slits.db","P=$(PREFIX),SYSID=$(SYS_ID),OE=1,SLITH=$(_SLIT1H),SLITV=$(_SLIT1V)")
dbLoadRecords("${TOP}/db/pyDevCRL_slits.db","P=$(PREFIX),SYSID=$(SYS_ID),OE=2,SLITH=$(_SLIT2H),SLITV=$(_SLIT2V)")
#dbLoadRecords("${TOP}/db/pyDevCRL_slits.db","P=$(PREFIX),SYSID=$(SYS_ID),OE=kb,SLITH=$(_SLITKBH),SLITV=$(_SLITKBV)")
# Import Transfocator class # Import Transfocator class
pydev("from pyTransfocator_single import singleTF") pydev("from pyCRL_system import focusingSystem")
# Create Transfocator object # Create Transfocator object
pydev("$(PY_OBJECT) = singleTF(crl_setup = 'crl_setup_single.toml')") pydev("$(PY_OBJECT) = focusingSystem(crl_setup = 'crl_setup_double.toml')")
# DB for Transfocator system # DB file for system controls
dbLoadRecords("${TOP}/db/pyDevCRLsingle.db","P=$(PREFIX), CRLID=$(CRL_ID), OBJ=$(PY_OBJECT), KEV=$(BLE), SLITH = $(_SLITH), SLITV = $(_SLITV), NUM=$(_STACKS), ELEM=$(_ELEM)") dbLoadRecords("${TOP}/db/pyDevCRL_general.db","P=$(PREFIX), SYSID=$(SYS_ID), OBJ=$(PY_OBJECT), KEV=$(BLE), ELEM=$(_ELEM)")
################################################################################ ################################################################################
# Verboseness turned on for debugging -- set to 0 to turn off # Verboseness turned on for debugging -- set to 0 to turn off
doAfterIocInit("dbpf('$(PREFIX)$(CRL_ID):verbosity','1')") doAfterIocInit("dbpf('$(PREFIX)$(SYS_ID):verbosity','1')")
# After iocInit, need to setup focal size lookup table -- because setting slit # After iocInit, need to setup focal size lookup table -- because setting slit
# sizes and energy causes the table to be recalculated, will first disable # sizes and energy causes the table to be recalculated, will first disable
...@@ -48,9 +73,9 @@ doAfterIocInit("dbpf('$(PREFIX)$(CRL_ID):verbosity','1')") ...@@ -48,9 +73,9 @@ doAfterIocInit("dbpf('$(PREFIX)$(CRL_ID):verbosity','1')")
doAfterIocInit("dbpf('$(PREFIX)CRL$(_N):recalc_enable','0')") # Disable table calc doAfterIocInit("dbpf('$(PREFIX)CRL$(_N):recalc_enable','0')") # Disable table calc
# Process current slit and energy PV settings # Process current slit and energy PV settings
doAfterIocInit("dbpf('$(PREFIX)$(CRL_ID):slitSize_H.PROC','1')") # PROC H slit size read and update CRL1 object doAfterIocInit("dbpf('$(PREFIX)$(SYS_ID):slitSize_H.PROC','1')") # PROC H slit size read and update CRL1 object
doAfterIocInit("dbpf('$(PREFIX)$(CRL_ID):slitSize_V.PROC','1')") # PROC V slit size read and update CRL1 object doAfterIocInit("dbpf('$(PREFIX)$(SYS_ID):slitSize_V.PROC','1')") # PROC V slit size read and update CRL1 object
doAfterIocInit("dbpf('$(PREFIX)$(CRL_ID):energy.PROC','1')") # PROC energy read and update CRL1 object doAfterIocInit("dbpf('$(PREFIX)$(SYS_ID):energy.PROC','1')") # PROC energy read and update CRL1 object
# Check initial energy and slit settings # Check initial energy and slit settings
doAfterIocInit("pydev('print($(PY_OBJECT).energy)')") doAfterIocInit("pydev('print($(PY_OBJECT).energy)')")
...@@ -59,9 +84,10 @@ doAfterIocInit("pydev('print($(PY_OBJECT).slits)')") ...@@ -59,9 +84,10 @@ doAfterIocInit("pydev('print($(PY_OBJECT).slits)')")
# Calc lookup table via python; later re-calculations started via EPICS (changes to energy, slits) # Calc lookup table via python; later re-calculations started via EPICS (changes to energy, slits)
# stack_subFile - string holding name/rel. location of substitutions file loaded # stack_subFile - string holding name/rel. location of substitutions file loaded
# loaded in dbLoadTemplate # loaded in dbLoadTemplate
# $(_STACKS) - number of stacks of lenses # $(_STACKS1) - number of stacks of lenses in first transfocator
doAfterIocInit("pydev('$(PY_OBJECT).setupLookupTable(stack_subFile, $(_STACKS))')") # $(_STACKS2) - number of stacks of lenses in second transfocator
doAfterIocInit("pydev('$(PY_OBJECT).setupLookupTable(stack_subFile, [$(_STACKS1),$(_STACKS2)])')")
# Enable lookup table calc PV # Enable lookup table calc PV
doAfterIocInit("dbpf('$(PREFIX)$(CRL_ID):recalc_enable','1')") # Enable table calc doAfterIocInit("dbpf('$(PREFIX)$(SYS_ID):recalc_enable','1')") # Enable table calc
################################################################################ ################################################################################
...@@ -32,7 +32,7 @@ pydev("from pyTransfocator_single import singleTF") ...@@ -32,7 +32,7 @@ pydev("from pyTransfocator_single import singleTF")
pydev("$(PY_OBJECT) = singleTF(crl_setup = 'crl_setup_single.toml')") pydev("$(PY_OBJECT) = singleTF(crl_setup = 'crl_setup_single.toml')")
# DB for Transfocator system # DB for Transfocator system
dbLoadRecords("${TOP}/db/pyDevCRLsingle.db","P=$(PREFIX), CRLID=$(CRL_ID), OBJ=$(PY_OBJECT), KEV=$(BLE), SLITH = $(_SLITH), SLITV = $(_SLITV), NUM=$(_STACKS), ELEM=$(_ELEM)") dbLoadRecords("${TOP}/db/pyDevCRLsingle.db","P=$(PREFIX), CRLID=$(CRL_ID), OBJ=$(PY_OBJECT), KEV=$(BLE), SLITH = $(_SLITH), SLITV = $(_SLITV), ELEM=$(_ELEM)")
################################################################################ ################################################################################
# Verboseness turned on for debugging -- set to 0 to turn off # Verboseness turned on for debugging -- set to 0 to turn off
......
file "$(TOP)/db/pyDevCRL_stack.db" {
pattern
{OE, M, NUMLENS, RADIUS, MAT, LOC, THICKERR, OUT, INP , INVAL, OUTVAL, INRBVVAL, DECODE, ENCODE, MASK }
{1, "01", 1, 0.002 "Be", 4.5, 1e-6, "100idPyCRL:CRL1:stack01_RBV PP", "", 1, 0, 1, "B", "A", "A" }
{1, "02", 1, 0.001 "Be", 3.5, 1e-6, "100idPyCRL:CRL1:stack02_RBV PP", "", 1, 0, 1, "C", "B", "B" }
{1, "03", 1, 0.0005 "Be", 2.5, 1e-6, "100idPyCRL:CRL1:stack03_RBV PP", "", 1, 0, 1, "D", "C", "C" }
{1, "04", 1, 0.0003 "Be", 1.5, 1e-6, "100idPyCRL:CRL1:stack04_RBV PP", "", 1, 0, 1, "E", "D", "D" }
{1, "05", 1, 0.0002 "Be", 0.5, 1e-6, "100idPyCRL:CRL1:stack05_RBV PP", "", 1, 0, 1, "F", "E", "E" }
{1, "06", 1, 0.0001 "Be", -0.5, 1e-6, "100idPyCRL:CRL1:stack06_RBV PP", "", 1, 0, 1, "G", "F", "F" }
{1, "07", 2, 0.0001 "Be", -1.5, 1.4e-6, "100idPyCRL:CRL1:stack07_RBV PP", "", 1, 0, 1, "H", "G", "G" }
{1, "08", 4, 0.0001 "Be", -2.5 2.0e-6, "100idPyCRL:CRL1:stack08_RBV PP", "", 1, 0, 1, "I", "H", "H" }
{1, "09", 8, 0.0001 "Be", -3.5 2.8e-6, "100idPyCRL:CRL1:stack09_RBV PP", "", 1, 0, 1, "J", "I", "I" }
{1, "10", 16, 0.0001 "Be", -4.5 4e-6, "100idPyCRL:CRL1:stack10_RBV PP", "", 1, 0, 1, "K", "J", "J" }
{2, "01", 1, 0.002 "Be", 4.5, 1e-6, "100idPyCRL:CRL1:stack01_RBV PP", "", 1, 0, 1, "B", "A", "A" }
{2, "02", 1, 0.001 "Be", 3.5, 1e-6, "100idPyCRL:CRL1:stack02_RBV PP", "", 1, 0, 1, "C", "B", "B" }
{2, "03", 1, 0.0005 "Be", 2.5, 1e-6, "100idPyCRL:CRL1:stack03_RBV PP", "", 1, 0, 1, "D", "C", "C" }
{2, "04", 1, 0.0003 "Be", 1.5, 1e-6, "100idPyCRL:CRL1:stack04_RBV PP", "", 1, 0, 1, "E", "D", "D" }
{2, "05", 1, 0.0002 "Be", 0.5, 1e-6, "100idPyCRL:CRL1:stack05_RBV PP", "", 1, 0, 1, "F", "E", "E" }
{2, "06", 1, 0.0001 "Be", -0.5, 1e-6, "100idPyCRL:CRL1:stack06_RBV PP", "", 1, 0, 1, "G", "F", "F" }
{2, "07", 2, 0.0001 "Be", -1.5, 1.4e-6, "100idPyCRL:CRL1:stack07_RBV PP", "", 1, 0, 1, "H", "G", "G" }
{2, "08", 4, 0.0001 "Be", -2.5 2.0e-6, "100idPyCRL:CRL1:stack08_RBV PP", "", 1, 0, 1, "I", "H", "H" }
{2, "09", 8, 0.0001 "Be", -3.5 2.8e-6, "100idPyCRL:CRL1:stack09_RBV PP", "", 1, 0, 1, "J", "I", "I" }
{2, "10", 16, 0.0001 "Be", -4.5 4e-6, "100idPyCRL:CRL1:stack10_RBV PP", "", 1, 0, 1, "K", "J", "J" }
}
file "$(TOP)/100idPyApp/Db/pyDevCRL_stack.db" {
pattern
{M, NUMLENS, RADIUS, MAT, LOC, THICKERR, OUT, INP , INVAL, OUTVAL, INRBVVAL, DECODE, ENCODE, MASK }
{"01", 1, 0.002 "Be", 4.5, 1e-6, "100idPyCRL:CRL1:stack01_RBV PP", "", 1, 0, 1, "B", "A", "A" }
{"02", 1, 0.001 "Be", 3.5, 1e-6, "100idPyCRL:CRL1:stack02_RBV PP", "", 1, 0, 1, "C", "B", "B" }
{"03", 1, 0.0005 "Be", 2.5, 1e-6, "100idPyCRL:CRL1:stack03_RBV PP", "", 1, 0, 1, "D", "C", "C" }
{"04", 1, 0.0003 "Be", 1.5, 1e-6, "100idPyCRL:CRL1:stack04_RBV PP", "", 1, 0, 1, "E", "D", "D" }
{"05", 1, 0.0002 "Be", 0.5, 1e-6, "100idPyCRL:CRL1:stack05_RBV PP", "", 1, 0, 1, "F", "E", "E" }
{"06", 1, 0.0001 "Be", -0.5, 1e-6, "100idPyCRL:CRL1:stack06_RBV PP", "", 1, 0, 1, "G", "F", "F" }
{"07", 2, 0.0001 "Be", -1.5, 1.4e-6, "100idPyCRL:CRL1:stack07_RBV PP", "", 1, 0, 1, "H", "G", "G" }
{"08", 4, 0.0001 "Be", -2.5 2.0e-6, "100idPyCRL:CRL1:stack08_RBV PP", "", 1, 0, 1, "I", "H", "H" }
{"09", 8, 0.0001 "Be", -3.5 2.8e-6, "100idPyCRL:CRL1:stack09_RBV PP", "", 1, 0, 1, "J", "I", "I" }
{"10", 16, 0.0001 "Be", -4.5 4e-6, "100idPyCRL:CRL1:stack10_RBV PP", "", 1, 0, 1, "K", "J", "J" }
}
################################################################################ ################################################################################
# PyDevice Support for Filter attenuation calculations # PyDevice Support for Filter attenuation calculations
################################################################################ ################################################################################
# Set the number of filters, needs to match number of filters in substitution file
epicsEnvSet("NUM_FILTERS","12")
epicsEnvSet("PY_OBJECT", "filters")
epicsEnvSet("FILTER_ID", "FL-1")
# Next two lines set up some testing tools for energy -- can be commented out # Next two lines set up some testing tools for energy -- can be commented out
epicsEnvSet("MONOE","testMonoE") epicsEnvSet("MONOE","testMonoE")
dbLoadRecords("${TOP}/db/energyTestTools.db","P=$(PREFIX), MONOE=$(MONOE), IDENERGY=testIDE") dbLoadRecords("${TOP}/db/energyTestTools.db","P=$(PREFIX), MONOE=$(MONOE), IDENERGY=testIDE")
# Load individual filter properties
dbLoadTemplate("substitutions/pyDeviceFilter.substitutions","P=$(PREFIX), FILTER_ID=$(FILTER_ID)")
pydev("$(PY_OBJECT)_subFile = 'substitutions/pyDeviceFilter.substitutions'")
# Create PyDevice filter object
pydev("from pyDevFilters import filterBlock")
pydev("$(PY_OBJECT) = filterBlock(filter_id = '$(FILTER_ID)')")
# Update the next line for the beamline energy # Update the next line for the beamline energy
epicsEnvSet("BLE","$(PREFIX)$(MONOE)") epicsEnvSet("BLE","$(PREFIX)$(MONOE)")
# Load Filter system control records # NUMF - Number of filters in system
dbLoadRecords("${TOP}/db/pyDevFilters.db","P=$(PREFIX), FILTER_ID=$(FILTER_ID), OBJ=$(PY_OBJECT), NUM=$(NUM_FILTERS), KEV=$(BLE)") #
# IDX - ID number of system
#
# SUBFILE - substitution file for system
#
# BLE - PV for beamline energy (in keV)
iocshLoad("iocsh/pydeviceFilters.iocsh","P=$(PREFIX), NUMF=12, IDX=2, SUBFILE='substitutions/pyDeviceFilter.substitutions', BLE=$(BLE)")
# After iocInit, need to setup attenuation lookup table
# $(PY_OBJECT)_subFile - string holding name/rel. location of substitutions file loaded
# loaded in dbLoadTemplate
# NUM_FILTERS - number of filters
# 8.5 - beam energy in keV used for the initial lookup table setup -- can be updated
# after startup
doAfterIocInit("pydev('$(PY_OBJECT).setupLookupTable($(PY_OBJECT)_subFile, $(NUM_FILTERS), energy = 8.5)')")
################################################################################
# Support for single filter system
################################################################################
# PREFIX - IOC Prefix
#
# NUMF - Number of filters in system
#
# IDX - ID number of system
#
# SUBFILE - substitution file for system
#
# BLE - PV for beamline energy
# Set the number of filters, needs to match number of filters in substitution file
epicsEnvSet("NUM_FILTERS","$(NUMF)")
# Need unique python object and filter id for each filter system in IOC, otherwise
# there can be "cross-talk" between python code and PVs
epicsEnvSet("PY_OBJECT", "fl$(IDX)") # Needs to heed python variable name requirements
epicsEnvSet("FILTER_ID", "FL$(IDX)") # Only needs to be a string (used as a string in python code)
# Load individual filter properties
dbLoadTemplate("$(SUBFILE)","P=$(P), FILTER_ID=$(FILTER_ID)")
pydev("$(PY_OBJECT)_subFile = '$(SUBFILE)'")
# Create PyDevice filter object
pydev("from pyDevFilters import filterBlock")
pydev("$(PY_OBJECT) = filterBlock(filter_id = '$(FILTER_ID)')")
# Load Filter system control records
dbLoadRecords("${TOP}/db/pyDevFilters.db","P=$(P), FILTER_ID=$(FILTER_ID), OBJ=$(PY_OBJECT), NUM=$(NUM_FILTERS), KEV=$(BLE)")
# After iocInit, need to setup attenuation lookup table
# $(PY_OBJECT)_subFile - string holding name/rel. location of substitutions file loaded
# loaded in dbLoadTemplate
# NUM_FILTERS - number of filters
# 8.5 - beam energy in keV used for the initial lookup table setup -- can be updated
# after startup
doAfterIocInit("pydev('$(PY_OBJECT).setupLookupTable($(PY_OBJECT)_subFile, $(NUM_FILTERS), energy = 8.5)')")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment