Skip to content

Commit aada780

Browse files
apply reviewer comments, switch order of trackEFf values and binning configurables
1 parent 70f1114 commit aada780

File tree

6 files changed

+85
-74
lines changed

6 files changed

+85
-74
lines changed

PWGJE/Core/JetFindingUtilities.h

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ constexpr bool isEMCALClusterTable()
9292
*/
9393

9494
template <typename T, typename U>
95-
void analyseTracks(std::vector<fastjet::PseudoJet>& inputParticles, T const& tracks, int trackSelection, std::vector<double> trackingEfficiency, std::vector<double> trackingEfficiencyPtBinning, const U* candidate = nullptr)
95+
void analyseTracks(std::vector<fastjet::PseudoJet>& inputParticles, T const& tracks, int trackSelection, bool applyTrackingEfficiency, std::vector<double> trackingEfficiency, std::vector<double> trackingEfficiencyPtBinning, const U* candidate = nullptr)
9696
{
9797
for (auto& track : tracks) {
9898
if (!jetderiveddatautilities::selectTrack(track, trackSelection)) {
@@ -103,17 +103,15 @@ void analyseTracks(std::vector<fastjet::PseudoJet>& inputParticles, T const& tra
103103
continue;
104104
}
105105
}
106-
if (!(trackingEfficiencyPtBinning.size() == 2 && trackingEfficiency.at(0) > 0.999)) { // this code is a bit ugly but it stops us needing to do the random generation unless asked for
107-
TRandom3 randomNumber(0);
108-
bool isTrackDiscarded = false;
109-
for (size_t i = 0; i < trackingEfficiency.size(); i++) {
110-
if (trackingEfficiencyPtBinning.at(i) < track.pt() && track.pt() < trackingEfficiencyPtBinning.at(i + 1) && randomNumber.Rndm() > trackingEfficiency.at(i)) {
111-
isTrackDiscarded = true;
106+
if (applyTrackingEfficiency){
107+
auto iter = std::upper_bound(trackingEfficiencyPtBinning.begin(), trackingEfficiencyPtBinning.end(), track.pt());
108+
if (iter!=trackingEfficiencyPtBinning.begin() && iter!=trackingEfficiencyPtBinning.end()){
109+
std::size_t index = std::distance(trackingEfficiencyPtBinning.begin(), iter) - 1;
110+
TRandom3 randomNumber(0);
111+
if (randomNumber.Rndm() > trackingEfficiency[index]){
112+
continue;
112113
}
113114
}
114-
if (isTrackDiscarded == true) {
115-
continue;
116-
}
117115
}
118116
fastjetutilities::fillTracks(track, inputParticles, track.globalIndex());
119117
}
@@ -129,7 +127,7 @@ void analyseTracks(std::vector<fastjet::PseudoJet>& inputParticles, T const& tra
129127
*/
130128

131129
template <typename T, typename U>
132-
void analyseTracksMultipleCandidates(std::vector<fastjet::PseudoJet>& inputParticles, T const& tracks, int trackSelection, std::vector<double> trackingEfficiency, std::vector<double> trackingEfficiencyPtBinning, U const& candidates)
130+
void analyseTracksMultipleCandidates(std::vector<fastjet::PseudoJet>& inputParticles, T const& tracks, int trackSelection, bool applyTrackingEfficiency, std::vector<double> trackingEfficiency, std::vector<double> trackingEfficiencyPtBinning, U const& candidates)
133131
{
134132
for (auto& track : tracks) {
135133
if (!jetderiveddatautilities::selectTrack(track, trackSelection)) {
@@ -140,17 +138,15 @@ void analyseTracksMultipleCandidates(std::vector<fastjet::PseudoJet>& inputParti
140138
continue;
141139
}
142140
}
143-
if (!(trackingEfficiencyPtBinning.size() == 2 && trackingEfficiency.at(0) > 0.999)) { // this code is a bit ugly but it stops us needing to do the random generation unless asked for
144-
TRandom3 randomNumber(0);
145-
bool isTrackDiscarded = false;
146-
for (size_t i = 0; i < trackingEfficiency.size(); i++) {
147-
if (trackingEfficiencyPtBinning.at(i) < track.pt() && track.pt() < trackingEfficiencyPtBinning.at(i + 1) && randomNumber.Rndm() > trackingEfficiency.at(i)) {
148-
isTrackDiscarded = true;
141+
if (applyTrackingEfficiency){
142+
auto iter = std::upper_bound(trackingEfficiencyPtBinning.begin(), trackingEfficiencyPtBinning.end(), track.pt());
143+
if (iter!=trackingEfficiencyPtBinning.begin() && iter!=trackingEfficiencyPtBinning.end()){
144+
std::size_t index = std::distance(trackingEfficiencyPtBinning.begin(), iter) - 1;
145+
TRandom3 randomNumber(0);
146+
if (randomNumber.Rndm() > trackingEfficiency[index]){
147+
continue;
149148
}
150149
}
151-
if (isTrackDiscarded == true) {
152-
continue;
153-
}
154150
}
155151
fastjetutilities::fillTracks(track, inputParticles, track.globalIndex());
156152
}

PWGJE/JetFinders/jetFinder.cxx

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ struct JetFinderTask {
7373
Configurable<float> trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"};
7474
Configurable<float> trackPhiMin{"trackPhiMin", -999, "minimum track phi"};
7575
Configurable<float> trackPhiMax{"trackPhiMax", 999, "maximum track phi"};
76-
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0}, "tracking efficiency array applied to jet finding"};
77-
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 999.}, "pt binning of tracking efficiency array"};
76+
Configurable<bool> applyTrackingEfficiency{"applyTrackingEfficiency", {false}, "configurable to decide whether to apply artificial tracking efficiency (discarding tracks) in jet finding"};
77+
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 10, 999.}, "pt binning of tracking efficiency array if applyTrackingEfficiency is true"};
78+
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0, 1.0}, "tracking efficiency array applied to jet finding if applyTrackingEfficiency is true"};
7879
Configurable<std::string> trackSelections{"trackSelections", "globalTracks", "set track selections"};
7980
Configurable<std::string> particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"};
8081

@@ -163,12 +164,14 @@ struct JetFinderTask {
163164
registry.add("hJetEWS", "sparse for data or mcd event-wise subtracted jets", {HistType::kTHnD, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}});
164165
registry.add("hJetMCP", "sparse for mcp jets", {HistType::kTHnD, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}});
165166
}
166-
167-
if (trackingEfficiencyPtBinning->size() < 2) {
168-
LOGP(fatal, "jetFinder workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
169-
}
170-
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
171-
LOGP(fatal, "jetFinder workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
167+
168+
if (applyTrackingEfficiency) {
169+
if (trackingEfficiencyPtBinning->size() < 2) {
170+
LOGP(fatal, "jetFinder workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
171+
}
172+
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
173+
LOGP(fatal, "jetFinder workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
174+
}
172175
}
173176
}
174177

@@ -186,7 +189,7 @@ struct JetFinderTask {
186189
return;
187190
}
188191
inputParticles.clear();
189-
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracks>, soa::Filtered<aod::JetTracks>::iterator>(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning);
192+
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracks>, soa::Filtered<aod::JetTracks>::iterator>(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning);
190193
jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable, fillTHnSparse ? registry.get<THn>(HIST("hJet")) : std::shared_ptr<THn>(nullptr), fillTHnSparse);
191194
}
192195

