“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`.

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`

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! :)
