Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Warn users that tally heating score with photon bin but without electron and positron bins. - #3755

Closed
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon
Closed

Warn users that tally heating score with photon bin but without electron and positron bins.#3755
GuySten wants to merge 8 commits into
openmc-dev:developfrom
GuySten:warn-heating-photon

Conversation

@GuySten

Copy link
Copy Markdown
Contributor

Description

Because OpenMC does not transport charged particles and other than heating there are no scores that use charged particles bins,
users might forget to tally positron and electron bins when calculating heating score and using particle filter.
This PR add a warning for that case.

Examples where user forgot to tally heating charged particles bins:
https://openmc.discourse.group/t/photon-heating-discrepancies-with-mcnp-and-open-mc/5705
https://openmc.discourse.group/t/benchmark-against-mcnp-and-tripoli4-unsatisfactory/3154

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 15) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@shimwell

Copy link
Copy Markdown
Member

Great idea. Keen to see this merged. Wondering if the warning can be more specific about what the user needs to do to fix. perhaps it could go as far as giving the python code snippet of what is needed.

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I welcome suggestions for a better warning message if you have any.

@shimwell

Copy link
Copy Markdown
Member

how about something along these lines. I find it super useful when i can copy paste the solution from the error message

"Tally {} contains heating score with photon bin but "
"without electron bin. Try adding to the particle filter "
"openmc.ParticleFilter(['photon', 'electron', 'positron']) "

@GuySten

Copy link
Copy Markdown
ContributorAuthor

@shimwell, I've changed the error message.
Could you review this PR?

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

I like this idea.

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I think get_filter returns the first particle filter in this case and not all the particle filters

Comment threadsrc/tallies/tally.cpp Outdated
Co-authored-by: Jonathan Shimwell <drshimwell@gmail.com>
@GuySten

Copy link
Copy Markdown
ContributorAuthor

I'm not sure the current implementation will work properly if there are multiple ParticleFilters in the tally.filters

I don't think it is legal to have multiple filters of the same type.

@shimwellshimwell left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the improving the user experience and answering my only concern. Happy to see this merged

@GuyStenGuySten added the Merging Soon PR will be merged in < 24 hrs if no further comments are made. label Feb 4, 2026
@makeclean

Copy link
Copy Markdown
Contributor

Silly question, is there a precedent for this elsewhere in the C++ layer? I'm somewhat anxious having an error message this is not explicitly related to the route that someone used to produce the error, i.e. one could be executing having written the xml (rather than via the python layer) and this wouldn't really be relevant (nor paste-able - not that we should be pasting stuff into xml files).

Should this error not be raised by the python layer when you instantiate the tally object? You can more safely iterate over the various member objects of the python classes making sure that as particles are added there is no need to duplicate effort in the C++ class?

I guess I worry that there should be a separation of concerns here, we could quickly spiral into error messages being influenced by the mutable python interface, which can be out of step relative to the C++ layer.

@shimwell

shimwell commented Feb 4, 2026

Copy link
Copy Markdown
Member

ah yes fair point. A check that returns python code as the fix could be done by the openmc.ParticleFilter() at the python level. I guess this is my fault for asking for the warning message to be change to include the python code in the first place.

@GuySten

GuySten commented Feb 4, 2026

Copy link
Copy Markdown
ContributorAuthor

The problem with checking that on the python side is that the python state is dynamic.
You can add attributes to the tally object in any order so it is not clear to me where is the right place to add the check.

In the cpp side as long as we do not use the C-API it is natural to place that warning because we are guaranteed to have all needed data.

For example you can set particle filter and then heating score or the other way around.
I think you can also have a workflow where you set an empty particle filter and add bins to it afterwards.
So detection of this warning on the python side will be really complicated.

That is why I prefer a check on the cpp side.

@shimwell

Copy link
Copy Markdown
Member

Well I guess you are both right so the common ground is to remove the part of the error message I thought was useful so it is not longer python specific 😭

@paulromanopaulromano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have checks on the Python side because coding wise they just are simpler, and less stuff to compile. That being said, I'm actually not a huge fan of putting warnings in for every little thing because there are a million ways for users to shoot themselves in the foot (by design) and it's not really our job to tell them every little thing they are doing wrong. In principle, there is nothing "wrong" with having a ParticleFilter with only "photon" and tallying heating -- that might be what the user wants. Personally I think a better option here is to have clearer documentation (e.g., on ParticleFilter and in the user's guide).

@paulromano

Copy link
Copy Markdown
Contributor

I'll also add that I'm considering changing this behavior so that users do get all the heating lumped in the photon bin, provided that electrons and positrons are not being transported (which may be possible in the future).

@GuySten

Copy link
Copy Markdown
ContributorAuthor

I've opened this PR because this issue is the biggest silent footgun I am familiar with in openmc.
I am also ok with adding a Common Pitfalls section in the documentation.
@paulromano, If you have a list of common footguns in openmc I will be happy to write that section.

In any case, if you are considering to change the behavior to score electron and positron heating in the photon bin
I think this PR should be on hold anyway.

@GuyStenGuySten added On hold and removed Merging Soon PR will be merged in < 24 hrs if no further comments are made. labels Feb 4, 2026
@GuySten

Copy link
Copy Markdown
ContributorAuthor

Superseded by #4040

@GuyStenGuySten closed this Aug 2, 2026
@GuySten
GuySten deleted the warn-heating-photon branch August 4, 2026 04:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@GuySten@shimwell@makeclean@paulromano