@@ -199,7 +202,7 @@ struct JetFinderTask {
199202
return;
200203
}
201204
inputParticles.clear();
202-
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracksSub>, soa::Filtered<aod::JetTracksSub>::iterator>(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning);
205+
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracksSub>, soa::Filtered<aod::JetTracksSub>::iterator>(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning);
203206
jetfindingutilities::findJets(jetFinder, inputParticles, jetEWSPtMin, jetEWSPtMax, jetRadius, jetAreaFractionMin, collision, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, fillTHnSparse ? registry.get<THn>(HIST("hJetEWS")) : std::shared_ptr<THn>(nullptr), fillTHnSparse);
204207
}
205208

@@ -225,7 +228,7 @@ struct JetFinderTask {
225228
return;
226229
}
227230
inputParticles.clear();
228-
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracks>, soa::Filtered<aod::JetTracks>::iterator>(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning);
231+
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracks>, soa::Filtered<aod::JetTracks>::iterator>(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning);
229232
jetfindingutilities::analyseClusters(inputParticles, &clusters, hadronicCorrectionType);
230233
jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable, fillTHnSparse ? registry.get<THn>(HIST("hJet")) : std::shared_ptr<THn>(nullptr), fillTHnSparse);
231234
}

PWGJE/JetFinders/jetFinderHF.cxx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ struct JetFinderHFTask {
7171
Configurable<float> trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"};
7272
Configurable<float> trackPhiMin{"trackPhiMin", -999, "minimum track phi"};
7373
Configurable<float> trackPhiMax{"trackPhiMax", 999, "maximum track phi"};
74-
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0}, "tracking efficiency array applied to jet finding"};
75-
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 999.}, "pt binning of tracking efficiency array"};
74+
Configurable<bool> applyTrackingEfficiency{"applyTrackingEfficiency", {false}, "configurable to decide whether to apply artificial tracking efficiency (discarding tracks) in jet finding"};
75+
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 10, 999.}, "pt binning of tracking efficiency array if applyTrackingEfficiency is true"};
76+
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0, 1.0}, "tracking efficiency array applied to jet finding if applyTrackingEfficiency is true"};
7677
Configurable<std::string> trackSelections{"trackSelections", "globalTracks", "set track selections"};
7778
Configurable<std::string> particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"};
7879

