Working with Lattices¶
In [1]:
Copied!
import genesis.version4 as g4
%config InlineBackend.figure_format = 'retina' # Nicer plots
import genesis.version4 as g4
%config InlineBackend.figure_format = 'retina' # Nicer plots
Load an existing lattice file¶
You can load an existing Genesis4-format Lattices input directly from a file by using from_file:
In [2]:
Copied!
lat = g4.Lattice.from_file("data/basic4/hxr.lat")
lat = g4.Lattice.from_file("data/basic4/hxr.lat")
In [3]:
Copied!
lat.elements
lat.elements
Out[3]:
{'QHXH17': Quadrupole(L=0.101, k1=1.78),
 'QHXH18': Quadrupole(L=0.101, k1=-1.78),
 'QHXH19': Quadrupole(L=0.101, k1=1.78),
 'QHXH20': Quadrupole(L=0.101, k1=-1.78),
 'QHXH21': Quadrupole(L=0.101, k1=1.78),
 'QHXH22': Quadrupole(L=0.101, k1=-1.78),
 'QHXH23': Quadrupole(L=0.101, k1=1.78),
 'QHXH24': Quadrupole(L=0.101, k1=-1.78),
 'QHXH25': Quadrupole(L=0.101, k1=1.78),
 'QHXH26': Quadrupole(L=0.101, k1=-1.78),
 'QHXH27': Quadrupole(L=0.101, k1=1.78),
 'QHXH28': Quadrupole(L=0.101, k1=-1.78),
 'QHXH29': Quadrupole(L=0.101, k1=1.78),
 'QHXH30': Quadrupole(L=0.101, k1=-1.78),
 'QHXH31': Quadrupole(L=0.101, k1=1.78),
 'QHXH32': Quadrupole(L=0.101, k1=-1.78),
 'QHXH33': Quadrupole(L=0.101, k1=1.78),
 'QHXH34': Quadrupole(L=0.101, k1=-1.78),
 'QHXH35': Quadrupole(L=0.101, k1=1.78),
 'QHXH36': Quadrupole(L=0.101, k1=-1.78),
 'QHXH37': Quadrupole(L=0.101, k1=1.78),
 'QHXH38': Quadrupole(L=0.101, k1=-1.78),
 'QHXH39': Quadrupole(L=0.101, k1=1.78),
 'QHXH40': Quadrupole(L=0.101, k1=-1.78),
 'QHXH41': Quadrupole(L=0.101, k1=1.78),
 'QHXH42': Quadrupole(L=0.101, k1=-1.78),
 'QHXH43': Quadrupole(L=0.101, k1=1.78),
 'QHXH44': Quadrupole(L=0.101, k1=-1.78),
 'QHXH45': Quadrupole(L=0.101, k1=1.78),
 'QHXH46': Quadrupole(L=0.101, k1=-1.78),
 'QHXH47': Quadrupole(L=0.101, k1=1.78),
 'QHXH48': Quadrupole(L=0.101, k1=-1.78),
 'QHXH49': Quadrupole(L=0.101, k1=1.78),
 'QHXH50': Quadrupole(L=0.101, k1=-1.78),
 'UMAHXH17': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH18': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH19': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH20': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH21': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH22': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH23': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH25': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH26': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH27': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH28': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH29': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH30': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH31': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH33': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH34': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH35': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH36': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH37': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH38': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH39': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH40': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH41': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH42': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH43': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH44': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH45': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH46': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH47': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH48': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH49': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'UMAHXH50': Undulator(aw=1.7017, lambdau=0.026, nwig=130),
 'CORR00': Corrector(L=0.001),
 'CORR01': Corrector(L=0.001),
 'CORR02': Corrector(L=0.001),
 'CORR03': Corrector(L=0.001),
 'CORR04': Corrector(L=0.001),
 'CORR05': Corrector(L=0.001),
 'CORR06': Corrector(L=0.001),
 'CORR07': Corrector(L=0.001),
 'CORR08': Corrector(L=0.001),
 'CORR09': Corrector(L=0.001),
 'CORR10': Corrector(L=0.001),
 'CORR11': Corrector(L=0.001),
 'CORR12': Corrector(L=0.001),
 'CORR13': Corrector(L=0.001),
 'CORR14': Corrector(L=0.001),
 'CORR15': Corrector(L=0.001),
 'CORR16': Corrector(L=0.001),
 'CORR17': Corrector(L=0.001),
 'CORR18': Corrector(L=0.001),
 'CORR19': Corrector(L=0.001),
 'CORR20': Corrector(L=0.001),
 'CORR21': Corrector(L=0.001),
 'CORR22': Corrector(L=0.001),
 'CORR23': Corrector(L=0.001),
 'CORR24': Corrector(L=0.001),
 'CORR25': Corrector(L=0.001),
 'CORR26': Corrector(L=0.001),
 'CORR27': Corrector(L=0.001),
 'CORR28': Corrector(L=0.001),
 'CORR29': Corrector(L=0.001),
 'CORR30': Corrector(L=0.001),
 'CORR31': Corrector(L=0.001),
 'CORR32': Corrector(L=0.001),
 'CORR33': Corrector(L=0.001),
 'D1': Drift(L=0.1335),
 'D2': Drift(L=0.4615),
 'D3': Drift(L=0.328),
 'D4': Drift(L=3.4),
 'HXRSS': Chicane(L=4.55, lb=0.1),
 'HXR': Line(
   elements=[
     'D1',
     'UMAHXH17',
     'D2',
     'QHXH17',
     'CORR00',
     'D3',
     'D1',
     'UMAHXH18',
     'D2',
     'QHXH18',
     'CORR01',
     'D3',
     'D1',
     'UMAHXH19',
     'D2',
     'QHXH19',
     'CORR02',
     'D3',
     'D1',
     'UMAHXH20',
     'D2',
     'QHXH20',
     'CORR03',
     'D3',
     'D1',
     'UMAHXH21',
     'D2',
     'QHXH21',
     'CORR04',
     'D3',
     'D1',
     'UMAHXH22',
     'D2',
     'QHXH22',
     'CORR05',
     'D3',
     'D1',
     'UMAHXH23',
     'D2',
     'QHXH23',
     'CORR06',
     'D3',
     'D1',
     'HXRSS',
     'D2',
     'QHXH24',
     'CORR07',
     'D3',
     'D1',
     'UMAHXH25',
     'D2',
     'QHXH25',
     'CORR08',
     'D3',
     'D1',
     'UMAHXH26',
     'D2',
     'QHXH26',
     'CORR09',
     'D3',
     'D1',
     'UMAHXH27',
     'D2',
     'QHXH27',
     'CORR10',
     'D3',
     'D1',
     'UMAHXH28',
     'D2',
     'QHXH28',
     'CORR11',
     'D3',
     'D1',
     'UMAHXH29',
     'D2',
     'QHXH29',
     'CORR12',
     'D3',
     'D1',
     'UMAHXH30',
     'D2',
     'QHXH30',
     'CORR13',
     'D3',
     'D1',
     'UMAHXH31',
     'D2',
     'QHXH31',
     'CORR14',
     'D3',
     'D1',
     'D4',
     'D2',
     'QHXH32',
     'CORR15',
     'D3',
     'D1',
     'UMAHXH33',
     'D2',
     'QHXH33',
     'CORR16',
     'D3',
     'D1',
     'UMAHXH34',
     'D2',
     'QHXH34',
     'CORR17',
     'D3',
     'D1',
     'UMAHXH35',
     'D2',
     'QHXH35',
     'CORR18',
     'D3',
     'D1',
     'UMAHXH36',
     'D2',
     'QHXH36',
     'CORR19',
     'D3',
     'D1',
     'UMAHXH37',
     'D2',
     'QHXH37',
     'CORR20',
     'D3',
     'D1',
     'UMAHXH38',
     'D2',
     'QHXH38',
     'CORR21',
     'D3',
     'D1',
     'UMAHXH39',
     'D2',
     'QHXH39',
     'CORR22',
     'D3',
     'D1',
     'UMAHXH40',
     'D2',
     'QHXH40',
     'CORR23',
     'D3',
     'D1',
     'UMAHXH41',
     'D2',
     'QHXH41',
     'CORR24',
     'D3',
     'D1',
     'UMAHXH42',
     'D2',
     'QHXH42',
     'CORR25',
     'D3',
     'D1',
     'UMAHXH43',
     'D2',
     'QHXH43',
     'CORR26',
     'D3',
     'D1',
     'UMAHXH44',
     'D2',
     'QHXH44',
     'CORR27',
     'D3',
     'D1',
     'UMAHXH45',
     'D2',
     'QHXH45',
     'CORR28',
     'D3',
     'D1',
     'UMAHXH46',
     'D2',
     'QHXH46',
     'CORR29',
     'D3',
     'D1',
     'UMAHXH47',
     'D2',
     'QHXH47',
     'CORR30',
     'D3',
     'D1',
     'UMAHXH48',
     'D2',
     'QHXH48',
     'CORR31',
     'D3',
     'D1',
     'UMAHXH49',
     'D2',
     'QHXH49',
     'CORR32',
     'D3',
     'D1',
     'UMAHXH50',
     'D2',
     'QHXH50',
     'CORR33',
     'D3',
   ],
 ),
 'LCLS2_HXR_U1': Line(
   elements=[
     'D1',
     'UMAHXH17',
     'D2',
     'QHXH17',
     'CORR00',
     'D3',
     'D1',
     'UMAHXH18',
     'D2',
     'QHXH18',
     'CORR01',
     'D3',
     'D1',
     'UMAHXH19',
     'D2',
     'QHXH19',
     'CORR02',
     'D3',
     'D1',
     'UMAHXH20',
     'D2',
     'QHXH20',
     'CORR03',
     'D3',
     'D1',
     'UMAHXH21',
     'D2',
     'QHXH21',
     'CORR04',
     'D3',
     'D1',
     'UMAHXH22',
     'D2',
     'QHXH22',
     'CORR05',
     'D3',
     'D1',
     'UMAHXH23',
     'D2',
     'QHXH23',
     'CORR06',
     'D3',
   ],
 ),
 'LCLS2_HXR_U2': Line(
   elements=[
     'D1',
     'UMAHXH25',
     'D2',
     'QHXH25',
     'CORR08',
     'D3',
     'D1',
     'UMAHXH26',
     'D2',
     'QHXH26',
     'CORR09',
     'D3',
     'D1',
     'UMAHXH27',
     'D2',
     'QHXH27',
     'CORR10',
     'D3',
     'D1',
     'UMAHXH28',
     'D2',
     'QHXH28',
     'CORR11',
     'D3',
     'D1',
     'UMAHXH29',
     'D2',
     'QHXH29',
     'CORR12',
     'D3',
     'D1',
     'UMAHXH30',
     'D2',
     'QHXH30',
     'CORR13',
     'D3',
     'D1',
     'UMAHXH31',
     'D2',
     'QHXH31',
     'CORR14',
     'D3',
     'D1',
     'D4',
     'D2',
     'QHXH32',
     'CORR15',
     'D3',
     'D1',
     'UMAHXH33',
     'D2',
     'QHXH33',
     'CORR16',
     'D3',
     'D1',
     'UMAHXH34',
     'D2',
     'QHXH34',
     'CORR17',
     'D3',
     'D1',
     'UMAHXH35',
     'D2',
     'QHXH35',
     'CORR18',
     'D3',
     'D1',
     'UMAHXH36',
     'D2',
     'QHXH36',
     'CORR19',
     'D3',
     'D1',
     'UMAHXH37',
     'D2',
     'QHXH37',
     'CORR20',
     'D3',
     'D1',
     'UMAHXH38',
     'D2',
     'QHXH38',
     'CORR21',
     'D3',
     'D1',
     'UMAHXH39',
     'D2',
     'QHXH39',
     'CORR22',
     'D3',
     'D1',
     'UMAHXH40',
     'D2',
     'QHXH40',
     'CORR23',
     'D3',
     'D1',
     'UMAHXH41',
     'D2',
     'QHXH41',
     'CORR24',
     'D3',
     'D1',
     'UMAHXH42',
     'D2',
     'QHXH42',
     'CORR25',
     'D3',
     'D1',
     'UMAHXH43',
     'D2',
     'QHXH43',
     'CORR26',
     'D3',
     'D1',
     'UMAHXH44',
     'D2',
     'QHXH44',
     'CORR27',
     'D3',
     'D1',
     'UMAHXH45',
     'D2',
     'QHXH45',
     'CORR28',
     'D3',
     'D1',
     'UMAHXH46',
     'D2',
     'QHXH46',
     'CORR29',
     'D3',
     'D1',
     'UMAHXH47',
     'D2',
     'QHXH47',
     'CORR30',
     'D3',
     'D1',
     'UMAHXH48',
     'D2',
     'QHXH48',
     'CORR31',
     'D3',
     'D1',
     'UMAHXH49',
     'D2',
     'QHXH49',
     'CORR32',
     'D3',
     'D1',
     'UMAHXH50',
     'D2',
     'QHXH50',
     'CORR33',
     'D3',
   ],
 )}
