Skip to content

Commit c0e87db

Browse files
committed
[PWGHF] Protect daughter index access in selectEvent to prevent segmentation faults
1 parent 1499939 commit c0e87db

File tree

1 file changed

+33
-6
lines changed

1 file changed

+33
-6
lines changed

MC/config/PWGHF/external/generator/generator_pythia8_hfhadron_to_nuclei.C

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,18 +119,45 @@ class GeneratorPythia8HFHadToNuclei : public o2::eventgen::GeneratorPythia8
119119
int id = std::abs(event[iPart].id());
120120
float rap = event[iPart].y();
121121
if (id == mHadronPdg && rap > mHadRapidityMin && rap < mHadRapidityMax) {
122+
123+
int d1 = event[iPart].daughter1();
124+
int d2 = event[iPart].daughter2();
125+
126+
// Protection for invalid index of daughter 1
127+
if (d1 < 0 || d1 >= event.size()) {
128+
LOG(info) << "Invalid daughter index 1! d1 = " << d1;
129+
continue;
130+
}
131+
132+
// Protection for invalid index of daughter 2
133+
if (d2 < 0 || d2 >= event.size()) {
134+
LOG(info) << "Invalid daughter index 2! d2 = " << d2;
135+
continue;
136+
}
137+
138+
// Swap order
139+
if (d1 > d2) {
140+
std::swap(d1, d2);
141+
}
142+
143+
// No daughters
144+
if (d1 == 0 && d2 == 0) {
145+
LOG(info) << "No daughters (0,0). Skipping.";
146+
continue;
147+
}
148+
122149
LOG(debug) << "-----------------------------------------------------";
123-
LOG(debug) << "Found hadron " << event[iPart].id() << " with rapidity " << rap << " and daughters " << event[iPart].daughter1() << " " << event[iPart].daughter2();
150+
LOG(debug) << "Found hadron " << event[iPart].id() << " with rapidity " << rap << " and daughters " << d1 << " " << d2;
124151
// print pdg code of daughters
125152
LOG(debug) << "Daughters: ";
126-
for (int iDau = event[iPart].daughter1(); iDau <= event[iPart].daughter2(); ++iDau) {
153+
for (int iDau = d1; iDau <= d2; ++iDau) {
127154
LOG(debug) << "Daughter " << iDau << ": " << event[iDau].id();
128155
}
129-
bool isCoalDone = CoalescencePythia8(event, mNucleiPdgList, mTrivialCoal, mCoalMomentum, event[iPart].daughter1(), event[iPart].daughter2());
156+
bool isCoalDone = CoalescencePythia8(event, mNucleiPdgList, mTrivialCoal, mCoalMomentum, d1, d2);
130157
if (isCoalDone) {
131-
LOG(debug) << "Coalescence process found for hadron " << event[iPart].id() << " with daughters " << event[iPart].daughter1() << " " << event[iPart].daughter2();
158+
LOG(debug) << "Coalescence process found for hadron " << event[iPart].id() << " with daughters " << d1 << " " << d2;
132159
LOG(debug) << "Check updated daughters: ";
133-
for (int iDau = event[iPart].daughter1(); iDau <= event[iPart].daughter2(); ++iDau) {
160+
for (int iDau = d1; iDau <= d2; ++iDau) {
134161
LOG(debug) << "Daughter " << iDau << ": " << event[iDau].id();
135162
}
136163
return true;
@@ -171,4 +198,4 @@ FairGenerator *generateHFHadToNuclei(int input_trigger_ratio = 5, std::vector<in
171198
myGen->readString("Random:setSeed on");
172199
myGen->readString("Random:seed " + std::to_string(seed));
173200
return myGen;
174-
}
201+
}

0 commit comments

Comments
 (0)