@@ -168,11 +169,13 @@ struct JetFinderHFTask {
168169
registry.add("hJet", "sparse for data or mcd jets", {HistType::kTHnD, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}});
169170
registry.add("hJetMCP", "sparse for mcp jets", {HistType::kTHnD, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}});
170171

171-
if (trackingEfficiencyPtBinning->size() < 2) {
172-
LOGP(fatal, "jetFinder workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
173-
}
174-
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
175-
LOGP(fatal, "jetFinder workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
172+
if (applyTrackingEfficiency) {
173+
if (trackingEfficiencyPtBinning->size() < 2) {
174+
LOGP(fatal, "jetFinderHF workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
175+
}
176+
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
177+
LOGP(fatal, "jetFinderHF workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
178+
}
176179
}
177180
}
178181

@@ -224,9 +227,9 @@ struct JetFinderHFTask {
224227
}
225228
}
226229
if constexpr (isEvtWiseSub) {
227-
jetfindingutilities::analyseTracks<U, typename U::iterator>(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning);
230+
jetfindingutilities::analyseTracks<U, typename U::iterator>(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning);
228231
} else {
229-
jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning, &candidate);
232+
jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning, &candidate);
230233
}
231234
jetfindingutilities::findJets(jetFinder, inputParticles, minJetPt, maxJetPt, jetRadius, jetAreaFractionMin, collision, jetsTableInput, constituentsTableInput, registry.get<THn>(HIST("hJet")), fillTHnSparse, true);
232235
}

PWGJE/JetFinders/jetFinderV0.cxx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ struct JetFinderV0Task {
6666
Configurable<float> trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"};
6767
Configurable<float> trackPhiMin{"trackPhiMin", -999, "minimum track phi"};
6868
Configurable<float> trackPhiMax{"trackPhiMax", 999, "maximum track phi"};
69-
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0}, "tracking efficiency array applied to jet finding"};
70-
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 999.}, "pt binning of tracking efficiency array"};
69+
Configurable<bool> applyTrackingEfficiency{"applyTrackingEfficiency", {false}, "configurable to decide whether to apply artificial tracking efficiency (discarding tracks) in jet finding"};
70+
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 10, 999.}, "pt binning of tracking efficiency array if applyTrackingEfficiency is true"};
71+
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0, 1.0}, "tracking efficiency array applied to jet finding if applyTrackingEfficiency is true"};
7172
Configurable<std::string> trackSelections{"trackSelections", "globalTracks", "set track selections"};
7273
Configurable<std::string> particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"};
7374

@@ -159,11 +160,13 @@ struct JetFinderV0Task {
159160
registry.add("hJet", "sparse for data or mcd jets", {HistType::kTHnD, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}});
160161
registry.add("hJetMCP", "sparse for mcp jets", {HistType::kTHnD, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}});
161162