This input object is a convenient dataclass which contains all of the beamline elements and offers some convenience methods.
See the Genesis4 format of the lattice¶
We can see the Genesis 4 representation by looking at lat.to_genesis():
In [4]:
Copied!
print(lat.to_genesis())
print(lat.to_genesis())
QHXH17: quadrupole = {l=0.101, k1=1.78};
QHXH18: quadrupole = {l=0.101, k1=-1.78};
QHXH19: quadrupole = {l=0.101, k1=1.78};
QHXH20: quadrupole = {l=0.101, k1=-1.78};
QHXH21: quadrupole = {l=0.101, k1=1.78};
QHXH22: quadrupole = {l=0.101, k1=-1.78};
QHXH23: quadrupole = {l=0.101, k1=1.78};
QHXH24: quadrupole = {l=0.101, k1=-1.78};
QHXH25: quadrupole = {l=0.101, k1=1.78};
QHXH26: quadrupole = {l=0.101, k1=-1.78};
QHXH27: quadrupole = {l=0.101, k1=1.78};
QHXH28: quadrupole = {l=0.101, k1=-1.78};
QHXH29: quadrupole = {l=0.101, k1=1.78};
QHXH30: quadrupole = {l=0.101, k1=-1.78};
QHXH31: quadrupole = {l=0.101, k1=1.78};
QHXH32: quadrupole = {l=0.101, k1=-1.78};
QHXH33: quadrupole = {l=0.101, k1=1.78};
QHXH34: quadrupole = {l=0.101, k1=-1.78};
QHXH35: quadrupole = {l=0.101, k1=1.78};
QHXH36: quadrupole = {l=0.101, k1=-1.78};
QHXH37: quadrupole = {l=0.101, k1=1.78};
QHXH38: quadrupole = {l=0.101, k1=-1.78};
QHXH39: quadrupole = {l=0.101, k1=1.78};
QHXH40: quadrupole = {l=0.101, k1=-1.78};
QHXH41: quadrupole = {l=0.101, k1=1.78};
QHXH42: quadrupole = {l=0.101, k1=-1.78};
QHXH43: quadrupole = {l=0.101, k1=1.78};
QHXH44: quadrupole = {l=0.101, k1=-1.78};
QHXH45: quadrupole = {l=0.101, k1=1.78};
QHXH46: quadrupole = {l=0.101, k1=-1.78};
QHXH47: quadrupole = {l=0.101, k1=1.78};
QHXH48: quadrupole = {l=0.101, k1=-1.78};
QHXH49: quadrupole = {l=0.101, k1=1.78};
QHXH50: quadrupole = {l=0.101, k1=-1.78};
UMAHXH17: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH18: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH19: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH20: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH21: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH22: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH23: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH25: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH26: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH27: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH28: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH29: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH30: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH31: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH33: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH34: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH35: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH36: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH37: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH38: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH39: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH40: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH41: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH42: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH43: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH44: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH45: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH46: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH47: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH48: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH49: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
UMAHXH50: undulator = {aw=1.7017, lambdau=0.026, nwig=130};
CORR00: corrector = {l=0.001};
CORR01: corrector = {l=0.001};
CORR02: corrector = {l=0.001};
CORR03: corrector = {l=0.001};
CORR04: corrector = {l=0.001};
CORR05: corrector = {l=0.001};
CORR06: corrector = {l=0.001};
CORR07: corrector = {l=0.001};
CORR08: corrector = {l=0.001};
CORR09: corrector = {l=0.001};
CORR10: corrector = {l=0.001};
CORR11: corrector = {l=0.001};
CORR12: corrector = {l=0.001};
CORR13: corrector = {l=0.001};
CORR14: corrector = {l=0.001};
CORR15: corrector = {l=0.001};
CORR16: corrector = {l=0.001};
CORR17: corrector = {l=0.001};
CORR18: corrector = {l=0.001};
CORR19: corrector = {l=0.001};
CORR20: corrector = {l=0.001};
CORR21: corrector = {l=0.001};
CORR22: corrector = {l=0.001};
CORR23: corrector = {l=0.001};
CORR24: corrector = {l=0.001};
CORR25: corrector = {l=0.001};
CORR26: corrector = {l=0.001};
CORR27: corrector = {l=0.001};
CORR28: corrector = {l=0.001};
CORR29: corrector = {l=0.001};
CORR30: corrector = {l=0.001};
CORR31: corrector = {l=0.001};
CORR32: corrector = {l=0.001};
CORR33: corrector = {l=0.001};
D1: drift = {l=0.1335};
D2: drift = {l=0.4615};
D3: drift = {l=0.328};
D4: drift = {l=3.4};
HXRSS: chicane = {l=4.55, lb=0.1};
HXR: LINE = {D1, UMAHXH17, D2, QHXH17, CORR00, D3, D1, UMAHXH18, D2, QHXH18, CORR01, D3, D1, UMAHXH19, D2, QHXH19, CORR02, D3, D1, UMAHXH20, D2, QHXH20, CORR03, D3, D1, UMAHXH21, D2, QHXH21, CORR04, D3, D1, UMAHXH22, D2, QHXH22, CORR05, D3, D1, UMAHXH23, D2, QHXH23, CORR06, D3, D1, HXRSS, D2, QHXH24, CORR07, D3, D1, UMAHXH25, D2, QHXH25, CORR08, D3, D1, UMAHXH26, D2, QHXH26, CORR09, D3, D1, UMAHXH27, D2, QHXH27, CORR10, D3, D1, UMAHXH28, D2, QHXH28, CORR11, D3, D1, UMAHXH29, D2, QHXH29, CORR12, D3, D1, UMAHXH30, D2, QHXH30, CORR13, D3, D1, UMAHXH31, D2, QHXH31, CORR14, D3, D1, D4, D2, QHXH32, CORR15, D3, D1, UMAHXH33, D2, QHXH33, CORR16, D3, D1, UMAHXH34, D2, QHXH34, CORR17, D3, D1, UMAHXH35, D2, QHXH35, CORR18, D3, D1, UMAHXH36, D2, QHXH36, CORR19, D3, D1, UMAHXH37, D2, QHXH37, CORR20, D3, D1, UMAHXH38, D2, QHXH38, CORR21, D3, D1, UMAHXH39, D2, QHXH39, CORR22, D3, D1, UMAHXH40, D2, QHXH40, CORR23, D3, D1, UMAHXH41, D2, QHXH41, CORR24, D3, D1, UMAHXH42, D2, QHXH42, CORR25, D3, D1, UMAHXH43, D2, QHXH43, CORR26, D3, D1, UMAHXH44, D2, QHXH44, CORR27, D3, D1, UMAHXH45, D2, QHXH45, CORR28, D3, D1, UMAHXH46, D2, QHXH46, CORR29, D3, D1, UMAHXH47, D2, QHXH47, CORR30, D3, D1, UMAHXH48, D2, QHXH48, CORR31, D3, D1, UMAHXH49, D2, QHXH49, CORR32, D3, D1, UMAHXH50, D2, QHXH50, CORR33, D3};
LCLS2_HXR_U1: LINE = {D1, UMAHXH17, D2, QHXH17, CORR00, D3, D1, UMAHXH18, D2, QHXH18, CORR01, D3, D1, UMAHXH19, D2, QHXH19, CORR02, D3, D1, UMAHXH20, D2, QHXH20, CORR03, D3, D1, UMAHXH21, D2, QHXH21, CORR04, D3, D1, UMAHXH22, D2, QHXH22, CORR05, D3, D1, UMAHXH23, D2, QHXH23, CORR06, D3};
LCLS2_HXR_U2: LINE = {D1, UMAHXH25, D2, QHXH25, CORR08, D3, D1, UMAHXH26, D2, QHXH26, CORR09, D3, D1, UMAHXH27, D2, QHXH27, CORR10, D3, D1, UMAHXH28, D2, QHXH28, CORR11, D3, D1, UMAHXH29, D2, QHXH29, CORR12, D3, D1, UMAHXH30, D2, QHXH30, CORR13, D3, D1, UMAHXH31, D2, QHXH31, CORR14, D3, D1, D4, D2, QHXH32, CORR15, D3, D1, UMAHXH33, D2, QHXH33, CORR16, D3, D1, UMAHXH34, D2, QHXH34, CORR17, D3, D1, UMAHXH35, D2, QHXH35, CORR18, D3, D1, UMAHXH36, D2, QHXH36, CORR19, D3, D1, UMAHXH37, D2, QHXH37, CORR20, D3, D1, UMAHXH38, D2, QHXH38, CORR21, D3, D1, UMAHXH39, D2, QHXH39, CORR22, D3, D1, UMAHXH40, D2, QHXH40, CORR23, D3, D1, UMAHXH41, D2, QHXH41, CORR24, D3, D1, UMAHXH42, D2, QHXH42, CORR25, D3, D1, UMAHXH43, D2, QHXH43, CORR26, D3, D1, UMAHXH44, D2, QHXH44, CORR27, D3, D1, UMAHXH45, D2, QHXH45, CORR28, D3, D1, UMAHXH46, D2, QHXH46, CORR29, D3, D1, UMAHXH47, D2, QHXH47, CORR30, D3, D1, UMAHXH48, D2, QHXH48, CORR31, D3, D1, UMAHXH49, D2, QHXH49, CORR32, D3, D1, UMAHXH50, D2, QHXH50, CORR33, D3};
The lattice parser also works directly with strings if you prefer with .from_contents. Try the following:
Create a lattice from a string¶
In [5]:
Copied!
lat = g4.Lattice.from_contents(
    """
CORR32: corrector = {l=0.001};
CORR33: corrector = {l=0.002};
"""
)
lat = g4.Lattice.from_contents(
    """
CORR32: corrector = {l=0.001};
CORR33: corrector = {l=0.002};
"""
)
In [6]:
Copied!
lat
lat
Out[6]:
Lattice(
  elements={'CORR32': Corrector(L=0.001), 'CORR33': Corrector(L=0.002)},
  filename=pathlib.Path('unknown'),
)
View the lattice in a table format:
In [7]:
Copied!
lat.to_table()
lat.to_table()
Out[7]:
| Attribute | Value | Type | Description | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CORR32 | 
  | ||||||||||||||||||||||||||
