Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten
, '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

Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten
, '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

Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten
, '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

Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten
, '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

Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten
, '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

Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten
, '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

Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten
, '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

Inline photon-induced electron and positron treatment - #4040

Merged
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb
Aug 3, 2026
Merged

Inline photon-induced electron and positron treatment#4040
GuySten merged 4 commits into
openmc-dev:developfrom
paulromano:inline-ttb

Conversation

@paulromano

Copy link
Copy Markdown
Contributor

Description

This PR changes photon-induced electrons and positrons to be processed at their birth location instead of being created and handled as secondary particles. This avoids unnecessary secondary banking and transport overhead, especially in shared-secondary mode, while preserving explicit handling of electron/positron source particles.

This changes heating-tally behavior: heating from photon-induced charged particles is now attributed to the parent photon. Consequently, a heating tally using ParticleFilter(["photon"]) includes the electron/positron contribution, avoiding a longstanding and common user gotcha where that contribution was silently omitted. Electron/positron secondaries are no longer exposed through ParticleProductionFilter.

If OpenMC gains physical electron/positron transport in the future, energy deposition can then be separated by particle type instead of being attributed entirely to the photon collision.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) 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)

@GuyStenGuySten 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.

Looks good to me.

@GuyStenGuySten added Merging Soon PR will be merged in < 24 hrs if no further comments are made. Tallies labels Aug 2, 2026
@shimwell

Copy link
Copy Markdown
Member

This is PR of the month award IMO. I know several users who will really appreciate this including myself. I have also looked through and code looks fine to me.

Can I ask if this is significant enough change to consider a minor version bump for the next release? Perhaps v0.16.0?

@GuySten
GuySten merged commit 131cafb into openmc-dev:developAug 3, 2026
19 checks passed
@paulromano
paulromano deleted the inline-ttb branch August 3, 2026 13:56
@nuclearkevinnuclearkevin mentioned this pull request Aug 3, 2026
5 tasks
TsvikiHirsh added a commit to TsvikiHirsh/openmc that referenced this pull request Aug 10, 2026
PR openmc-dev#4040 (included in v0.16.0) inlined positron treatment:
annihilation photons from pair production are now emitted in
process_charged_secondary at the parent photon collision site, and
sample_positron_reaction is no longer on the pair-production path.
Move the next-event estimator hook for the two isotropic 511 keV
photons into the inline path (keeping the one in
sample_positron_reaction for banked positrons).
Regenerate point detector regression references: the corrected Compton
shell selection and Doppler broadening from openmc-dev#4036 shifts the
scattered-flux bins. Re-verified against thin-shell track-length
tallies: total flux agrees to 0.3% inside water and in vacuum, and the
511 keV annihilation line from 6.5 MeV photons on iron agrees to 0.8%.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Merging SoonPR will be merged in < 24 hrs if no further comments are made.Tallies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulromano@shimwell@GuySten