162-
if (trackingEfficiencyPtBinning->size() < 2) {
163-
LOGP(fatal, "jetFinder workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
164-
}
165-
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
166-
LOGP(fatal, "jetFinder workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
163+
if (applyTrackingEfficiency) {
164+
if (trackingEfficiencyPtBinning->size() < 2) {
165+
LOGP(fatal, "jetFinderV0 workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
166+
}
167+
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
168+
LOGP(fatal, "jetFinderV0 workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
169+
}
167170
}
168171
}
169172

@@ -193,7 +196,7 @@ struct JetFinderV0Task {
193196
}
194197
}
195198
*/
196-
jetfindingutilities::analyseTracksMultipleCandidates(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning, candidates);
199+
jetfindingutilities::analyseTracksMultipleCandidates(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning, candidates);
197200

198201
jetfindingutilities::findJets(jetFinder, inputParticles, minJetPt, maxJetPt, jetRadius, jetAreaFractionMin, collision, jetsTableInput, constituentsTableInput, registry.get<THn>(HIST("hJet")), fillTHnSparse, saveJetsWithCandidatesOnly);
199202
}

PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ struct eventWiseConstituentSubtractorTask {
6868
Configurable<float> trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"};
6969
Configurable<float> trackPhiMin{"trackPhiMin", -999, "minimum track phi"};
7070
Configurable<float> trackPhiMax{"trackPhiMax", 999, "maximum track phi"};
71-
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0}, "tracking efficiency array applied to jet finding"};
72-
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 999.}, "pt binning of tracking efficiency array"};
71+
Configurable<bool> applyTrackingEfficiency{"applyTrackingEfficiency", {false}, "configurable to decide whether to apply artificial tracking efficiency (discarding tracks) in the collision analysed by this task"};
72+
Configurable<std::vector<double>> trackingEfficiencyPtBinning{"trackingEfficiencyPtBinning", {0., 10, 999.}, "pt binning of tracking efficiency array if applyTrackingEfficiency is true"};
73+
Configurable<std::vector<double>> trackingEfficiency{"trackingEfficiency", {1.0, 1.0}, "tracking efficiency array applied if applyTrackingEfficiency is true"};
7374
Configurable<std::string> trackSelections{"trackSelections", "globalTracks", "set track selections"};
7475

7576
Configurable<std::string> particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"};
@@ -98,11 +99,13 @@ struct eventWiseConstituentSubtractorTask {
9899
eventWiseConstituentSubtractor.setConstSubAlphaRMax(alpha, rMax);
99100
eventWiseConstituentSubtractor.setMaxEtaEvent(eventEtaMax);
100101

101-
if (trackingEfficiencyPtBinning->size() < 2) {
102-
LOGP(fatal, "jetFinder workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
103-
}
104-
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
105-
LOGP(fatal, "jetFinder workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
102+
if (applyTrackingEfficiency) {
103+
if (trackingEfficiencyPtBinning->size() < 2) {
104+
LOGP(fatal, "eventWiseConstituentSubtractor workflow: trackingEfficiencyPtBinning configurable should have at least two bin edges");
105+
}
106+
if (trackingEfficiency->size() + 1 != trackingEfficiencyPtBinning->size()) {
107+
LOGP(fatal, "eventWiseConstituentSubtractor workflow: trackingEfficiency configurable should have exactly one less entry than the number of bin edges set in trackingEfficiencyPtBinning configurable");
108+
}
106109
}
107110
}
108111

@@ -115,7 +118,7 @@ struct eventWiseConstituentSubtractorTask {
115118
for (auto& candidate : candidates) {
116119
inputParticles.clear();
117120
tracksSubtracted.clear();
118-
jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning, &candidate);
121+
jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning, &candidate);
119122

120123
tracksSubtracted = eventWiseConstituentSubtractor.JetBkgSubUtils::doEventConstSub(inputParticles, candidate.rho(), candidate.rhoM());
121124
for (auto const& trackSubtracted : tracksSubtracted) {
@@ -146,7 +149,7 @@ struct eventWiseConstituentSubtractorTask {
146149
}
147150
inputParticles.clear();
148151
tracksSubtracted.clear();
149-
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracks>, soa::Filtered<aod::JetTracks>::iterator>(inputParticles, tracks, trackSelection, trackingEfficiency, trackingEfficiencyPtBinning);
152+
jetfindingutilities::analyseTracks<soa::Filtered<aod::JetTracks>, soa::Filtered<aod::JetTracks>::iterator>(inputParticles, tracks, trackSelection, applyTrackingEfficiency, trackingEfficiency, trackingEfficiencyPtBinning);
150153

151154
tracksSubtracted = eventWiseConstituentSubtractor.JetBkgSubUtils::doEventConstSub(inputParticles, collision.rho(), collision.rhoM());
152155

0 commit comments

Comments
 (0)