xboa.Bunch
index
/home/cr67/MAUS/maus_merge/third_party/install/lib/python2.7/site-packages/xboa/Bunch.py

Bunch class is a container class for a set of hits. The main purpose is to store a set of hits that are recorded at an output station in some tracking code. Functions are provided to calculate Twiss parameters, RMS emittances etc for this bunch. List of functions:
Functions that can be used to initialise a Bunch in various different ways:
  new_dict_from_read_builtin
  new_from_hits
  new_from_read_builtin
  new_from_read_user
  new_list_from_read_builtin
  new_hit_shell
  copy
  deepcopy
Functions that transform all data in the bunch in some way:
  abelian_transformation
  period_transformation
  transform_to
  translate
Functions to examine individual hits within the bunch:
  get
  get_hit_variable
  get_hits
  hit_equality
  list_get
  list_get_hit_variable
  append
  hits
  hit_get_variables
  get_variables
  get_amplitude
Functions to calculate beam moments:
  mean
  moment
  covariance_matrix
Functions to access and modify statistical weights:
  bunch_weight
  clear_global_weights
  clear_local_weights
  clear_weights
  cut
  transmission_cut
  conditional_remove
Functions to calculate Twiss parameters, etc, in the bunch:
  get_emittance
  get_beta
  get_alpha
  get_gamma
  get_emittance
  get_canonical_angular_momentum
  get_dispersion
  get_dispersion_prime
  get_dispersion_rsquared
  get_kinetic_angular_momentum
Helper functions to aid Twiss parameter calculation:
  convert_string_to_axis_list
  covariances_set
  means_set
  momentum_variable
  set_geometric_momentum
  set_covariance_matrix
  get_axes
  get_geometric_momentum
  axis_list_to_covariance_list
Output and some input helper functions:
  hit_write_builtin
  hit_write_builtin_from_dict
  hit_write_user
  read_g4mice_file
  setup_file
  get_list_of_maus_dicts
  read_maus_file
Functions to calculate beam ellipses based on Twiss parameters etc:
  build_ellipse_2d
  build_ellipse_from_transfer_matrix
  build_penn_ellipse
Interfaces to root plotting library:
  root_graph
  root_histogram
  root_scatter_graph
Interfaces to matplotlib plotting library:
  matplot_graph
  matplot_histogram
  matplot_scatter_graph
General algorithms to support graphics functions:
  histogram
  histogram_var_bins

 
Modules
       
xboa.core.Bunchcore
xboa.Common
xboa.core.Hitcore
ROOT
StringIO
bisect
copy
gzip
json
numpy.linalg
math
numpy
operator
string
sys

 
Classes
       
Bunch

 
class Bunch
    Represents a bunch of particles. Methods to: 
 
- Read/write from a file
- Calculate arbitrary moments
- Apply cuts
- Calculate emittances, beta functions etc
- Extract hit data as float or arrays of floats
- Plots (with ROOT imported)
 
  Methods defined here:
__copy__(self)
Make a copy but use references to self's data
__deepcopy__(self, target)
Make a copy and copy self's data
__del__(self)
Called by del
__delitem__(self, key)
Called by remove method, deletes the key^th hit in the bunch
__eq__(self, target, float_tolerance=1e-09)
Return true if all hits in self are the same as all hits in target, and set_covariance_matrix data are the same
__getitem__(self, key)
Called by subscript operator, returns the key^th hit in the bunch
__init__(self)
Initialise to an empty bunch. Alternatively use static initialisers defined below - I prefer static initialisers
__len__(self)
Number of hits
__ne__(self, target, float_tolerance=1e-09)
Return true if any hits in self are not the same as the corresponding hit in target
__repr__(self)
Return a long string that contains data in every hit
__setitem__(self, key, value)
Called by subscript operator, sets the key^th hit in the bunch
__str__(self)
Return an abbreviated string like <Bunch of n Hits>
abelian_transformation(self, rotation_list, rotation_matrix, translation_dict={}, origin_dict={}, mass_shell_variable='')
Perform an Abelian Transformation on all variables in the bunch so that V_{out} - O = R*(V_{in}-O)+T
 
- rotation_list = list of Hit.set_variables() strings that defines the vector V
- rotation_matrix = matrix R
- translation_dict = dict of Hit.set_variables() strings to values that defines the vector T
- mass_shell_variable   = set mass shell variable so that E^2=p^2+m^2 after transformation. 
                            Does nothing if equal to ''
- origin_dict = dict of Hit.set_variables() strings to values that defines the vector O. Defaults to
              bunch mean.
 
e.g. bunch.abelian_transformation(['x','px','z'], [[1,0.1,0],[0,1,0],[0,0,1]], {'z':1000}, 'pz') has
     V_{in} = ('x','px','z')
     R = 1   0.1  0
         0   1    0
         0   0    1
     T = (0,0,1000)
     O = bunch mean
(This is like a drift). Note that 'z' has to be explicitly included in the rotation to be present in T
append(self, hit)
Append a hit to Bunch self
bunch_weight(self)
Return statistical weight of all hits in the bunch
clear_local_weights(self)
Set local_weight of all hits in the bunch to 1
clear_weights(self)
Set global_weight and local_weight of all hits in the bunch to 1
conditional_remove(self, variable_value_dict, comparator, value_is_nsigma_bool=False)
For when a cut is not good enough, remove hits from the bunch altogether if comparator(value, get([variable])) is False
 