| CORR33 | 
  | 
Access elements of a specific type easily¶
In [8]:
Copied!
lat.correctors
lat.correctors
Out[8]:
[Corrector(L=0.001), Corrector(L=0.002)]
Create a Lattice entirely in Python¶
In [9]:
Copied!
lat = g4.Lattice(
    {
        "D1": g4.Drift(L=0.44),
        "D2": g4.Drift(L=0.24),
        "FEL": g4.Line(elements=["FODO"] * 6),
        "FODO": g4.Line(
            elements=["UND", "D1", "QF", "D2", "UND", "D1", "QD", "D2"],
        ),
        "QD": g4.Quadrupole(L=0.08, k1=-2.0),
        "QF": g4.Quadrupole(L=0.08, k1=2.0),
        "UND": g4.Undulator(aw=0.84853, lambdau=0.015, nwig=266, helical=True),
    }
)
lat = g4.Lattice(
    {
        "D1": g4.Drift(L=0.44),
        "D2": g4.Drift(L=0.24),
        "FEL": g4.Line(elements=["FODO"] * 6),
        "FODO": g4.Line(
            elements=["UND", "D1", "QF", "D2", "UND", "D1", "QD", "D2"],
        ),
        "QD": g4.Quadrupole(L=0.08, k1=-2.0),
        "QF": g4.Quadrupole(L=0.08, k1=2.0),
        "UND": g4.Undulator(aw=0.84853, lambdau=0.015, nwig=266, helical=True),
    }
)
In [10]:
Copied!
print(lat.to_genesis())
print(lat.to_genesis())
D1: drift = {l=0.44};
D2: drift = {l=0.24};
FEL: LINE = {FODO, FODO, FODO, FODO, FODO, FODO};
FODO: LINE = {UND, D1, QF, D2, UND, D1, QD, D2};
QD: quadrupole = {l=0.08, k1=-2.0};
QF: quadrupole = {l=0.08, k1=2.0};
UND: undulator = {aw=0.84853, lambdau=0.015, nwig=266, helical=true};
You can also plot the lattice layout prior to running Genesis4:
In [11]:
Copied!
lat.plot("FODO")
lat.plot("FODO")
In [12]:
Copied!
lat.plot("FEL", figsize=(8, 4))
lat.plot("FEL", figsize=(8, 4))
View detailed information about a single lattice element¶
In [13]:
Copied!
lat.undulators[0].to_table()
lat.undulators[0].to_table()
Out[13]:
| Attribute | Value | Type | Description | 
|---|---|---|---|
| label | UND | str | |
| type | undulator | str | |
| aw | 0.84853 | float | The dimensionless rms undulator parameter. For planar undulator this value is smaller by a factor $1 / \sqrt{2}$ than its K-value, while for helical undulator rms and peak values are identical. | 
| lambdau | 0.015 | float | Undulator period length in meter. Default is 0 m. | 
| nwig | 266 | int | Number of periods. | 
| helical | True | bool | Boolean flag whether the undulator is planar or helical. A planar undulator has helical=`false`. Note that setting it to `true`, does not change the roll-off parameters for focusing. To be consistent they have to be set directly. | 
| kx | 0.0 | float | Roll-off parameter of the quadratic term of the undulator field in x. It is normalized with respect to $k_u^2$. | 
| ky | 1.0 | float | Roll-off parameter of the quadratic term of the undulator field in y. | 
| ax | 0.0 | float | Offset of the undulator module in $x$ in meter. | 
| ay | 0.0 | float | Offset of the undulator module in $y$ in meter. | 
| gradx | 0.0 | float | Relative transverse gradient of undulator field in $x$ $\equiv (1/a_w) \partial a_w/\partial x$. | 
| grady | 0.0 | float | Relative transverse gradient of undulator field in $y$ $\equiv (1/a_w) \partial a_w/\partial y$. |