From 311e2752b18d2a9306e31fc87da2cc991660e32e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 25 Feb 2026 20:34:44 -0500 Subject: [PATCH 1/5] add optional efficiency check --- .../org/jlab/analysis/efficiency/Truth.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java index 51a9cf559b..afe85ec47d 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java @@ -188,10 +188,31 @@ public String toMarkdown() { return s.toString(); } + private static TreeMap parseEfficiencyString(String arg) { + TreeMap m = new TreeMap<>(); + if (arg.contains(",")) { + for (String s : arg.split(",")) + m.putAll(parseEfficiencyString(s)); + } + else if (arg.contains(":")) { + String[] x = arg.split(":"); + try { + if (x.length == 2) m.put(Integer.valueOf(x[0]), Float.valueOf(x[1])); + else throw new RuntimeException("Invalid pid specification: "+arg); + } + catch (NumberFormatException e) { + throw new RuntimeException("Invalid pid specification: "+arg); + } + } + return m; + } + public static void main(String[] args) { OptionParser o = new OptionParser("trutheff"); + o.addOption("-e", "", "efficiency requirement (e.g. 321:0.9,11:0.95"); o.setRequiresInputList(true); o.parse(args); + TreeMap pids = parseEfficiencyString(o.getOption("-e").stringValue()); HipoReader r = new HipoReader(); r.open(o.getInputList().get(0)); Truth t = new Truth(r.getSchemaFactory()); @@ -199,6 +220,16 @@ public static void main(String[] args) { System.out.println(t.toTable()); System.out.println(t.toJson()); System.out.println(t.toMarkdown()); + boolean good = true; + for (int pid : pids.keySet()) { + if (t.get(pid, pid) < pids.get(pid)) { + System.err.println(String.format( + ">>> trutheff:error: pid %d efficiency is %f, below %f limit", + pid, t.get(pid,pid), pids.get(pid))); + good = false; + } + } + if (!good) System.exit(7); } } \ No newline at end of file From e5c92d689e1a6e5a20a8d65e1c9deff49a8052e1 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Wed, 25 Feb 2026 20:40:47 -0500 Subject: [PATCH 2/5] cleanup doc --- .../src/main/java/org/jlab/analysis/efficiency/Truth.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java index afe85ec47d..3f61fee091 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java @@ -15,8 +15,7 @@ /** * Efficiency matrix calculator based solely on the MC::GenMatch truth-matching - * bank (which is purely hit-based), and a pid assignment match in MC::Particle - * and REC::Particle. + * bank, and a pid assignment match in MC::Particle and REC::Particle. * * @author baltzell */ From a633475bafdd468378e17c40de88ee5964993d4f Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 26 Feb 2026 14:50:12 -0500 Subject: [PATCH 3/5] change printout order --- .../src/main/java/org/jlab/analysis/efficiency/Truth.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java index 3f61fee091..64540361f3 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java @@ -216,9 +216,9 @@ public static void main(String[] args) { r.open(o.getInputList().get(0)); Truth t = new Truth(r.getSchemaFactory()); t.add(o.getInputList()); - System.out.println(t.toTable()); - System.out.println(t.toJson()); System.out.println(t.toMarkdown()); + System.out.println(t.toJson()); + System.out.println(t.toTable()); boolean good = true; for (int pid : pids.keySet()) { if (t.get(pid, pid) < pids.get(pid)) { From 2a4ec9821761974a727c3b4a39200744a34d8130 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 26 Feb 2026 15:12:42 -0500 Subject: [PATCH 4/5] make it callable --- .../org/jlab/analysis/efficiency/Truth.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java index 64540361f3..3db6caa114 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.TreeMap; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -187,7 +188,7 @@ public String toMarkdown() { return s.toString(); } - private static TreeMap parseEfficiencyString(String arg) { + private static Map parseEfficiencyString(String arg) { TreeMap m = new TreeMap<>(); if (arg.contains(",")) { for (String s : arg.split(",")) @@ -205,13 +206,26 @@ else if (arg.contains(":")) { } return m; } + + public boolean checkEfficiencies(Map pids) { + boolean good = true; + for (int pid : pids.keySet()) { + if (get(pid, pid) < pids.get(pid)) { + System.err.println(String.format( + ">>> trutheff: pid %d efficiency is %f, below %f limit", + pid, get(pid,pid), pids.get(pid))); + good = false; + } + } + return good; + } public static void main(String[] args) { OptionParser o = new OptionParser("trutheff"); o.addOption("-e", "", "efficiency requirement (e.g. 321:0.9,11:0.95"); o.setRequiresInputList(true); o.parse(args); - TreeMap pids = parseEfficiencyString(o.getOption("-e").stringValue()); + Map pids = parseEfficiencyString(o.getOption("-e").stringValue()); HipoReader r = new HipoReader(); r.open(o.getInputList().get(0)); Truth t = new Truth(r.getSchemaFactory()); @@ -219,16 +233,7 @@ public static void main(String[] args) { System.out.println(t.toMarkdown()); System.out.println(t.toJson()); System.out.println(t.toTable()); - boolean good = true; - for (int pid : pids.keySet()) { - if (t.get(pid, pid) < pids.get(pid)) { - System.err.println(String.format( - ">>> trutheff:error: pid %d efficiency is %f, below %f limit", - pid, t.get(pid,pid), pids.get(pid))); - good = false; - } - } - if (!good) System.exit(7); + if (!t.checkEfficiencies(pids)) System.exit(7); } } \ No newline at end of file From 550651af932e4a8534b6c4baedc680f82a93ddd2 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Thu, 26 Feb 2026 15:17:37 -0500 Subject: [PATCH 5/5] make it more callable --- .../java/org/jlab/analysis/efficiency/Truth.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java index 3db6caa114..f585d38ccb 100644 --- a/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java +++ b/common-tools/clas-analysis/src/main/java/org/jlab/analysis/efficiency/Truth.java @@ -207,7 +207,7 @@ else if (arg.contains(":")) { return m; } - public boolean checkEfficiencies(Map pids) { + private boolean checkEfficiencies(Map pids) { boolean good = true; for (int pid : pids.keySet()) { if (get(pid, pid) < pids.get(pid)) { @@ -218,8 +218,18 @@ public boolean checkEfficiencies(Map pids) { } } return good; - } - + } + + /** + * Efficiency cut values specificed as pid1:eff1[pid2:eff2[...]] + * For example, 2212:0.9,11:0.95 is 90% for proton and 95% for electron. + * @param arg + * @return whether all efficiency cuts pass + */ + public boolean checkEfficiencies(String arg) { + return checkEfficiencies(parseEfficiencyString(arg)); + } + public static void main(String[] args) { OptionParser o = new OptionParser("trutheff"); o.addOption("-e", "", "efficiency requirement (e.g. 321:0.9,11:0.95");