- variable_value_dict = dict of Bunch.get_variables() to the cut value; cut if the hit variable has value > value
- value_is_nsigma_bool = boolean; if True, value is the number of standard deviations
- global_cut = boolean; if True, apply cut to global weights; else apply to local weights
 
e.g. bunch.cut({'energy':300,}, operator.ge) removes particles if they have 
     ge(hit.get('energy'),300) here operator.ge is a functional representation of the >= operator 
     ge(hit.get('energy'),300) is the same as (hit.get('energy') >= 300)
 
A whole load of useful comparators can be found in the operator module. e.g. ge is >=; le is <=; etc
See also python built-in function "filter".
copy(self)
covariance_matrix(self, get_variable_list, origin_dict={})
Return covariance matrix of variables
 
- variable_list = list of strings to calculate covariance
- origin_dict   = dict of strings to values for origin about which covariances are calculated. Defaults to mean
 
e.g. bunch.covariance_matrix(['x','px'], {'x':0, 'px':0}) returns a matrix like [[Var(x,x), Var(x,px)], [Var(x,px), Var(px,px)]
covariances_set(self)
If internal covariances are set by set_covariance_matrix, return True; else return False
cut(self, variable_value_dict, comparator, value_is_nsigma_bool=False, global_cut=False)
Set weight of hits in the bunch to 0 if comparator(value, get([variable])) is False
 
- variable_value_dict = dict of Bunch.get_variables() to the cut value; cut if the hit variable has value > value
- value_is_nsigma_bool = boolean; if True, value is the number of standard deviations
- global_cut = boolean; if True, apply cut to global weights; else apply to local weights
 
e.g. bunch.cut({'energy':300,}, operator.ge) sets weight of particles to zero if they have 
     ge(hit.get('energy'),300) here operator.ge is a functional representation of the >= operator 
     ge(hit.get('energy'),300) is the same as (hit.get('energy') >= 300)
 
A whole load of useful comparators can be found in the operator module. e.g. ge is >=; le is <=; etc
deepcopy(self)
Make a copy and copy self's data
get(self, variable_string, variable_list)
Return a bunch variable taken from the list Bunch.get_variables()
 
- variable_string = string variable from Bunch.get_variables()
- variable_list   = list of variables (see below, a bit complicated)
 
For 'bunch_weight', axis_list is ignored
 
For 'dispersion', 'dispersion_prime' the first value of variable_list is used. It should be taken from the list Bunch.get_axes()
 
For 'mean', the first value in variable_list is used. It should be taken from the list Bunch.hit_get_variables()
 
For others, variable_list should be a list taken from Bunch.get_axes()
 
E.g. bunch.get('emittance', ['x','y']) would get emittance x y
 
E.g. bunch.get('mean', ['x','px','z']) would return mean of x; px and z are ignored
get_alpha(self, axis_list, geometric=None)
Return the bunch alpha function, defined by
 
- For normalised alpha = Sum_{i} Cov(x_i, p_i)/(emittance*mass*n)
- For geometric alpha = Sum_{i} Cov(x_i, p_i)/(emittance*n)
 
where p_i is a momentum variable from axis_list.
 
- axis_list = list of axes strings
 
and n is the length of axis_list. E.g. 
~~~~~~~~~~~~~~~{.py}
get_alpha(['x','y'])
~~~~~~~~~~~~~~~
will return ( Var(p_x)+Var(p_y) )/(2*emittance(['x','y')*mass)
get_beta(self, axis_list, geometric=None)
Return the bunch beta function, defined by
 
- For normalised beta = Sum_{i} Var(x_i)*p/(emittance*mass*n)
- For geometric beta = Sum_{i} Var(x_i)/(emittance*n)
 
where x_i is a position variable from axis_list.
 
- axis_list = list of axes strings
 
and n is the length of axis_list. E.g.
~~~~~~~~~~~~~~~{.py}
get_beta(['x','y']) 
~~~~~~~~~~~~~~~
will return ( Var(x,x)+Var(y,y) )/(2*pz*emittance(['x','y')*mass)
get_canonical_angular_momentum(self, bz=None, field_axis_dict={'x': 0, 'y': 0}, rotation_axis_dict={'px': 0, 'py': 0, 'x': 0, 'y': 0})
Return the bunch canonical angular momentum about some arbitrary axis, defined by
 
- L = <x py> - <y px> + e Bz (<x^2>+y^2) (momentum variables)
- L = <p>*(<x y'> - <y x'>) + e Bz (<x^2>+y^2) (geometric variables)
    
- bz = nominal on-axis magnetic field - where axis is as; defaults to the field of the 1st particle in the bunch
- field_axis_dict = dict that defines the nominal solenoid axis
- rotation_axis_dict = dict that defines the axis of rotation
get_decoupled_emittance(self, coupled_axis_list, emittance_axis_list, covariance_matrix=None, geometric=None)
Reserved for future development
get_dispersion(self, axis)
Return the bunch dispersion D in axis q, defined by
 
- D = cov(q,E)*mean(E)/var(E)
- axis = string from axis_list that defines the axis q
 
E.g.
~~~~~~~~~~~~~~~{.py}
my_bunch.get_dispersion('y')
~~~~~~~~~~~~~~~
would return the dispersion in the y-direction
get_dispersion_prime(self, axis, geometric=None)
Return the bunch dispersion prime D in axis q, defined by
 
- D' = cov(p_q,E)*mean(E)/var(E)
- axis = string from axis_list that defines the axis q
 
E.g.
~~~~~~~~~~~~~~~{.py}
my_bunch.get_dispersion('y')
~~~~~~~~~~~~~~~
would return the dispersion in the y-direction
get_dispersion_rsquared(self)
Return a special bunch dispersion defined by
 
- D = (<r2,E>-<r2>*<E>)*mean(E)/var(E)
 
where <> are raw moments (not central moments)
get_emittance(self, axis_list, covariance_matrix=None, geometric=None)
Return the n dimensional normalised emittance of the bunch
 
- emittance = (|V|**(1/2n))/mass
 
where n is the number of elements in axis list and V is a covariance matrix
with elements V_{ij} = cov(u_i, u_j) where u is a vector of elements in the
axis_list and their momentum conjugates, u = (q_i, p_i)
 
- axis_list = list of axes from Bunch.get_axes().
- covariance_matrix = if specified, use this covariance matrix rather than 
                        calculating a new one each time.
- geometric = if specified, use geometric variables (dx/dz, dy/dz, etc) rather
                than normalised variables (px, py, pz).
 
E.g.
~~~~~~~~~~~~~~~{.py}
get_emittance(['x'])
~~~~~~~~~~~~~~~
will return
  |V|**(1/2)
where V is the matrix with elements
  V = Var(x,x)  Cov(x,px)
      Cov(x,px) Var(px,px)
and |V| is the determinant.
get_gamma(self, axis_list, geometric=None)
Return the bunch beta function, defined by
 
- For normalised gamma = Sum_{i} Var(p_i)/(pz*emittance*mass*n)
- For geometric gamma = Sum_{i} Var(p_i)/(emittance*n)
 
where p_i is a momentum variable from axis_list.
 
- axis_list = list of axes strings
 
and n is the length of axis_list. E.g.
~~~~~~~~~~~~~~~{.py}
get_gamma(['x','y'])
~~~~~~~~~~~~~~~
will return ( Var(p_x)+Var(p_y) )/(2*pz*emittance(['x','y')*mass)
get_hit_variable(self, hit, variable_name, covariance_matrix=None, mean_dict={})
Return axis variable for hit. Special power is that it can calculate amplitude, unlike hit.get(blah)
 
- hit = a Hit object
- variable_name = either a variable from Hit.get_variables() or an amplitude variable.
    amplitude variables should be formatted like 'amplitude x y' or 'amplitude x y t'
- covariance_matrix = use a pre-calculated covariance matrix, or calculate if set to None
get_hits(self, variable, value, comparator=<built-in function eq>)
Returns a list of all hits in the bunch with comparator(variable, value) == True
By default comparator is equality operator, so returns a list of all hits in the bunch with variable == value
 
- variable   = string from Hit.get_variables()
- value      = value for comparison
- comparator = function that operates on a hit and returns a boolean
 
e.g. get_hits('eventNumber', 50) returns a list of all hits in the bunch with hitNumber 50
e.g. get_hits('eventNumber', 50, operator.lt) returns a list of all hits in the bunch with hitNumber less than 50
get_kinetic_angular_momentum(self, rotation_axis_dict={'px': 0, 'py': 0, 'x': 0, "x'": 0, 'y': 0, "y'": 0})
Return the bunch kinetic angular momentum about some arbitrary axis, defined by
 
- L = <x py> - <y px> (momentum variables)
- L = <p>*(<x y'> - <y x'>) (geometric variables)
    
- rotation_axis_dict = dict that defines the axis of rotation
histogram(self, x_axis_string, x_axis_units='', y_axis_string='', y_axis_units='', nx_bins=None, ny_bins=None, xmin=None, xmax=None, ymin=None, ymax=None)
Returns a binned 1D or 2D histogram of hits in the bunch (but doesnt draw anything or call any plotting package).
 
- x_axis_string = string for call to get_hit_variables()
- x_axis_units  = units for x axis
- y_axis_string = string for call to get_hit_variables(). If string is empty, makes a 1D histogram
- y_axis_units  = units for y axis
- nx_bins       = force histogram to use this number of bins for the x-axis rather than choosing number of bins itself
- ny_bins       = force histogram to use this number of bins for the y-axis rather than choosing number of bins itself
- xmin          = float that overrides auto-detection of minimum x-axis value
- xmax          = float that overrides auto-detection of maximum x-axis value
- ymin          = float that overrides auto-detection of minimum y-axis value
- ymax          = float that overrides auto-detection of maximum y-axis value
 
Return value is a list of bin weights for a 1D histogram or a list of lists of bin weights for a 2D histogram
histogram_var_bins(self, x_axis_string, x_bins, x_axis_units='', y_axis_string='', y_bins=None, y_axis_units='')
Returns a binned histogram of hits in the bunch.
 
Requires numpy
 
- x_axis_string = string for call to get_hit_variables()
- x_bins        = list of bin edges used to generate the histogram
- x_axis_units  = units for x axis
- y_axis_string = string for call to get_hit_variables()
- y_bins        = list of bin edges used to generate the histogram
- y_axis_units  = units for y axis
 
Return value is a tuple containing ((bin weights array),x_bins,y_bins). The bin weights array is always nx*ny, with ny defaulting to 1 in the case of a 1d histogram.
hit_equality(self, target, float_tolerance=1e-09)
Return True if all hits in self are the same as all hits in target
 
- target = bunch to test against
hit_write_builtin(self, file_type_string, file_name, user_comment=None)
Write the hits in the bunch using some built-in format to the file file_name
 
- file_type_string = string that controls which predefined file type will be used
- file_name = string that defines the file name
- user_comment = comment to be included in file header (e.g. problem title)
 
e.g. my_bunches.hit_write_builtin('g4mice_special_hit', 'Sim.out.gz') would write all hits
from my_bunches formatted in the old G4MICE Special Virtual style in file Sim.out.gz
hit_write_user(self, format_list, format_units_dict, file_handle, separator=' ', comparator=None)
Write the hits in the bunch in some user defined format to file_handle, in an order defined by comparator
 
- format_list = ordered list of strings from get_variables()
- format_units_dict = dict of formats from format_list to units
- file_handle = file handle made using e.g. open() command to which hits are written
- separator = separator that is used to separate hits
- comparator = comparator that is used for sorting prior to writing the file; if left as None, no sorting is performed
 
e.g. aBunch.hit_write_user(['x','px','y','py'], ['x':'m','y':'m','px':'MeV/c','py':'MeV/c'], some_file, '@') would make output like
0.001@0.002@0.001@0.002 
0.003@0.004@0.003@0.004 
in some_file
hits(self)
Returns the list of all hits in the bunch
list_get_hit_variable(self, list_of_variables, list_of_units=[], covariance_matrix=None, mean_dict={})
Return a list of get_hit_variable results, one element for each hit in the bunch
 
- variable_name = either a variable from Hit.get_variables() or an amplitude variable.
    amplitude variables should be formatted like 'amplitude x y' or 'amplitude x y t'
    i.e. amplitude followed by a list of axes separated by white space
- covariance_matrix = use a pre-calculated covariance matrix, or calculate if set to None
matplot_histogram(self, x_axis_string, x_axis_units='', y_axis_string='', y_axis_units='', canvas=None, comparator=None)
Prints a 1D or 2D histogram of hits in the bunch. Axes are automatically detected
to encapsulate all data. Use Bunch.cut(...) to shrink the axes.
 
Needs correct matplot installation.
 
- x_axis_string = string for call to get_hit_variables()
- x_axis_units  = units for x axis
- y_axis_string = string for call to get_hit_variables(). If string is empty, makes a 1D histogram
- y_axis_units  = units for y axis
- comparator    = comparator of bunch1, bunch2 - if none given, will sort by x-axis value
 
e.g. bunch.matplot_histogram('x', 'cm', 'py', 'GeV/c') will histogram x vs py. 
 
To display plots, call Common.wait_for_matplot() - script waits until all matplot windows are closed
matplot_scatter_graph(self, x_axis_string, y_axis_string, x_axis_units='', y_axis_units='', include_weightless=True)
Prints a 2d scatter plot of Hit.get(...) data over a dict of bunches.
 
Needs correct matplot installation.
 
- x_axis_string = string for call to Bunch.get_hit_variable() used to calculate x-values
- x_axis_units  = units for x axis
- y_axis_string = string for call to Bunch.get_hit_variable() used to calculate y-values
- y_axis_units  = units for y axis
- include_weightless = set to True to plot hits with <= 0. weight
 
e.g. bunch.matplot_scatter_graph('x', 'cm', 'p', 'MeV/c') will graph x vs p. 
 
To display plots, call Common.wait_for_matplot() - script waits until all matplot windows are closed
mean(self, variable_list)
Return dict of variables to means
 
- variable_list = list of strings to calculate means
 
e.g. bunch.mean(['x','px']) returns a dict like {'x':x_mean, 'px':px_mean}
means_set(self)
If means are set by set_covariance_matrix, return True; else return False
moment(self, variable_list, variable_mean_dict={})
Return a moment, sum( (u1 - u1_mean)*(u2-u2_mean)*(etc)) where u is a set of Hit get_variables indexed by variable_list
 
- variable_list = list of strings that index the moment
- variable_mean_dict = dict of variable to means for moment calculation. Assume bunch mean if no value is specified
 
e.g. bunch.moment(['x','x'], {'x':0.1}) returns the variance of x about a mean of 0.1
 
e.g. bunch.moment(['x','px']) returns the covariance of x,px about the bunch mean
period_transformation(self, offset, frequency, variable='t')
Transform all hit's variable from a linear space to a periodic space with some frequency and offset
 
- offset    = float that defines the offset
- frequency = float that defines the frequency of the periodic space
- variable  = string from hit_set_variables. variable for which the periodicity is applied
 
e.g. bunch.period_transformation( dt, rf_freq) would transform all times into a range between
  (-0.5/rf_freq, 0.5/rf_freq). Hits with 't' = n*dt would transform to t=0 (n arbitrary integer)
Used to transform a set of many rf buckets into one rf bucket, for calculating longitudinal emittance etc
root_histogram(self, x_axis_string, x_axis_units='', y_axis_string='', y_axis_units='', nx_bins=None, ny_bins=None, canvas=None, xmin=None, xmax=None, ymin=None, ymax=None, line_color=1, line_style=1, line_width=2, fill_color=0, stats=False, hist_title_string='', draw_option='')
Prints a 1D or 2D histogram of hits in the bunch. Axes are automatically detected
to encapsulate all data.
 
Needs correct root installation.
 
- x_axis_string = string for call to get_hit_variables()
- x_axis_units  = units for x axis
- y_axis_string = string for call to get_hit_variables(). If string is empty, makes a 1D histogram
- y_axis_units  = units for y axis
- nx_bins       = force root_histogram to use this number of bins for the x-axis rather than choosing number of bins itself
- ny_bins       = force root_histogram to use this number of bins for the y-axis rather than choosing number of bins itself
- canvas        = if canvas=None, root_histogram will create a new tcanvas and plot histograms on that
             else will plot on the existing canvas, attempting to plot on existing axes
- xmin          = float that overrides auto-detection of minimum x-axis value
- xmax          = float that overrides auto-detection of maximum x-axis value
- ymin          = float that overrides auto-detection of minimum y-axis value
- ymax          = float that overrides auto-detection of maximum y-axis value
- line_color    = int that sets the line colour of the histogram
- line_style    = int that sets the line style of the histogram
- line_width    = int that sets the line width of the histogram
- fill_color    = int that sets the fill color of the histogram
- stats         = set to True to plot a stats box on the histogram
- hist_title_string = specify the string that will appear as a title on the canvas
 
e.g. bunch.root_histogram('x', 'cm', 'py', 'GeV/c') will histogram x vs py. 
Returns a tuple of the (canvas, histogram)
root_scatter_graph(self, x_axis_string, y_axis_string, x_axis_units='', y_axis_units='', include_weightless=True, canvas=None, xmin=None, xmax=None, ymin=None, ymax=None, line_color=1, line_style=1, line_width=2, fill_color=10, hist_title_string='')
Prints a 2d scatter plot of Hit.get(...) data over a dict of bunches.
 
Needs correct root installation.
 
- x_axis_string = string for call to Bunch.get_hit_variable() used to calculate x-values
- x_axis_units  = units for x axis
- y_axis_string = string for call to Bunch.get_hit_variable() used to calculate y-values
- y_axis_units  = units for y axis
- include_weightless = set to True to plot hits with <= 0. weight
- canvas = if canvas=None, root_graph will create a new tcanvas and plot graphs on that
             else will plot on the existing canvas, attempting to plot on existing axes
- xmin          = float that overrides auto-detection of minimum x-axis value
- xmax          = float that overrides auto-detection of maximum x-axis value
- ymin          = float that overrides auto-detection of minimum y-axis value
- ymax          = float that overrides auto-detection of maximum y-axis value
- line_color = int that sets the line colour of the histogram
- line_style = int that sets the line style of the histogram
- line_width = int that sets the line width of the histogram
- fill_color = int that sets the fill color of the histogram
- hist_title_string = specify the string that will appear as a title on the canvas
 
e.g. bunch.root_scatter_graph('x', 'p', 'cm', 'MeV/c') will graph x vs p. 
Returns a tuple of (canvas, histogram, graph) where the histogram contains the axes
set_covariance_matrix(self, use_internal_covariance_matrix=True, covariance_matrix=None, mean_dict={})
Choose whether to use an internal covariance matrix for calculations
 
- use_internal_covariance_matrix = boolean. If set to True, x-boa will recalculate its internal covariance matrix and use this 
                                 for some calculations. If set to False, x-boa will calculate the covariance matrix each time. 
- covariance_matrix              = NumPy matrix. x-boa will use this matrix as the internal covariance matrix; should be a 10x10 matrix ordered like
                                 (x, px, y, py, z, pz, t, enegry, ct, energy). Ignored if equal to None
- mean_dict                      = dict of variables to means. x-boa will use this dict to index means; should contain means of
                                 (x, px, y, py, z, pz, t, enegry, ct, energy). Ignored if equal to None
 
As a speed optimisation, x-boa can calculate a covariance matrix and use this for all calculations involving covariances, i.e. Twiss parameters, emittances, amplitudes etc. Otherwise x-boa will re-calculate this each time, which can be slow. Be careful though - x-boa does not automatically detect for hits being added or removed from the bunch, etc. The user must call this function each time the bunch changes (events added, weightings changed, etc) to update the internal covariance matrix
standard_deviation(self, variable, variable_mean={})
Return a standard deviation, given by sum( (u-u_mean)**2 )**0.5 where u is the variable specified
 
- variable = a variable from Hit.get_variables(). Can be a list, in which
               case only the first hit is taken
- variable_mean = use this as u_mean rather than calculating a priori. Can
                be a dict, in which case if variable is in the keys will
                use that value.
 
e.g. bunch.standard_deviation('x') returns the standard deviation of x
 
e.g. bunch.standard_deviation('x', 1.) returns the standard deviation of x
     about a mean of 1.
 
e.g. bunch.standard_deviation(['x'], {'x':1.}) returns the standard
     deviation of x about a mean of 1.
transform_to(self, transform_list, target_covariances, translation_dict={}, origin_dict={}, mass_shell_variable='')
Perform a linear transformation on all particles in the bunch to get a bunch with covariance matrix 
similar to target_covariances. The transformation always has determinant 1, and so is emittance conserving.
Then performs a translation using translation_dict
 
- transform_list = list of Hit.set_variables() strings that defines the vector V
- target_covariances = target covariance matrix. Must be n*n dimensions where n is the length of transform_list
- translation_dict = dict of Hit.set_variables() strings to values that defines a translation
- origin_dict = dict of Hit.set_variables() strings to values that defines the vector O. Defaults to
                  bunch mean.
- mass_shell_variable   = set mass shell variable so that E^2=p^2+m^2 after transformation. 
                        Does nothing if equal to ''
 
e.g. bunch.transform_to(['x','px'], [[1,0],[0,1]], {'pz':10}, 'energy') will apply a transformation to all hits in the 
bunch that diagonalises the bunch and makes Var(x,x) equal to Var(px,px), but conserving emittance; then will add 
10 to pz for all tracks; then adjust energy to keep mass shell condition.
translate(self, dict_variables_values, mass_shell_variable='')
Translate all events in the bunch by dict_variables_values
 
- dict_variables_values = dict of variable names from Hit.set_variables() to variable values
- mass_shell_variable   = set mass shell variable so that E^2=p^2+m^2 after translation. 
                            Does nothing if equal to ''
 
e.g. bunch.translate({'pz':-10,'z':100}, 'energy') reduces particle pz by 10 MeV/c and increases 
  E by 100 mm then sets E so that mass shell condition is still obeyed
transmission_cut(self, test_bunch, global_cut=False, test_variable=['spill', 'event_number', 'particle_number'], float_tolerance=1e-09)
Set weight of hits in the bunch to 0 if no events can be found in test_bunch with the
same test_variable
 
- test_bunch = bunch to test against
- global_cut = if True, apply cut to global weights
- test_variable = cut a hit in self if no hits are found in test_bunch with
                  the same test_variable. If test_variable is a list, then
                  cut from self if no hits are found in test_bunch with all
                  test_variables the same.
 
E.g. bunch.transmission_cut( some_other_bunch, True ) will apply a global 
     cut if a hit with the same [spill, event_number, particle_number] is
     not in some_other_bunch (for all hits)
value = __mean_for_get(self, variable_list)

Static methods defined here:
axis_list_to_covariance_list(axis_list, geometric=None)
Convert from a list of position variables to a list of position
and conjugate momentum variables
 
- axis_list = list of strings from get_axes()
build_ET_ellipse()
Not implemented
build_MR_ellipse()
Not implemented
build_ellipse_2d(beta, alpha, emittance, p, mass, geometric)
Build a 2x2 ellipse matrix, given by
For geometric = true
 
- var(x, x)  = beta*emittance
- var(x, x') = alpha*emittance
- var(x',x') = gamma*emittance
 
For geometric = false
 
- var(x, x ) = beta*emittance*mass/p
- var(x, px) = alpha*emittance*mass
- var(px,px) = gamma*emittance*mass*p
build_ellipse_from_transfer_matrix(M)
Not implemented
build_penn_ellipse(emittance_t, mass, beta_t, alpha_t, p, Ltwiddle_t, bz, q)
Build an ellipse using Penn formalism for solenoids. 
 
- emittance_t = nominal beam emittance
- mass        = particle mass
- beta_t      = transverse beta function
- alpha_t     = transverse alpha function
- p           = reference momentum
- Ltwiddle_t  = normalised canonical angular momentum
- bz          = magnetic field strength
- q           = particle charge
 
Output ellipse is a 4*4 matrix with elements v_ij where i,j indexes the vector (x,px,y,py)
bunch_overview_doc(verbose=False)
Creates some summary documentation for the Bunch class. If verbose is True then will also print any functions or data not included in summary
clear_global_weights()
Set global_weight of all hits in the bunch to 1
convert_string_to_axis_list(axis_string)
Return a list of axes from a string.
 
- axis_string = string that contains a list of axis. Either format
    as axis_strings separated by white space or as a python list
    of axis_strings
get_amplitude(bunch, hit, axis_list, covariance_matrix=None, mean_dict={}, geometric=None)
Return the particle amplitude for a hit relative to a bunch, defined by
 
- amplitude = emittance*x^T.V^-1.x
 
where x is a vector of particle coordinates and V is a covariance matrix
 
- bunch = bunch from which the covariance matrix is calculated
- hit   = hit from which the particle vector is taken
- axis_list = list of axes that defines the covariance matrix and particle vector
- covariance_matrix = if this is not set to None, will use this covariance_matrix 
      for the calculation rather than taking one from bunch. Should be a numpy matrix
      like "x","px","y","py"
E.g. 
~~~~~~~{.py}
Bunch.get_amplitude(my_bunch, my_hit, ['x','y'])
~~~~~~~
will return
    emittance*(x,px,y,py)^T*V^{-1}(x,px,y,py)*(x,px,y,py)
get_axes()
Return list of axis variables (position-type variables)
get_geometric_momentum()
Set the default for conjugate momenta; either geometric (x', y', etc) or kinetic (px, py, etc)
 
- new_value_bool = if True, use geometric momenta. If False, use kinetic momenta (default)
get_list_of_maus_dicts(maus_type, spill)
Get a list of maus_dicts from a maus_spill for a particular maus_type
 
- maus_type = type to extract from the spill
- spill = dict containing a single maus spill
 
Returns dict formatted according to maus but for one hit
get_variables()
Return a list of variables suitable for calls to Bunch.get
hit_get_variables()
Return a list of variables suitable for calls to Bunch.get
hit_write_builtin_from_dict(dict_of_bunches, file_type_string, file_name, user_comment=None)
Write the hits in the dict of bunches using some built-in format to the file file_name
 
- dict_of_bunches = list of hits
- file_type_string = string that controls which predefined file type will be used
- file_name = string that defines the file name
- user_comment = comment to be included in file header (e.g. problem title)
 
e.g. Bunch.hit_write_builtin_from_dict(my_bunches, 'g4mice_special_hit', 'Sim.out.gz') would write all hits
from my_bunches formatted in the G4MICE Special Virtual style in file Sim.out.gz
list_get(dict_of_bunches, list_of_variables, list_of_axis_lists)
Get a list of lists of variables from each bunch in the dict_of_bunches
 
- dict_of_bunches   = dict of bunches from which the lists will be taken
- list_of_variables = list of variables that will be used in the calculation
- list_of_axis_lists = axis_list that will be used in the calculation of the 
    corresponding variable
 
E.g. list_get(my_dict_of_bunches, ['mean', 'emittance'], [['z'],['x','y']])
  would calculate a list of two arrays: (i) mean z; (ii) emittance x y
 
Output is sorted by the first variable in the list. This might be useful to interface
with E.g. a plotting package
matplot_graph(bunches, x_axis_string, x_axis_list, y_axis_string, y_axis_list, x_axis_units='', y_axis_units='', comparator=None)
Prints a graph of Bunch.get(...) data over a dict of bunches.
 
Needs correct matplot installation.
 
- x_axis_string = string for call to Bunch.get() used to calculate x axis variables
- x_axis_list   = list of variables for call to Bunch.get() used to calculate x axis variables
- y_axis_string = string for call to Bunch.get() used to calculate y axis variables
- y_axis_list   = list of variables for call to Bunch.get() used to calculate y axis variables
- x_axis_units  = units for x axis
- y_axis_units  = units for y axis
- comparator    = comparator of bunch1, bunch2 - if none given, will sort by x-axis value
 
e.g. bunch.matplot_graph('mean', ['x'], 'cm', 'emittance', ['x','y'], 'mm') will graph mean x vs emittance x y. 
 
To display plots, call Common.wait_for_matplot() - script waits until all matplot windows are closed
momentum_variable(axis_variable, geometric_momentum)
Return the momentum conjugate for axis_variable
new_dict_from_read_builtin(file_type_string, file_name, indexing_variable='station')
Create a dict of all bunches in a file using a built-in format
 
- file_type_string  = string from Hit.file_types() that defines the formatting of the file
- file_name         = name of the file that contains hit data
- indexing_variable = variable that will be used to define a bunch
 
e.g. bunch_dict = new_dict_from_read_builtin('icool_for003', 'for003.dat', 'pid') will return a new dict of bunches
loaded from for003.dat in icool_for003 format, where each entry in the dict will be a reference from a pid value to a bunch
 
e.g. bunch_dict = new_dict_from_read_builtin('icool_for009', 'for009.dat', 'station') will return a new dict of bunches
loaded from for009.dat in icool_for009 format, where each entry in the dict will be a reference from a station value to a bunch
new_from_hits(hits_list, covs=None, means={}, weights=[])
Initialise from a list of hits, making a deepcopy of the hits (so allocating new memory for each hit)
 
- hits_list = list of Hit objects
 
e.g. myBunch = new_from_hits([hit1, hit2, hit3]) will return a new bunch containing hit1, hit2, hit3
new_from_read_builtin(file_type_string, file_name, test_function=None, number_of_hits=-1)
Initialise a bunch from a file using a built in format
 
- file_type_string = string from Hit.file_types() that defines the file format
- file_name        = string that defines the file_name to be used
- test_function    = Hits with test_function(hit) == False will be ignored, unless test_function==None
- number_of_hits   = only loads the first number_of_hits Hits
 
e.g. myBunch = Bunch.new_from_read_builtin('icool_for009', for009.dat, lambda hit: hit['station'] == 1, 1000)
will return a bunch containing first 1000 hits from for009.dat with stationNumber=1
new_from_read_user(format_list, format_units_dict, filehandle, number_of_skip_lines, test_function=None, number_of_hits=-1)
Initialise a bunch from a file using a user defined format
 
- format_list       = ordered list of variables from get_variables() that contains the particle variables on each line of your input file
- format_units_dict = dict of variables:units that are used to transform to internal system of units
- filehandle        = file handle, created using e.g. filehandle = open('for009.dat')
- number_of_skip_lines = integer; skip this many lines at the start of the file
- test_function    = Hits with test_function(hit) == False will be ignored, unless test_function==None
- number_of_hits   = only loads the first number_of_hits Hits. Will read to end of file if this is negative
 
e.g. myBunch = Bunch.new_from_read_user(['x','y','z','px','py','pz'], {'x':'mm', 'y':'mm', 'z':'mm', 'px':'MeV/c', 'py':'MeV/c', 'pz':'MeV/c'}, my_input_file, 3)
will skip the first 3 lines of the file and then read in all events from my_input_file, assuming the formatting listed
new_hit_shell(n_per_dimension, ellipse, set_variable_list, mass_shell_variable, defaults={})
Create a set of particles that sit on the shell of an ellipse in some arbitrary dimensional space
 
- n_per_dimension   = number of particles in each dimension. Total number of particles is n_per_dimension^dimension
- ellipse           = numpy.matrix that defines the ellipse of particles
- set_variable_list = list of set variables that defines what each dimension in the ellipse corresponds to
- mass_shell_variable = variable that will be used to set the mass shell condition for each hit
- defaults            = dict of default set variables that each hit will get.
 
e.g. new_bunch_as_hit_shell(2, numpy.matrix([[1,0],[0,1]]),['x','y'],'energy',{'pid':-13,'mass':Common.pdg_pid_to_mass[13],'pz':200.})
will make a set of muons on a circle in x-y space with 200. MeV/c momentum. Event number is automatically allocated 
incrementing from 0.
new_list_from_read_builtin(file_type_string, file_name, sort_variable='station')
Create a sorted list of all bunches in a file using a built-in format
 
- file_type_string  = string from Hit.file_types() that defines the formatting of the file
- file_name         = name of the file that contains hit data
- sort_variable     = variable that will be used to define a bunch and used for sort order
 
e.g. bunch_list = new_list_from_read_builtin('icool_for003', 'for003.dat', 'pid') will return a new list of bunches
loaded from for003.dat in icool_for003 format, where each entry in the list will contain only one pid value with first entry
having lowest pid
 
e.g. bunch_list = new_list_from_read_builtin('icool_for009', 'for009.dat', 'station') will return a new list of bunches
loaded from for009.dat in icool_for009 format, where each entry in the list will contain only one station value with first entry
having lowest station
read_g4mice_file(file_name, number_of_hits=-1, list_of_classes=['SpecialHits', 'VirtualHits'])
Initialise a bunch from a g4mice file.
 
- file_name        = string that defines the file_name to be used
- number_of_hits   = only loads the first number_of_hits Hits
- list_of_classes  = ignores g4mice classes that are not in list_of_classes
read_maus_file(file_name, number_of_hits=-1, list_of_maus_types=['maus_virtual_hit', 'maus_primary'])
Initialise a bunch from a MAUS file.
 
- file_name      = string that defines the file_name to be used
- number_of_hits = only loads the first number_of_hits Hits
- list_of_converters = list of converter functions that will be executed on
                       the maus file (one for each hit type)
read_maus_root_file(file_name, number_of_hits=-1, list_of_maus_types=['maus_root_virtual_hit', 'maus_root_primary'])
Read hits from a maus ROOT file
 
- file_name = name of the file to read
- number_of_hits = Not used
- list_of_maus_types = only make hits from these types
 
Returns a list of hits
root_graph(bunches, x_axis_string, x_axis_list, y_axis_string, y_axis_list, x_axis_units='', y_axis_units='', canvas='', comparator=None, xmin=None, xmax=None, ymin=None, ymax=None, line_color=1, line_style=1, line_width=2, fill_color=10, hist_title_string='')
Prints a graph of Bunch.get(...) data over a set of bunches and returns the root canvas.
 
Needs correct root installation.
 
- bunches       = either a dict or a list of bunches
- x_axis_string = string for call to Bunch.get() used to calculate x axis variables
- x_axis_list   = list of variables for call to Bunch.get() used to calculate x axis variables
- x_axis_units  = units for x axis
- y_axis_string = string for call to Bunch.get() used to calculate y axis variables
- y_axis_list   = list of variables for call to Bunch.get() used to calculate y axis variables
- y_axis_units  = units for y axis
- canvas        = if canvas=None, root_graph will create a new tcanvas and plot graphs on that
                    else will plot on the existing canvas, attempting to plot on existing axes
- comparator    = comparator of bunch1, bunch2 - if none given, will sort by x-axis value
- xmin          = float that overrides auto-detection of minimum x-axis value
- xmax          = float that overrides auto-detection of maximum x-axis value
- ymin          = float that overrides auto-detection of minimum y-axis value
- ymax          = float that overrides auto-detection of maximum y-axis value
- line_color    = int that sets the line colour of the histogram
- line_style    = int that sets the line style of the histogram
- line_width    = int that sets the line width of the histogram
- fill_color    = int that sets the fill color of the histogram
- hist_title_string = specify the string that will appear as a title on the canvas
 
e.g. root_graph(bunch_dict, 'mean', ['x'], 'emittance', ['x','y'], 'cm', 'mm') will graph mean x vs emittance x y. 
Returns a tuple of (canvas, histogram, graph) where the histogram contains the axes
set_geometric_momentum(new_value_bool)
Set the default for conjugate momenta; either geometric (x', y', etc) or kinetic (px, py, etc)
 
- new_value_bool = if True, use geometric momenta. If False, use kinetic momenta (default)
setup_file(file_format_type_string, file_name)
Returns a file handle with special phrases and characters stripped. Returned file_handle contains only hit data

Data and other attributes defined here:
key = 'mean'