# Run TOPAS recipes **Goal:** run a `topas.rietveld` or `topas.spf` recipe with TOPAS 6, or write TOPAS's input on any machine and run it later. **You need:** - A recipe that states `"engine_version": "6"` at its top level. - To run TOPAS: a Windows machine with TOPAS 6 installed, and the folder that holds `tc.exe`. - To write the input only: any PowderLine environment, on any platform. TOPAS has no Python package. PowderLine writes TOPAS's input file (`.inp`) and data file (`.xye`), runs `tc.exe` and reads what TOPAS writes back. ## 1. Validate ```bash pixi run powderline my_sample/input.json --validate-only ``` Validation needs no TOPAS. It works in every environment, on every platform. ## 2. Tell PowderLine where TOPAS is and which version it is PowderLine never searches for TOPAS. `tc.exe` carries no version PowderLine could read, so you **declare** both the folder and the version. Give them on the command line: ```bash pixi run powderline my_sample/input.json --topas-version 6 --topas-dir C:/TOPAS6 ``` Or set them once in `.powderline_config.yaml`, in the folder you run from or in your home folder: ```yaml topas: dir: "C:/TOPAS6" version: 6 timeout: 3600 ``` The command-line flags win over the file. PowderLine reads only the first file it finds: a file in the folder you run from replaces the one in your home folder. The template `.powderline_config.yaml.example` in the repository shows the block. The declared version must equal the recipe's `engine_version`, written as the release number: `6`, not `6.0`. PowderLine 0.2.0 supports TOPAS 6 only. In Python: ```python result = powderline.run(recipe, Path("out"), topas_version="6", topas_dir=Path(r"C:\TOPAS6")) ``` ## 3. Run ```bash pixi run powderline my_sample/input.json --topas-version 6 --topas-dir C:/TOPAS6 ``` When the recipe models a background, `tc.exe` runs twice: once for the fit, then once for the background alone, at the refined values. TOPAS 6 cannot output the fit's background, so the second run provides the `y_bkg` column of `fit_profile.txt`. The second run is skipped when the fit's values are not finite. **Check:** the command line ends with `Refinement complete. Final Rwp: …`, and `output/` holds `fit_profile.txt` and the other report files. ## Write the input only, anywhere With no TOPAS folder declared, or none holding `tc.exe`, PowderLine writes TOPAS's input and stops. This works on Linux and macOS too: ```bash pixi run powderline my_sample/input.json ``` ``` ℹ️ Generated the engine input only (topas_generate_only, 0.0s): my_sample/output/my_sample.inp my_sample/output/my_sample.xye my_sample/output/output_recipe.json my_sample/output/parameter_dispositions.csv ``` This is not a failure. The result has `status: "generated"`, the command exits 0, and the `topas_generate_only` note says how to run it. Run the `.inp` on the TOPAS machine yourself, or run the recipe there. ## Set a time limit Each `tc.exe` run is stopped after 3600 seconds by default, so a TOPAS waiting for input (a license dialog, for example) cannot hang a run. Change the limit with `--topas-timeout SECONDS`, `topas.timeout` in `.powderline_config.yaml`, or `topas_timeout` in Python. `0` means no limit. Past the limit, the run fails with `ExecutionBackendError`, reason `timeout`. If only the background run is stopped, the fit still succeeds. `y_bkg` is then empty, with the warning `topas_background_not_calculated`. ## Use plain folder names TOPAS reads file paths in the Windows ANSI code page. A folder name that code page cannot hold, such as Greek on a Western-European Windows, makes TOPAS write nothing. Latin-1 names and spaces work. PowderLine handles this for you where it can. It passes such a folder to `tc.exe` by its short 8.3 name. If the drive has no short names, the run stops before TOPAS starts, with reason `backend_error` and a message to use an ASCII output folder (`--output DIR`). ## What a run writes Beside the report files every engine writes, a TOPAS run keeps TOPAS's own files. When the output path ends in a folder named `output`, `` is the name of the folder above it (`my_sample/output` gives `my_sample`). Otherwise it is `topas`. | File | What it is | |---|---| | `.inp`, `.xye` | what TOPAS was given | | `_results.csv` | TOPAS's refined values and statistics | | `_profile.txt` | TOPAS's calculated pattern | | `_p_peaks.txt` | the reflection list of phase `n` | | `_bkg.inp`, `_bkg_profile.txt` | the background-only run | A base name that is not ASCII is replaced by `topas`, with the warning `topas_base_name_sanitized`. [Outputs](../reference/outputs.md) describes the report files and the result. ## What to expect in the result - `converged` is always `null`: TOPAS 6 writes no convergence signal ({ref}`EB-85 `). - `engine_details["tc_path"]` names the `tc.exe` that ran. - TOPAS reports success and failure with the same exit code, so PowderLine judges a run by its output files. If TOPAS wrote none, the run fails with reason `output_missing`. Whatever `tc.exe` printed is in `failure.json`, under `failure.console_tail`. Otherwise its messages are in its console window and in `tc.log`, in the TOPAS folder. - A file TOPAS wrote that PowderLine cannot read strictly fails with reason `output_malformed`. The [TOPAS page](../engines/topas.md) lists what TOPAS does with a recipe and what PowderLine refuses on its behalf. **Next:** [Troubleshoot](troubleshooting.md), [Run at a beamline](beamline-operation.md).