“Do” Examples

PyMCNP enables common workflows using pyvista, pandas, subprocesss, matplotlib, and difflib.

Checking INP Files

Note

This example requires example_00.inp.

Code:

"""
Example checking INP files using `Check`.

This example checks if `example_00.inp` is valid using `Check.check` and
reformats it using `Check.fix`.
"""

import pathlib

import pymcnp

# Initializing `Check`.
path = pathlib.Path('example_00.inp')
checker = pymcnp.Check(path)

# Checking.
print(f'Checking INP file: `{path}`')
checker.check()

# Fixing.
print(f'Fixing and writing to INP file: `{path}`')
checker.fix()

Output:

Checking INP file: `example_00.inp`
Fixing and writing to INP file: `example_00.inp`

Converting OUTP Files

Note

This example requires example_00.outp.

Code:

"""
Example converting OUTP files using `Convert`.

This example converts tally #1 in `example_00.outp` to csv file using `to_csv`
and a parquet file using `to_parquet`.
"""

import pathlib

import pymcnp

TALLY = '1'

# Reading OUTP.
path = pathlib.Path('example_00.outp')
outp = pymcnp.Outp.from_file(path)

# Initializing `Convert`.
converter = pymcnp.Convert(outp)

# Converting to csv.
print(f'Converting tally #{TALLY} from `{path}` to `example_00-{TALLY}.csv`')
converter.to_csv(TALLY, f'example_00-{TALLY}.csv')

# Converting to parquet.
print(f'Converting tally #{TALLY} from `{path}` to `example_00-{TALLY}.parquet`')
converter.to_parquet(TALLY, f'example_00-{TALLY}.parquet')

Output:

Converting tally #1 from `PyMCNP/files/outp/example_00.outp` to `example_00-1.csv`
Converting tally #1 from `PyMCNP/files/outp/example_00.outp` to `example_00-1.parquet`

Plotting OUTP Files

Note

This example requires example_00.outp.

Code:

"""
Example plotting OUTP files using `Plot`.

This example plots tally #1 from `example_00.outp` using `to_show`, and it
writes the plots to a pdf file using `to_pdf`.
"""

import pathlib

import matplotlib.pyplot

import pymcnp

TALLY = '1'

# Reading OUTP.
path = pathlib.Path('example_00.outp')
outp = pymcnp.Outp.from_file(path)

# Initializing `Plot`
plotter = pymcnp.Plot(outp)

# Ploting.
print(f'Plotting tally #{TALLY} from {path}.')
plotter.to_show(TALLY)
matplotlib.pyplot.show()
matplotlib.pyplot.close()

# Writting PDF.
print(f'Writing plots tally #{TALLY} from {path} to `example_00-{TALLY}.pdf`.')
plotter.to_pdf(TALLY, f'example_00-{TALLY}.pdf')

Output:

Plotting tally #1 from files/outp/example_00.outp.
Writing plots tally #1 from files/outp/example_00.outp to `example_00-1.pdf`.

do_plot_0 do_plot_1 do_plot_2 do_plot_3

Running INP Files

Note

This example requires example_00.inp, example_01.inp, and example_02.inp.

Code:

"""
Example running INP files using `Run`.

This example runs three input files, `example_00.inp`, `example_01.inp`, and
`example_02.inp`. First, it subclasses `Run`, adding callbacks. Second, it
reads the input files and sets their nps and seed. Finally, it runs the INP
files inp parallel.
"""

import pathlib

import pymcnp


COMMAND = 'echo'


# Creating `Run` subclass.
class MyRun(pymcnp.Run):
    def prehook_file(self, path, index):
        print(f'Calling `prehook_file` {path} {index}')

    def posthook_file(self, path, index):
        print(f'Calling `posthook_file` {path} {index}')

    def prehook_batch(self, path):
        print(f'Calling `prehook_batch` {path}')

    def posthook_batch(self, path):
        print(f'Calling `posthook_batch` {path}')


# Reading INP.
path0 = pathlib.Path('example_00.inp')
path1 = pathlib.Path('example_01.inp')
path2 = pathlib.Path('example_02.inp')
inp0 = pymcnp.Inp.from_file(path0)
inp1 = pymcnp.Inp.from_file(path1)
inp2 = pymcnp.Inp.from_file(path2)

inp0.nps = 1e4
inp1.nps = 1e5
inp2.nps = 1e6
inp0.seed = 123534727
inp1.seed = 123534727
inp2.seed = 123534727

# Running.
print(f'Running `{COMMAND}` in the current working directory:')
runner = MyRun([inp0, inp1, inp2], command=COMMAND)
runner.run('.')

Output:

