class serpentTools.xs.BranchCollector(source)

Main class that collects and arranges branched data

New in version 0.7.0.


source (str or BranchingReader) – Coefficient file to be read, or a BranchingReader that has read the file of interest


Location of the read file




Ordered tuple of universe as they appear in the first dimension of all arrays in xsTables




Dictionary of universe-specific cross sections. Each entry is a BranchedUniv object that stores cross sections for a single universe.




Dictionary of {k: x} pairs where k corresponds to all cross sections processed and x are large multidimensional cross sections. The structure is described with axis



property axis

Tuple describing axis of underlying data

Each index contains a description of the changes in group constant data along that axis. Can be set to any iterable, but is converted to a tuple to prevent in-place changes, such as appending to a list or removing one item. Passing an ordered object, list, tuple, or numpy.array is preferred, as the conversion to tuple can sort values in un-ordered objects like set or dict strangely.


>>> col.axis
("Universe", "BOR", "TFU", "Burnup", "Group")
>>> infTot = col.xsTables['infTot']
>>> infTot.shape
(5, 3, 3, 3, 2)
# five universes, three BOR perturbations
# three TFU perturbations, three burnups,
# two energy groups
>>> col.axis = ['u', 'b', 't', 'bu', 'g']
>>> col.axis
('u', 'b', 't', 'bu', 'g')
# pass an unordered set
>>> col.axis = {'u', 'b', 't', 'bu', 'g'}
>>> col.axis
('bu', 'u', 't', 'g', 'b')
# incorrectly set axis
>>> col.axis = [1, 2, 3, 4]
ValueError("Current axis has 5 dimensions, not 4")
property burnups

Vector of burnups from coefficient file

Can be set to any iterable that has same number of entries as existing burnup. Automatically converts to numpy.array


>>> col.burnups
array([0., 1., 10.])
>>> col.burnups = array([0., 5.6, 56.])
>>> col.burnups
array([0., 5.6, 56.])
>>> col.burnups = [0, 1, 10]
# converted to array of integers
>>> col.burnups
array([0, 1, 10])
>>> col.burnups = [0, 1, 2, 3]  # not allowed
ValueError("Current burnup vector has 3 items, not 3")

Parse the contents of the file and collect cross sections


perturbations (tuple or None) – Tuple where each entry is a state that is perturbed across the analysis, e.g. ("Tfuel", "RhoCool", "CR"). These must appear in the same order as they are ordered in the coefficient file. If None, then the number of perturbations will be determined from the coefficient file. This is used to set pertubations and can be adjusted later

classmethod fromFile(filePath, perturbations=None)

Create a BranchCollector from the contents of the file

  • filePath (str) – Location of coefficient file to be read

  • perturbations (None or iterable) – Ordering of perturbation types in coefficient file. If None, the number of perturbations will be inferred from file. Otherwise, the number of perturbations must match those in the file. This value can be changed after the fact using perturbations, with insight gained from states


property perturbations

Iterable indicating the specific perturbation types

Can be set to any iterable, so long as the number of perturbations is preserved. Ordering is important, as changing this does not change the structure of any group constants stored


>>> print(col.perturbations)
('BOR', 'TFU')
>>> col.perturbations = ['B', 'T']  # allowed
>>> col.perturbations = [
>>>    'boron conc', 'fuel temp', 'ctrl pos',  # not allowed
>>> ]
ValueError("Current number of perturbations is 2, not 3")
property states

Iterable describing each perturbation branch.

Length is equal to that of perturbations, and the i-th index of states indicates the values perturbation perturbations[i] experiences.

Can be set to any iterable such that the total number of perturbations is preserved


>>> col.states
(('B1000', 'B750', 'nom'), ('FT1200', 'FT600', 'nom'))
# set as numpy array
>>> states = numpy.array([
    [1000., 750., 0.],
    [1200., 600., 900.]
>>> col.states = states
>>> col.states
array([[1000.,  750.,    0],
       [1200.,  600.,  900]])
# set as individual numpy vectors
>>> col.states = (states[0], states[1])
>>> col.states
(array([1000., 750., 0.,]), array([1200., 600., 900.,]))
# pass incorrect shape
>>> col.states = (
>>>    (1000, 750, 0), (1200, 600, 900), (0, 1)
>>> )
ValueError("Current number of perturbations is 2, not 3")
# pass incorrect states for one perturbations
>>> cols.states = (
>>>     (1000, 750, 500, 0), (1200, 600, 900)
>>> )
ValueError("Current number of perturbations for state BOR "
           "is 3, not 4")