Source code for orbit.space_charge.scLatticeModifications
"""
Module. Includes a base function that will modify the accelerator lattice by inserting the SC accelerator nodes.
"""
# import the auxiliary classes
from orbit.utils import orbitFinalize
# import general accelerator elements and lattice
from orbit.lattice import AccLattice, AccNode, AccActionsContainer, AccNodeBunchTracker
[docs]def setSC_General_AccNodes(lattice, sc_path_length_min, space_charge_calculator, SC_NodeConstructor):
"""
It will put a set of a space charge nodes into the lattice as child nodes of the first level accelerator nodes.
The SC nodes will be inserted at the beginning of a particular part of the first level AccNode element.
The distance between SC nodes should be more than sc_path_length_min. The function will return
the array of SC nodes as a convenience for the user. This is a general function, and SC nodes will need
specific information which will be provided for them later according to the specific nature of SC nodes.
"""
accNodes = lattice.getNodes()
if len(accNodes) == 0:
return
# -----------------------------------------------
# nodes_arr[(accNode, part_index, position, path_length)]
# -----------------------------------------------
nodes_arr = []
length_total = 0.0
running_path = 0.0
rest_length = 0.0
for accNode in accNodes:
nParts = accNode.getnParts()
for ip in range(nParts):
part_length = accNode.getLength(ip)
if part_length > 1.0:
print(
"Warning! Node ",
accNode.getName(),
" has length ",
part_length,
"m which is great than 1 m. ",
" Space charge algorithm may be innacurate!",
)
if running_path > sc_path_length_min:
nodes_arr.append((accNode, ip, length_total, running_path))
running_path = 0.0
running_path += part_length
length_total += part_length
if len(nodes_arr) > 0:
rest_length = length_total - nodes_arr[len(nodes_arr) - 1][2]
else:
rest_length = length_total
# the first SC node in the beginning of the lattice
nodes_arr.insert(0, (accNodes[0], 0, 0.0, rest_length))
# ---------------------------------------------------
# Now we put all SC nodes as a childeren of accNodes
# ---------------------------------------------------
scNodes_arr = []
for inode in range(len(nodes_arr) - 1):
(accNode, part_index, position, path_length) = nodes_arr[inode]
(accNodeNext, part_indexNext, positionNext, path_lengthNext) = nodes_arr[inode + 1]
scNode = SC_NodeConstructor(space_charge_calculator, accNode.getName() + ":" + str(part_index) + ":")
scNode.setLengthOfSC(path_lengthNext)
scNodes_arr.append(scNode)
accNode.addChildNode(scNode, AccNode.BODY, part_index, AccNode.BEFORE)
# set the last SC node
(accNode, part_index, position, path_length) = nodes_arr[len(nodes_arr) - 1]
scNode = SC_NodeConstructor(space_charge_calculator, accNode.getName() + ":" + str(part_index) + ":")
scNode.setLengthOfSC(rest_length)
scNodes_arr.append(scNode)
accNode.addChildNode(scNode, AccNode.BODY, part_index, AccNode.BEFORE)
return scNodes_arr