Source code for orbit.py_linac.overlapping_fields.sns_enge_func_factory
#!/usr/bin/env python
# --------------------------------------------------------------
# This is a Enge Function Factory specific for the SNS. Some
# Enge's function parameters are found by fitting the measured or
# calculated field distributions. Others are generated with quad's
# length and beam pipe diameter.
# These parameters for SNS with the specific quads' names.
# For your accelerator you should create your own factory.
# --------------------------------------------------------------
import math
import sys
import os
from orbit.py_linac.overlapping_fields.overlapping_quad_fields_lib import EngeFunction
from orbit.py_linac.overlapping_fields.overlapping_quad_fields_lib import SimpleQuadFieldFunc
[docs]def SNS_EngeFunctionFactory(quad):
"""
It generates the Enge's Function for SNS quads. For some of the quads in the SNS
lattice we know the Enge's parameters. So, it is a SNS specific function.
"""
name = quad.getName()
if name.find("MEBT") >= 0:
names_042mm = ["MEBT_Mag:QH05", "MEBT_Mag:QV06", "MEBT_Mag:QH07"]
names_042mm += ["MEBT_Mag:QH08", "MEBT_Mag:QV09", "MEBT_Mag:QH10"]
if name in names_042mm:
length_param = 0.066
acceptance_diameter_param = 0.0363
cutoff_level = 0.001
func = EngeFunction(length_param, acceptance_diameter_param, cutoff_level)
return func
names_032mm = ["MEBT_Mag:QH01", "MEBT_Mag:QV02", "MEBT_Mag:QH03", "MEBT_Mag:QV04"]
names_032mm += ["MEBT_Mag:QV11", "MEBT_Mag:QH12", "MEBT_Mag:QV13", "MEBT_Mag:QH14"]
if name in names_032mm:
length_param = 0.061
acceptance_diameter_param = 0.029
cutoff_level = 0.001
func = EngeFunction(length_param, acceptance_diameter_param, cutoff_level)
return func
if name.find("DTL") >= 0:
# ---- for the DTL_Mag:PMQH100 we have to cut the field because it leaks to the MEBT section
if name == "DTL_Mag:PMQH100":
func = SimpleQuadFieldFunc(quad)
return func
# ---- for the DTL_Mag:PMQV300 we have to cut the field because it leaks to the DTL2 section
if name == "DTL_Mag:PMQV300":
func = SimpleQuadFieldFunc(quad)
return func
# ---- for the DTL_Mag:PMQH500 we have to cut the field because it leaks to the DTL4 section
if name == "DTL_Mag:PMQH500":
func = SimpleQuadFieldFunc(quad)
return func
# ----- the SNS DTL quads are all the same L= 35 mm D = 25 mm
length_param = 0.0408
acceptance_diameter_param = 0.0192
cutoff_level = 0.001
func = EngeFunction(length_param, acceptance_diameter_param, cutoff_level)
return func
if name.find("CCL") >= 0:
# ---- for the CCL_Mag:QH00 we have to cut the field because it leaks to the DTL6 section
if name == "CCL_Mag:QH00":
func = SimpleQuadFieldFunc(quad)
return func
# ----- general Enge's Function
length_param = quad.getLength()
if quad.hasParam("aperture"):
acceptance_diameter_param = quad.getParam("aperture")
cutoff_level = 0.001
func = EngeFunction(length_param, acceptance_diameter_param, cutoff_level)
return func
else:
msg = "SNS_EngeFunctionFactory Python function. "
msg += os.linesep
msg += "Cannot create the EngeFunction for the quad!"
msg += os.linesep
msg = msg + "quad name = " + quad.getName()
msg = msg + os.linesep
msg = msg + "It does not have the aperture parameter!"
msg = msg + os.linesep
orbitFinalize(msg)
return None