Running `echo` in the current working directory:
Calling `prehook_batch` pymcnp-2025-08-22--01-12-44
Calling `prehook_file` pymcnp-2025-08-22--01-12-44/run-0 0
inp=pymcnp-2025-08-22--01-12-44/run-0/run-0.inp outp=pymcnp-2025-08-22--01-12-44/run-0/run-0.outp ptrac=pymcnp-2025-08-22--01-12-44/run-0/run-0.ptrac
Calling `prehook_file` pymcnp-2025-08-22--01-12-44/run-1 1
inp=pymcnp-2025-08-22--01-12-44/run-1/run-1.inp outp=pymcnp-2025-08-22--01-12-44/run-1/run-1.outp ptrac=pymcnp-2025-08-22--01-12-44/run-1/run-1.ptrac
Calling `prehook_file` pymcnp-2025-08-22--01-12-44/run-2 2
Calling `posthook_file` pymcnp-2025-08-22--01-12-44/run-0 0
Calling `posthook_file` pymcnp-2025-08-22--01-12-44/run-1 1
inp=pymcnp-2025-08-22--01-12-44/run-2/run-2.inp outp=pymcnp-2025-08-22--01-12-44/run-2/run-2.outp ptrac=pymcnp-2025-08-22--01-12-44/run-2/run-2.ptrac
Calling `posthook_file` pymcnp-2025-08-22--01-12-44/run-2 2
Calling `posthook_batch` pymcnp-2025-08-22--01-12-44

Visualizing INP Files

Note

This example requires example_05.inp.

Code:

"""
Example visualizing INP files using `Visualize`.

This example visualizes the surfaces in `example_05.inp` INP file using
`to_show_surfaces`, and it generates a PDF file containing the images.
"""

import pathlib

import pymcnp

# Reading INP.
path = pathlib.Path('example_05.inp')
inp = pymcnp.Inp.from_file(path)

# Visualizing surfaces.
print(f'Visualizing all surfaces from `{path}`.')
visualizer = pymcnp.Visualize(inp)
visualizer.to_show_surfaces().show()

# Converting to PDF.
print(f'Writing visualizations of all surfaces from `{path}` to `example_05-surfaces.pdf`')
visualizer.to_pdf_surfaces('example_05-surfaces.pdf')

Output:

Visualizing all surfaces from `example_05.inp`.
Writing visualizations of all surfaces from `example_05.inp` to `example_05-surfaces.pdf`

do_visualize

Parameter Scan

Note

This example requires example_01.outp and example_04.inp.

Code:

"""
Example parameter scan.

This example mocks the parameter scan workflow. First, it reads INP file `example_04.inp`.
Second, it create multiple INP files by iterates over a surface's `vy` parameter. Thrid,
it visualizes the surfaces. Fourth, it subclasses `Run`, adding callbacks that process
the output files. Finaly, it runs the input files in parallel.
"""

import copy
import shutil
import pathlib

import pymcnp


COMMAND = 'echo'


class MyRun(pymcnp.Run):
    def posthook_file(self, path, index):
        # Copying OUTP (ECHO used for demo).
        path_copy = pathlib.Path('example_01.outp')
        path_outp = path / f'run-{index}.outp'

        with path_outp.open('w') as file_outp:
            with path_copy.open('r') as file_copy:
                file_outp.write(file_copy.read())

        # Reading OUTP.
        path_outp = path / f'run-{index}.outp'
        outp = pymcnp.Outp.from_file(path_outp)

        # Plotting.
        path_pdf = path / '..' / f'run-{index}.pdf'
        plotter = pymcnp.Plot(outp)
        plotter.to_pdf('1', path_pdf)

        # Deleting Run.
        shutil.rmtree(path)

    def posthook_batch(self, path):
        print('DONE! :)')


# Reading INP.
path_inp = pathlib.Path('example_04.inp')
inp = pymcnp.Inp.from_file(path_inp)

# Scanning.
inps = []
for vy in [-2, -1, 0, 1, 2]:
    inp.surfaces[0].option.vy = vy
    inps.append(copy.deepcopy(inp))

# Visualizing.
for inp in inps:
    visualizer = pymcnp.Visualize(inp)
    visualization = visualizer.to_show_surfaces()
    visualization.show()

# Running.
print(f'Running parameter scan `{COMMAND}` in the current working directory:')
runner = MyRun(inps, command=COMMAND)
runner.run('.')

Output:

Running parameter scan `echo` in the current working directory:
inp=pymcnp-2025-08-22--01-52-15/run-0/run-0.inp outp=pymcnp-2025-08-22--01-52-15/run-0/run-0.outp ptrac=pymcnp-2025-08-22--01-52-15/run-0/run-0.ptrac
inp=pymcnp-2025-08-22--01-52-15/run-1/run-1.inp outp=pymcnp-2025-08-22--01-52-15/run-1/run-1.outp ptrac=pymcnp-2025-08-22--01-52-15/run-1/run-1.ptrac
inp=pymcnp-2025-08-22--01-52-15/run-2/run-2.inp outp=pymcnp-2025-08-22--01-52-15/run-2/run-2.outp ptrac=pymcnp-2025-08-22--01-52-15/run-2/run-2.ptrac
inp=pymcnp-2025-08-22--01-52-15/run-3/run-3.inp outp=pymcnp-2025-08-22--01-52-15/run-3/run-3.outp ptrac=pymcnp-2025-08-22--01-52-15/run-3/run-3.ptrac
inp=pymcnp-2025-08-22--01-52-15/run-4/run-4.inp outp=pymcnp-2025-08-22--01-52-15/run-4/run-4.outp ptrac=pymcnp-2025-08-22--01-52-15/run-4/run-4.ptrac
DONE! :)

do_parameter_scan_0 do_parameter_scan_1 do_parameter_scan_2 do_parameter_scan_3 do_parameter_scan_4