at.latticetools.observables#
Definition of Observable objects used in matching and
response matrices.
Observables are ways to monitor various lattice parameters and use them in matching and correction procedures.
Class hierarchy#
Observable(evalfun, name, target, weight, bounds, …)RingObservable(fun, …)GlobalOpticsObservable()(attrname, plane, name, …)EmittanceObservable(attrname, plane, name, …)ElementObservable(fun, …)OrbitObservable(refpts, axis, name, …)TrajectoryObservable(refpts, axis, name, …)MatrixObservable(refpts, axis, name, …)LocalOpticsObservable(refpts, attrname, axis, name, …)LatticeObservable(refpts, attrname, index, name, …)GeometryObservable(refpts, attrname, name, …)RDTObservable(refpts, RDTname, name, …)
Observables are usually not evaluated directly, but through a
container which performs the required optics computation and feeds each
Observable with its specific data. After evaluation, each
Observable provides the following properties:
weighted_value:value / weightdeviation:value - targetresidual:((value - target)/weight)**2
Functions
|
Observe a global optics parameter. |
Classes
|
Base class for Observables. |
|
Observe any user-defined property of a ring. |
|
Observe emittance-related parameters. |
|
Base class for Observables linked to a position in the lattice. |
|
Observe the closed orbit coordinates at selected locations. |
|
Observe the geometrical parameters of the reference trajectory. |
|
Observe a local optics parameter at selected locations. |
|
Observe an attribute of selected lattice elements. |
|
Observe the closed orbit at selected locations. |
|
Observe trajectory coordinates at selected locations. |
|
Defines the computation requirements for an |
- class ElementObservable(fun, refpts, name=None, statfun=None, postfun=None, **kwargs)[source]#
Bases:
ObservableBase class for Observables linked to a position in the lattice.
- Parameters:
fun (Callable) – evaluation function
refpts (Refpts) – Observation points. See “Selecting elements in a lattice”
name (str) – Observable name. If
None, an explicit name will be generatedpostfun (Callable | str | None) – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
statfun (Callable | str | None) – Statistics post-processing function. it can be a numpy function or a function name in {“mean”, “std”, “var”, “min”, “max”}. Example:
statfun=numpy.mean.
- Keyword Arguments:
target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
Shape of the value
A
nrefsdimension, withnrefsthe number of reference points, is prepended to the shape of the output of fun, even if nrefs == 1. The target, weight and bounds inputs must be broadcastable to the shape of value.
- class EmittanceObservable(param, plane=None, name=None, **kwargs)[source]#
Bases:
ObservableObserve emittance-related parameters.
Process the output of
envelope_parameters().- Parameters:
param (str) – Parameter name (see
envelope_parameters()) or user-defined evaluation functionplane (AxisDef) – One out of {0, ‘x’, ‘h’, ‘H’} for horizontal plane, one out of {1, ‘y’, ‘v’, ‘V’} for vertival plane or one out of {2, ‘z’, ‘l’, ‘L’} for longitudinal plane
name (str) – Observable name. If
None, an explicit name will be generated.
- Keyword Arguments:
postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
statfun – Statistics post-processing function. it can be a numpy function or a function name in {“mean”, “std”, “var”, “min”, “max”}. Example:
statfun=numpy.mean.target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
User-defined evaluation function
It is called as:
value = fun(paramdata)paramdata if the
RingParametersobject returned byenvelope_parameters().value is the value of the Observable.
Example
>>> EmittanceObservable("emittances", plane="h")
Observe the horizontal emittance
- class GeometryObservable(refpts, param, name=None, **kwargs)[source]#
Bases:
ElementObservableObserve the geometrical parameters of the reference trajectory.
Process the geomdata output of
get_geometry().- Parameters:
refpts (Refpts) – Observation points. See “Selecting elements in a lattice”
param (str) – Geometry parameter name: one in {‘x’, ‘y’, ‘angle’}
name (str) – Observable name. If
None, an explicit name will be generated.
- Keyword Arguments:
statfun – Post-processing function called on the value of the observable. Example:
statfun=numpy.meantarget – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
The target, weight and bounds inputs must be broadcastable to the shape of value.
Example
>>> obs = GeometryObservable(at.Monitor, param="x")
Observe x coordinate of monitors
- class LatticeObservable(refpts, attrname, index=None, name=None, **kwargs)[source]#
Bases:
ElementObservableObserve an attribute of selected lattice elements.
- Parameters:
- Keyword Arguments:
postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
statfun – Statistics post-processing function. it can be a numpy function or a function name in {“mean”, “std”, “var”, “min”, “max”}. Example:
statfun=numpy.mean.
Example
>>> obs = LatticeObservable( ... at.Sextupole, "KickAngle", index=0, statfun=np.sum ... )
Observe the sum of horizontal kicks in Sextupoles
- class LocalOpticsObservable(refpts, param, plane=Ellipsis, name=None, all_points=False, **kwargs)[source]#
Bases:
ElementObservableObserve a local optics parameter at selected locations.
Process the local output of
get_optics().- Parameters:
refpts (Refpts) – Observation points. See “Selecting elements in a lattice”
param (str | Callable) – Optics parameter name or user-defined evaluation function
plane (AxisDef) – Index in the parameter array, If
Ellipsis, the whole array is specifiedname (str) – Observable name. If
None, an explicit name will be generatedall_points (bool) – Compute the local optics at all elements. This avoids discontinuities in phase advances. This is automatically set for the ‘mu’ parameter, but may need to be specified for user-defined evaluation functions using the phase advance.
- Keyword Arguments:
summary – Set to
Trueif the user-defined evaluation function returns a single item (see below)postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
statfun – Statistics post-processing function. it can be a numpy function or a function name in {“mean”, “std”, “var”, “min”, “max”}. Example:
statfun=numpy.mean.target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
Shape of the value
If the requested attribute has shape
shp, then value has shape(nrefs,) + shpwithnrefsnumber of reference points: anrefsdimension is prepended to the shape of the attribute, even if nrefs == 1. The target, weight and bounds inputs must be broadcastable to the shape of value. For instance, a target with shapeshpwill automatically broadcast and apply to all reference points.Optics parameter name
In addition to
get_optics()parameter names, LocalOpticsObservable adds 3 parameters: muf, mu2pi and mu2pif:s_pos
longitudinal position [m]
M
(6, 6) transfer matrix M from the beginning of ring to the entrance of the element
closed_orbit
(6,) closed orbit vector
dispersion
(4,) dispersion vector
A
(6, 6) A-matrix
R
(3, 6, 6) R-matrices
beta
\(\left[ \beta_x,\beta_y \right]\) vector
alpha
\(\left[ \alpha_x,\alpha_y \right]\) vector
mu
\(\left[ \mu_x,\mu_y \right]\), betatron phase
mu2pi
\(\left[ \mu_x,\mu_y \right]/2\pi\), reduced betatron phase
muf
\(\left[ \mu_x,\mu_y \right]\), betatron phase (modulo \(2\pi\))
mu2pif
\(\mathrm{frac}(\left[ \mu_x,\mu_y \right]/2\pi)\), fractional part of the reduced betatron phase
W
\(\left[ W_x,W_y \right]\) only if get_w is
True: chromatic amplitude functionWp
\(\left[ Wp_x,Wp_y \right]\) only if get_w is
True: chromatic phase functiondalpha
(2,) alpha derivative vector (\(\Delta \alpha/ \delta_p\))
dbeta
(2,) beta derivative vector (\(\Delta \beta/ \delta_p\))
dmu
(2,) mu derivative vector (\(\Delta \mu/ \delta_p\))
ddispersion
(4,) dispersion derivative vector (\(\Delta D/ \delta_p\))
dR
(3, 6, 6) R derivative vector (\(\Delta R/ \delta_p\))
User-defined evaluation function
The observable value is computed as:
value = fun(elemdata)[plane]elemdata is the output of
get_optics(), evaluated at the refpts of the observable,value is the value of the Observable and must have one line per refpoint. Alternatively, it may be a single line, but then the summary keyword must be set to
True.the plane keyword then selects the desired values in the function output.
Examples
>>> obs = LocalOpticsObservable(at.Monitor, "beta")
Observe the beta in both planes at all
Monitorlocations>>> obs = LocalOpticsObservable( ... at.Quadrupole, "beta", plane="y", statfun=np.max ... )
Observe the maximum vertical beta in Quadrupoles
>>> def phase_advance(elemdata): ... mu = elemdata.mu ... return mu[-1] - mu[0] >>> >>> allobs.append( ... LocalOpticsObservable( ... [33, 101], phase_advance, plane="y", all_points=True, summary=True ... ) ... )
The user-defined evaluation function computes the phase-advance between the 1st and last given reference points, here the elements 33 and 101 of the lattice
- class MatrixObservable(refpts, axis=Ellipsis, name=None, **kwargs)[source]#
Bases:
ElementObservableObserve the closed orbit at selected locations.
Processs the result of calling
find_m44()orfind_m44()depending uponis_6d().- Parameters:
refpts (Refpts) – Observation points. See “Selecting elements in a lattice”
axis (AxisDef) – Index in the transfer matrix, If
Ellipsis, the whole matrix is specifiedname (str) – Observable name. If
None, an explicit name will be generated.
- Keyword Arguments:
postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
statfun – Statistics post-processing function. it can be a numpy function or a function name in {“mean”, “std”, “var”, “min”, “max”}. Example:
statfun=numpy.mean.target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
The target, weight and bounds inputs must be broadcastable to the shape of value.
Example
>>> obs = MatrixObservable(at.Monitor, axis=("x", "px"))
Observe the transfer matrix from origin to monitor locations and extract T[0,1]
- class Need(value)[source]#
Bases:
EnumDefines the computation requirements for an
Observable.- ALL_POINTS = 8#
Associated with LOCALOPTICS, require local optics computation at all points: slower but avoids jumps in phase advance
- CHROMATICITY = 9#
Associated with LOCALOPTICS, require the get_chrom keyword
- EMITTANCE = 7#
Specify
envelope_parameters()computation and provide its params output to the evaluation function
- GEOMETRY = 11#
Specify
get_geometry()computation and provide its output to the evaluation function
- GLOBALOPTICS = 4#
Specify
get_optics()computation and provide its ringdata output to the evaluation function
- LOCALOPTICS = 5#
Specify
get_optics()computation and provide its elemdata output to the evaluation function
- MATRIX = 3#
Specify
find_m44()orfind_m44()computation and provide its m44 or m66 output to the evaluation function
- ORBIT = 2#
Specify
find_orbit()computation and provide its orbit output to the evaluation function
- RDT_2ND_ORDER = 13#
request 2nd order calculation
- Type:
Associated with RDT
- RING = 1#
Provides the ring data to the evaluation function
- TRAJECTORY = 6#
Specify
lattice_pass()computation and provide its r_out to the evaluation function
- W_FUNCTIONS = 10#
Associated with LOCALOPTICS, require the get_w keyword
- class Observable(fun, *args, name=None, target=None, weight=1.0, bounds=(0.0, 0.0), needs=None, postfun=None, **kwargs)[source]#
Bases:
objectBase class for Observables. Can be used for user-defined observables.
- Parameters:
name (str) – Observable name. If
None, an explicit name will be generatedfun (Callable) – evaluation function
*args – Arguments provided to the evaluation function
target (_Buffer | _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | complex | bytes | str | _NestedSequence[complex | bytes | str] | None) – Target value for a constraint. If
None(default), the residual will always be zero.weight (npt.ArrayLike) – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
postfun (Callable | str | None) – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
needs (Set[Need]) – Set of requirements. This selects the data provided to the evaluation function. needs items are members of the
Needenumeration
- Keyword Arguments:
**kwargs – Keyword arguments provided to the evaluation function
The target, weight and bounds inputs must be broadcastable to the shape of value.
User-defined evaluation function
The general form is:
value = fun(*data, *args, **kwargs)data depends on the needs argument, and by default is empty. If several needed values are specified, their order is: ring, orbit, m44/m66, ringdata, elemdata, r_out, params, geomdata,
args are the positional arguments provided to the observable constructor,
kwargs are the keyword arguments provided to the observable constructor,
value is the value of the observable.
For user-defined evaluation functions using linear optics data or emittance data, it is recommended to use
LocalOpticsObservable,GlobalOpticsObservableorEmittanceObservablewhich provide the corresponding data argument.- evaluate(*data, initial=False)[source]#
Compute and store the value of the observable.
The direct evaluation of a single
Observableis normally not used. This method is called by theObservableListcontainer which provides the data arguments.- Parameters:
*data – Raw data, provided by
ObservableListand sent to the evaluation functioninitial (bool) – It
None, store the result as the initial value
- Returns:
value – The value of the observable or the error in evaluation
- property deviation: ndarray[tuple[Any, ...], dtype[float]]#
Deviation from target value, computed as
deviation = value-target.If target is
None, the deviation is zero for any value.
- property residual: ndarray[tuple[Any, ...], dtype[float]]#
residual, computed as
residual = ((value-target)/weight)**2.If target is
None, the residual is zero for any value.
- target: _Buffer | _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | complex | bytes | str | _NestedSequence[complex | bytes | str] | None#
Target value
- class OrbitObservable(refpts, axis=None, name=None, **kwargs)[source]#
Bases:
ElementObservableObserve the closed orbit coordinates at selected locations.
Process the orbit output of
find_orbit().- Parameters:
refpts (Refpts) – Observation points. See “Selecting elements in a lattice”
axis (AxisDef) – Index in the orbit vector, If
None, the whole vector is specifiedname (str) – Observable name. If
None, an explicit name will be generated.
- Keyword Arguments:
postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
statfun – Statistics post-processing function. it can be a numpy function or a function name in {“mean”, “std”, “var”, “min”, “max”}. Example:
statfun=numpy.mean.target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
Shape of the value
If axis is
None(whole orbit vector), then value has shape(nrefs, 6)withnrefsnumber of reference points: anrefsdimension is prepended to the shape of the orbit vector, even if nrefs == 1. A single coordinate has shape(nrefs,). The target, weight and bounds inputs must be broadcastable to the shape of value.Example
>>> obs = OrbitObservable(at.Monitor, axis=0)
Observe the horizontal closed orbit at monitor locations
- class RingObservable(fun, name=None, **kwargs)[source]#
Bases:
ObservableObserve any user-defined property of a ring.
- Parameters:
- Keyword Arguments:
target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
The target, weight and bounds inputs must be broadcastable to the shape of value.
User-defined evaluation function
It is called as:
value = fun(ring)ring is the lattice description,
value is the value of the Observable.
Examples
>>> def circumference(ring): ... return ring.get_s_pos(len(ring))[0] >>> obs = RingObservable(circumference)
Defines an Observable for the ring circumference.
>>> def momentum_compaction(ring): ... return ring.get_mcf() >>> obs = RingObservable(momentum_compaction)
Defines an Observable for the momentum compaction factor.
- class TrajectoryObservable(refpts, axis=Ellipsis, name=None, **kwargs)[source]#
Bases:
ElementObservableObserve trajectory coordinates at selected locations.
Process the r_out output if
Lattice.track()- Parameters:
refpts (Refpts) – Observation points. See “Selecting elements in a lattice”
axis (AxisDef) – Index in the orbit array, If
Ellipsis, the whole array is specifiedname (str) – Observable name. If
None, an explicit name will be generated.
- Keyword Arguments:
postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
statfun – Statistics post-processing function. it can be a numpy function or a function name in {“mean”, “std”, “var”, “min”, “max”}. Example:
statfun=numpy.mean.target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
The target, weight and bounds inputs must be broadcastable to the shape of value.
- GlobalOpticsObservable(param, plane=Ellipsis, name=None, use_integer=False, **kwargs)[source]#
Observe a global optics parameter.
Process the ringdata output of
get_optics().- Parameters:
param (str) – Optics parameter name (see
get_optics()) or user-defined evaluation functionplane (str | int | slice | None | EllipsisType | Tuple[str | int | slice | None | EllipsisType, str | int | slice | None | EllipsisType]) – Index in the parameter array, If
Ellipsis, the whole array is specifiedname (str | None) – Observable name. If
None, an explicit name will be generateduse_integer (bool) – For ‘tune’ parameter: derive the tune from the phase advance to avoid skipping integers. Slower than looking only at the fractional part
- Keyword Arguments:
target – Target value for a constraint. If
None(default), the residual will always be zero.weight – Weight factor: the residual is
((value-target)/weight)**2bounds – Tuple of lower and upper bounds. The parameter is constrained in the interval [target+low_bound target+up_bound]
postfun – Post-processing function. It can be any numpy ufunc or a function name in {“real”, “imag”, “abs”, “angle”, “log”, “exp”, “sqrt”}.
The target, weight and bounds inputs must be broadcastable to the shape of value.
User-defined evaluation function
It is called as:
value = fun(ring, ringdata)ringdata is the output of
get_optics(),value is the value of the Observable.
Examples
>>> obs = GlobalOpticsObservable("tune", use_integer=True)
Observe the tune in both planes, including the integer part (slower)
>>> obs = GlobalOpticsObservable("chromaticity", plane="v")
Observe the vertical chromaticity