Skip to content

Conversation

@Jjm321814
Copy link

Added classes to hold blip information in CAF format.
This results in the normal amount of CAF code duplication and replaces a few std::map and std::set objects in the LArSoft side with vectors.
This PR is independent of the associated ones in sbnobj, sbndcode, and sbncode.

@Jjm321814
Copy link
Author

Okay I think all the comments across each PR is now at least partly addressed, and the code compiles and seems to make sensible output when I run it.

@kjplows kjplows moved this from Open pull requests to Partially reviewed in SBN software development Dec 14, 2025
@kjplows
Copy link
Contributor

kjplows commented Dec 14, 2025

Hi @PetrilloAtWork , it looks like Jacob has implemented all the changes requested. How does the PR look now? Thanks!

Copy link
Member

@PetrilloAtWork PetrilloAtWork left a comment

Choose a reason for hiding this comment

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

classes_def.xml needs to be fixes.
I am recommending the renaming of one of the classes.
I have follow up on a couple of the comments, and added a few more.

Comment on lines 332 to 346
<class name="caf::SRBlip" ClassVersion="11">
<version ClassVersion="11" checksum="2097549339"/>
<version ClassVersion="10" checksum="3364148027"/>
</class>

<class name="caf::SRBlipHitClust" ClassVersion="12">
<version ClassVersion="12" checksum="1544666038"/>
<version ClassVersion="11" checksum="3137900176"/>
<version ClassVersion="10" checksum="1233871129"/>
</class>

<class name="caf::SRBlipTrueBlip" ClassVersion="11">
<version ClassVersion="11" checksum="451846977"/>
<version ClassVersion="10" checksum="984259034"/>
</class>
Copy link
Member

Choose a reason for hiding this comment

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

A single PR should increment a class version only by one unit.
These classes also list intermediate versions.
One way is to remove the checksums and let ROOT Cling do its job again (by building the library twice):

Suggested change
<class name="caf::SRBlip" ClassVersion="11">
<version ClassVersion="11" checksum="2097549339"/>
<version ClassVersion="10" checksum="3364148027"/>
</class>
<class name="caf::SRBlipHitClust" ClassVersion="12">
<version ClassVersion="12" checksum="1544666038"/>
<version ClassVersion="11" checksum="3137900176"/>
<version ClassVersion="10" checksum="1233871129"/>
</class>
<class name="caf::SRBlipTrueBlip" ClassVersion="11">
<version ClassVersion="11" checksum="451846977"/>
<version ClassVersion="10" checksum="984259034"/>
</class>
<class name="caf::SRBlip" ClassVersion="10" />
<class name="caf::SRBlipHitClust" ClassVersion="10" />
<class name="caf::SRBlipTrueBlip" ClassVersion="10" />

An alternative is to fix it by hand by keeping the latest checksum but naming it "version 10":

Suggested change
<class name="caf::SRBlip" ClassVersion="11">
<version ClassVersion="11" checksum="2097549339"/>
<version ClassVersion="10" checksum="3364148027"/>
</class>
<class name="caf::SRBlipHitClust" ClassVersion="12">
<version ClassVersion="12" checksum="1544666038"/>
<version ClassVersion="11" checksum="3137900176"/>
<version ClassVersion="10" checksum="1233871129"/>
</class>
<class name="caf::SRBlipTrueBlip" ClassVersion="11">
<version ClassVersion="11" checksum="451846977"/>
<version ClassVersion="10" checksum="984259034"/>
</class>
<class name="caf::SRBlip" ClassVersion="10">
<version ClassVersion="10" checksum="2097549339"/>
</class>
<class name="caf::SRBlipHitClust" ClassVersion="10">
<version ClassVersion="10" checksum="1544666038"/>
</class>
<class name="caf::SRBlipTrueBlip" ClassVersion="10">
<version ClassVersion="10" checksum="451846977"/>
</class>

It would be good to rebuild after this change too, for added safety.

/*!
please note the blip X position is unreliable, so these distance and 3-d position derived variables may be incorrect
*/
SRVector3D position; ///< 3D position vector. Reconstructed with wrong t0! [cm]
Copy link
Member

Choose a reason for hiding this comment

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

Aggregate initialisation should work here:

Suggested change
SRVector3D position; ///< 3D position vector. Reconstructed with wrong t0! [cm]
SRVector3D position { -999., -999., -999. }; ///< 3D position vector. Reconstructed with wrong t0! [cm]

(if compiler complains about narrowing, you may need to explicitly use float constants, like in -999.0f).
This will allow the removal of the default constructor.
Also, z -999 [cm] is almost within ICARUS detector, and it's not a particularly crazy value. If you don't like the default (NaN), use a more extreme value (e.g. -9999. is well outside SBN-FD).

