Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add particle spin #19

Open
Alfven17 opened this issue Jan 20, 2022 · 3 comments
Open

add particle spin #19

Alfven17 opened this issue Jan 20, 2022 · 3 comments
Assignees

Comments

@Alfven17
Copy link

add particle spin for ParticleGroup

@ChristopherMayes ChristopherMayes self-assigned this Jul 1, 2022
@DavidSagan
Copy link

DavidSagan commented Mar 3, 2024

It is in the standard.

@ColwynGulliford
Copy link
Contributor

Has there been any progress on this? I have two projects that could use spin.

@ColwynGulliford
Copy link
Contributor

@DavidSagan it is in the standard perhaps, but its not in implemented on the Python side, so I would not close this issue.
Screenshot 2024-04-02 at 11 26 07 AM

#-----------------------------------------
# Classes


class ParticleGroup:
    """
    Particle Group class
    
    Initialized on on openPMD beamphysics particle group:

    - **h5**: open h5 handle, or `str` that is a file
    - **data**: raw data
    
    The required bunch data is stored in `.data` with keys

    - `np.array`: `x`, `px`, `y`, `py`, `z`, `pz`, `t`, `status`, `weight`
    - `str`: `species`

    where:
    
    - `x`, `y`, `z` are positions in units of [m]
    - `px`, `py`, `pz` are momenta in units of [eV/c]
    - `t` is time in [s]
    - `weight` is the macro-charge weight in [C], used for all statistical calulations.
    - `species` is a proper species name: `'electron'`, etc. 
        
    Optional data:
    
    - `np.array`: `id`
        
    where `id` is a list of unique integers that identify the particles. 
    
        
    Derived data can be computed as attributes:
    
    - `.gamma`, `.beta`, `.beta_x`, `.beta_y`, `.beta_z`: relativistic factors [1].
    - `.r`, `.theta`: cylidrical coordinates [m], [1]
    - `.pr`, `.ptheta`: momenta in the radial and angular coordinate directions [eV/c]
    - `.Lz`: angular momentum about the z axis [m*eV/c]
    - `.energy` : total energy [eV]
    - `.kinetic_energy`: total energy - mc^2 in [eV]. 
    - `.higher_order_energy`: total energy with quadratic fit in z or t subtracted [eV]
    - `.p`: total momentum in [eV/c]
    - `.mass`: rest mass in [eV]
    - `.xp`, `.yp`: Slopes $x' = dx/dz = dp_x/dp_z$ and $y' = dy/dz = dp_y/dp_z$ [1].
        
    Normalized transvere coordinates can also be calculated as attributes:
    
    - `.x_bar`, `.px_bar`, `.y_bar`, `.py_bar` in [sqrt(m)]
        
    The normalization is automatically calculated from the covariance matrix. 
    See functions in `.statistics` for more advanced usage.
        
    Their cooresponding amplitudes are:
    
    `.Jx`, `.Jy` [m]
    
    where `Jx = (x_bar^2 + px_bar^2 )/2`.
    
    The momenta are normalized by the mass, so that
    `<Jx> = norm_emit_x`
    and similar for `y`. 
        
    Statistics of any of these are calculated with:
    
    - `.min(X)`
    - `.max(X)`
    - `.ptp(X)`
    - `.avg(X)`
    - `.std(X)`
    - `.cov(X, Y, ...)`
    - `.histogramdd(X, Y, ..., bins=10, range=None)`
    
    with a string `X` as the name any of the properties above.
        
    Useful beam physics quantities are given as attributes:
    
    - `.norm_emit_x`
    - `.norm_emit_y`
    - `.norm_emit_4d`
    - `.higher_order_energy_spread`
    - `.average_current`
        
    Twiss parameters, including dispersion, for the $x$ or $y$ plane:
    
    - `.twiss(plane='x', fraction=0.95, p0C=None)`
    
    For convenience, `plane='xy'` will calculate twiss for both planes.
    
    Twiss matched particles, using a simple linear transformation:
    
    - `.twiss_match(self, beta=None, alpha=None, plane='x', p0c=None, inplace=False)`
              
    The weight is required and must sum to > 0. The sum of the weights is in `.charge`.
    This can also be set: `.charge = 1.234` # C, will rescale the .weight array
            
    All attributes can be accessed with brackets:
        `[key]`
    
    Additional keys are allowed for convenience:
        `['min_prop']`   will return  `.min('prop')`
        `['max_prop']`   will return  `.max('prop')`
        `['ptp_prop']`   will return  `.ptp('prop')`
        `['mean_prop']`  will return  `.avg('prop')`
        `['sigma_prop']` will return  `.std('prop')`
        `['cov_prop1__prop2']` will return `.cov('prop1', 'prop2')[0,1]`
        
    Units for all attributes can be accessed by:
    
    - `.units(key)`
    
    Particles are often stored at the same time (i.e. from a t-based code), 
    or with the same z position (i.e. from an s-based code.)
    Routines: 
    
    - `drift_to_z(z0)`
    - `drift_to_t(t0)`
    
    help to convert these. If no argument is given, particles will be drifted to the mean.
    Related properties are:
    
    - `.in_t_coordinates` returns `True` if all particles have the same $t$ corrdinate
    - `.in_z_coordinates` returns `True` if all particles have the same $z$ corrdinate
        
    Convenient plotting is provided with: 
    
    - `.plot(...)`
    - `.slice_plot(...)`
        
    Use `help(ParticleGroup.plot)`, etc. for usage. 
        
    
    """

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants