Fix instabilities when we have empty timeframes due low interaction rate - #15705
Open
sawenzel wants to merge 6 commits into
Open
Fix instabilities when we have empty timeframes due low interaction rate#15705sawenzel wants to merge 6 commits into
sawenzel wants to merge 6 commits into
Conversation
sawenzel
requested review from
a team,
afurs,
andreasmolander,
arossi81,
bazinski,
coppedis,
davidrohr,
f3sch,
fcolamar,
fgrosa,
fprino,
gvolpe79,
jotwinow,
kharlov,
mconcas,
mcoquet642,
njacazio,
noferini,
peressounko,
sahilupadhyaya92,
wiechula and
wille10
as code owners
August 21, 2026 16:46
This fixes a problem in the timeframe index structure of the collision context and adds a unit test. - getTimeFrameBoundaries closed only one timeframe per collision, so a timeframe without collisions was left out of the index structure entirely and the collisions after it were assigned to the wrong timeframe. - The number of extracted per-timeframe contexts was therefore the number of non-empty timeframes, not the number of timeframes asked for, and the last tf<N>/collisioncontext.root could be missing. - The scan now closes every timeframe a collision skips over and pads the result to the number of timeframes the caller asks for, so entry i always describes orbits [start + i*orbitsPerTF, start + (i+1)*orbitsPerTF). - applyMaxCollisionFilter keeps an empty timeframe empty when it re-indexes, and extractSingleTimeframe returns a valid empty context for it. - o2-steer-colcontexttool passes the number of timeframes it asked for, reports timeframes that came out empty together with the mean number of collisions per timeframe implied by the interaction rate, and refuses to continue when --noEmptyTF was requested. https://its.cern.ch/jira/browse/O2-7132 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This fixes a problem in GenTPCLoopers::setFlatGas when the collision context of a timeframe is empty. - A timeframe holds no collision whenever the interaction rate is low enough, and the generator called exit(1) on it. - The extent of the timeframe now comes from HBFUtils in that case, which is where it is defined, instead of from the last collision. - With a single collision in the timeframe the mean interaction spacing was divided by zero; it is now taken from the interaction rate stored in the collision context. https://its.cern.ch/jira/browse/O2-7132 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This fixes a segmentation fault in MCHDPLDigitizerTask when the collision context of a timeframe is empty. - The noise-only signal range was taken from eventRecords.front() and eventRecords.back(), which is undefined behaviour on an empty vector. - A timeframe holds no collision whenever the interaction rate is low. - The range now comes from HBFUtils in that case, so the noise covers the timeframe that is actually being digitised. https://its.cern.ch/jira/browse/O2-7132 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This fixes a crash in the ITS, MFT, MCH and MID digit readers when the digit tree of a timeframe has no entry. - A timeframe holds no collision at all whenever the interaction rate is low enough, and the digitiser then writes a valid tree with zero entries. - The ITS/MFT reader guarded this with an assert, which is compiled out of every production build because ENABLE_CASSERT defaults to OFF, and then dereferenced branch addresses that GetEntry had not filled. - The MCH and MID readers threw on the failed TTreeReader::Next(). - All four now send empty output and end the stream. - The two asserts in the ITS/MFT connectTree become real errors for the same reason. https://its.cern.ch/jira/browse/O2-7132 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This replaces a disabled assert with a real check in 36 ROOT-tree reader specs, so that a timeframe whose tree has no entry ends the stream instead of reading past the end. - Every one of them carried the same two lines: assert(ent < mTree->GetEntries()) with the comment "this should not happen", followed by mTree->GetEntry(ent). - ENABLE_CASSERT defaults to OFF, so the assert is compiled out of every production build and the reader then publishes branch addresses that GetEntry never filled. - A timeframe holds no collision whenever the interaction rate is low enough, which is when the trees come out empty. - The readers now end the stream, which the consumers downstream already handle. - Detectors/Upgrades/ALICE3/IOTOF is left alone: it has no ControlService. https://its.cern.ch/jira/browse/O2-7132 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This fixes the TPC digit writer producing a file without a tree when a timeframe holds no collision. - The custom close callback only called TFile::Close inside "if (entries > 0)", and never called TFile::Write, so with nothing to write the tree never reached the file. - The result was a 942 byte file with no o2sim tree, and every reader of it failed on a missing branch rather than on an empty tree. - Each branch is now filled once with the empty default object it is bound to, so the file is an ordinary timeframe that happens to contain no digit and the readers downstream stay on their normal path. - The tree is written explicitly, the way RootTreeWriter's own close does. https://its.cern.ch/jira/browse/O2-7132 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes problems with empty timeframe handling in