Comment on lines 16 to 18
class SRBlip
{
public:
Copy link
Member

Choose a reason for hiding this comment

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

Hmm... that means that the scores would be the only private members, and you would need a specific accessor only for that. That makes the data members asymmetric. Alternatively, you'd have to set all data private and provide one accessor per data member, which is tedious.
I would rather suggest that the new scores be a public data member of a new custom type, say, SRBlipScores (side effect is that this one can still be a struct), and that the sorting be handled within the custom type.

/*!
please note the blip X position is unreliable, so these distance and 3-d position derived variables may be incorrect
*/
SRVector3D position; ///< 3D position vector. Reconstructed with wrong t0! [cm]
Copy link
Member

Choose a reason for hiding this comment

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

"wrong t0" is maybe too strong... "assuming the blip was coincident with event trigger", for the slice happening at trigger time that ends up the right time (provided that the blip is not a delayed product of some decay of long-wandering particle).
I can't think of a better way to say that compactly though, so if you want to keep it as is, I am also fine with that.

Copy link
Author

Choose a reason for hiding this comment

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

Updated to -- "Reconstructed assuming that the blip was coincident with the event trigger"

* That blip reconstruction applies cuts to overall blip size/spread
* A single TrueBlip will be constructed for energy depositions within TrueBlipMergeDist (fcl set 0.3 cm by default)
*/
struct SRBlipTrueBlip {
Copy link
Member

Choose a reason for hiding this comment

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

Something that I missed from the previous run: SRBlipTrueBlip... isn't there too much Blip in it? SRTrueBlip should be descriptive enough and consistent with, e.g., SRTrueParticle.
Please seriously consider renaming this one.

Copy link
Author

Choose a reason for hiding this comment

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

Updated to SRTrueBlip

@@ -0,0 +1,20 @@
/**
* @file SRBlip.h
Copy link
Member

Choose a reason for hiding this comment

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

This is the wrong file name (Doxygen will go crazy):

Suggested change
* @file SRBlip.h
* @file SRBlip.cxx

(and yes, I did mistype it in my suggestion)

Copy link
Author

Choose a reason for hiding this comment

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

The earlier comment suggested eliminating this file so I am trying that first.

/*!
for properly flash matched out-of-time tracks this distance will be wrong! The blips have no such flash matching ability as of yet
*/
int proxTrkID=caf::kUninitializedInt; ///< index of the of closest track, assuming the blip was concident with event trigger
Copy link
Member

Choose a reason for hiding this comment

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

Typo:

Suggested change
int proxTrkID=caf::kUninitializedInt; ///< index of the of closest track, assuming the blip was concident with event trigger
int proxTrkID=caf::kUninitializedInt; ///< index of the of closest track, assuming the blip was coincident with event trigger

Copy link
Author

Choose a reason for hiding this comment

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

Fixed both typo of coincident

float EnergyESTAR; // Energy (ESTAR method from ArgoNeuT) [GeV]
float EnergyPSTAR; // Energy (PSTAR method similar with ESTAR method from ArgoNeuT) [GeV]
float ProxTrkDist; // Distance to cloest track
int ProxTrkID; // ID of closest track
Copy link
Member

Choose a reason for hiding this comment

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

So maybe just add in parentheses " (recob::Track::ID())" to the documentation?

Comment on lines 56 to 57
std::vector<int> hitIDs; ///< Index of the recob::hit objects making up this cluster. Size should match nHits
std::vector<int> wires; ///< Set of geo::wireIDs contributing hits to this cluster. Size should match nWires
Copy link
Member

Choose a reason for hiding this comment

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

Using the exact name if the classes will help Doxygen cross-link.

Suggested change
std::vector<int> hitIDs; ///< Index of the recob::hit objects making up this cluster. Size should match nHits
std::vector<int> wires; ///< Set of geo::wireIDs contributing hits to this cluster. Size should match nWires
std::vector<int> hitIDs; ///< Index of the `recob::Hit` objects making up this cluster. Size should match `nHits`.
std::vector<int> wires; ///< Set of `geo::WireID` contributing hits to this cluster. Size should match `nWires`.

Copy link
Author

Choose a reason for hiding this comment

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

Updated these. Are the ` necessary? I also added them to the simb::MCParticle and raw::channelID references

@Jjm321814
Copy link
Author

Above comments have been addressed and the CAF file gets made and looks generally good.
One wrinkle is that blips can be made with 2 or 3 plane matches. Since we are making the array of SRHitClusters with a fixed size we end up filling in a bunch of default values. That might be a nice feature to build loops in a really standard way for CAF/FlatCAF but it does mean people will run into default values frequently.
image

@Jjm321814
Copy link
Author

Noticed the flat caf wasn't generated correctly so I used mrb z and recompiled.
That lead to issues with the SRVector3D constructor when trying to default to -9999, -9999, -9999.
Instead I am using the blank constructor, filled with NaN values.

Now the compilation finishes and the output CAF + FlatCAF look good.

@kjplows
Copy link
Contributor

kjplows commented Jan 15, 2026

Calling reviewers to check if these PRs are OK, @PetrilloAtWork , @henrylay97 , @sungbinoh

Copy link
Contributor

@sungbinoh sungbinoh left a comment

Choose a reason for hiding this comment

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

Everything looks very good. Thank a lot for the huge efforts!

float time = caf::kSignalingNaN; ///< charge-weighted average hit-peak-times for this hit-cluster [us]
float startTime = caf::kSignalingNaN; ///< Minimum -1 sigma time of a hit in this cluster [us]
float endTime = caf::kSignalingNaN; ///< Max +1 sigma time of a hit in this cluster [us]
float timespan = caf::kSignalingNaN; ///< Hit cluster EndTime - StartTime [us]
Copy link
Member

Choose a reason for hiding this comment

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

In general I would say it's better practice not to store things like this as separate variables given it is fully defined by two other variables. Instead have a member function that returns the difference between the start and end time. There may well be other examples of similar occurrences.

I'm not going to hold the PR up for this, but something to think about for future.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Partially reviewed

Development

Successfully merging this pull request may close these issues.

7 participants