-
Notifications
You must be signed in to change notification settings - Fork 60
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] Make it possible to read only a subset of available collections in ROOTFrameReader #504
base: master
Are you sure you want to change the base?
Conversation
58f9802
to
71eeece
Compare
71eeece
to
eed4ab9
Compare
Revived this as this is likely to become an issue for moving EDM4hep forwards otherwise. I have settled on making it possible to pass the collections that should be made available on a frame-by-frame basis as that is the most flexible and is also rather simple to implement. I still have to make sure that the idTable that is available from the constructed Frames is properly cleaned up and also add some tests that passing in unavailable collection names doesn't break the whole thing. |
1123457
to
7cc113d
Compare
It is possible that users want to "ignore" a certain collection when reading files. It should then still be possible to add a new collection with the same name to the event that has been created without breaking anything.
7cc113d
to
8b532ac
Compare
if (!collsToRead.empty() && | ||
std::ranges::find(collsToRead, m_collectionInfo[category].name[i]) == collsToRead.end()) { | ||
continue; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (!collsToRead.empty() && | |
std::ranges::find(collsToRead, m_collectionInfo[category].name[i]) == collsToRead.end()) { | |
continue; | |
} | |
if (std::ranges::find(collsToRead, m_collectionInfo[category].name[i]) == collsToRead.end()) { | |
continue; | |
} |
Probably nothing is gained by checking if collsToRead
is empty if in the end find
checks or does a for loop over its elements? Same below
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not entirely sure I follow here. Are you suggesting to do a loop over collsToRead
instead of looping over the potentially available collections and then checking each of them to be present in collsToRead
?
The advantage of the current way is that collections that are not present are simply ignored, but on the other hand that might be something we want to warn about.
Thinking about it, I don't think we can get rid of the find
in any case, because if we loop over collsToRead
we still have to check whether all collections are also actually available. Or am I missing something?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just edited; I just meant the first empty check as it's deleted in the suggestion, if it's empty find
will not find it anyway
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, sorry then I completely misunderstood. The check is negated, so we only want to do the find
if there are collections to check. If we remove the check, we will stop reading any collections (because if collsToRead
is empty then find
will never find a name in it).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think my suggestion is still incorrect because how it is now if collsToRead
is empty then the first check will always fail and will always continue. So it should be like this, only continue if at least one collection is passed to be read and it is not found there:
if (!collsToRead.empty()) {
if (std::ranges::find(collsToRead, m_collectionInfo[category].name[i]) == collsToRead.end()) {
continue;
}
}
then the existing calls will just pass an empty collsToRead
and the continue
will not trigger.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unless I am missing something the nested if
and the current implementation with the &&
are equivalent?
The main question this discussion has triggered for me is whether the continue
should actually be an exception, because arguably, if I put a collection name into the collsToRead
, I expect it to be in the Frame
I get in the end.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah yes, it's correct. Probably an exception is better than simply not reading it.
BEGINRELEASENOTES
collsToRead
argument toreadEntry
andreadNextEntry
for theROOTFrameReader
to allow limiting the collections that are actually read.ENDRELEASENOTES
This is an (early) proposal for introducing this functionality which would in the end address #499
collsToRead
will be silently ignored.std::ranges
.dev3
stacks