From 5eb6cf9b4b19d58322264c333e56521e3703ca2e Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Aug 2026 19:33:08 -0400 Subject: [PATCH 1/6] add occupancy table --- .../detector/calib/utils/OccupancyTable.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java new file mode 100644 index 0000000000..5eb0cbdc8e --- /dev/null +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -0,0 +1,47 @@ +package org.jlab.detector.calib.utils; + +import java.util.Map; +import org.jlab.io.base.DataBank; +import org.jlab.io.base.DataEvent; +import org.jlab.utils.groups.IndexedTable; + +/** + * + * @author baltzell + */ +public class OccupancyTable { + + String bankName; + private IndexedTable table; + + public OccupancyTable(String bank, int indexCount) { + bankName = bank; + table = new IndexedTable(indexCount, new String[]{"nhits/I"}); + } + + public void add(int nhits, int... index) { + if (!table.hasEntry(index)) { + table.addEntry(index); + } + table.setIntValue(nhits, "nhits", index); + } + + public void update(DataEvent e) { + DataBank b = e.getBank(bankName); + if (b != null) e.removeBank(bankName); + b = e.createBank(bankName, table.getRowCount()); + Map m = table.getList().getMap(); + int i = 0; + for (Map.Entry entry : m.entrySet()) { + long hash = entry.getKey(); + int sector = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0); + int layer = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1); + int component = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2); + b.setInt("sector", i, sector); + b.setInt("sector", i, layer); + b.setInt("sector", i, component); + b.setInt("nhits", i++, entry.getValue()); + } + e.appendBank(b); + } +} From 28202d29e5a3921725cc6f69936816596ffd6aeb Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Aug 2026 21:23:51 -0400 Subject: [PATCH 2/6] complete OccupancyTable class --- .../detector/calib/utils/OccupancyTable.java | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 5eb0cbdc8e..94eda12ea4 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -11,37 +11,64 @@ */ public class OccupancyTable { - String bankName; + public static final String[] INDEX_NAMES = {"sector","layer","component","order"}; + + private final int indexCount; + private IndexedTable table; - public OccupancyTable(String bank, int indexCount) { - bankName = bank; - table = new IndexedTable(indexCount, new String[]{"nhits/I"}); + public OccupancyTable(int indexCount) { + if (indexCount != 3 && indexCount != 4) throw new RuntimeException(); + this.indexCount = indexCount; + table = new IndexedTable(indexCount, new String[]{"nhits/D"}); } - public void add(int nhits, int... index) { + public void reset() { + table = new IndexedTable(indexCount, new String[]{"nhits/D"}); + } + + public void add(double weight, int... index) { if (!table.hasEntry(index)) { table.addEntry(index); + table.setDoubleValue(0.0, "nhits", index); } - table.setIntValue(nhits, "nhits", index); + table.setDoubleValue(table.getDoubleValue("nhits",index) + weight, "nhits", index); } - public void update(DataEvent e) { - DataBank b = e.getBank(bankName); - if (b != null) e.removeBank(bankName); - b = e.createBank(bankName, table.getRowCount()); - Map m = table.getList().getMap(); + public void add(int... index) { + add(1, index); + } + + public void add(DataBank b) { + final int rows = b.rows(); + for (int i=0; i m = table.getList().getMap(); for (Map.Entry entry : m.entrySet()) { - long hash = entry.getKey(); - int sector = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 0); - int layer = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 1); - int component = IndexedTable.DEFAULT_GENERATOR.getIndex(hash, 2); - b.setInt("sector", i, sector); - b.setInt("sector", i, layer); - b.setInt("sector", i, component); - b.setInt("nhits", i++, entry.getValue()); + b.setInt("sector", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 0)); + b.setInt("layer", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 1)); + b.setInt("component", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 2)); + if (indexCount == 4) + b.setInt("order", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 3)); + b.setInt("nhits", i, entry.getValue()); + i++; } + } + + public void update(DataEvent e, String bankName) { + DataBank b = e.getBank(bankName); + if (b != null) e.removeBank(bankName); + b = e.createBank(bankName, table.getRowCount()); + update(b); e.appendBank(b); } -} + +} \ No newline at end of file From 11515eeaff30268a9b73474f7ca74a09eb8aa831 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Mon, 10 Aug 2026 21:38:54 -0400 Subject: [PATCH 3/6] cleanup --- .../java/org/jlab/detector/calib/utils/OccupancyTable.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 94eda12ea4..ce3f95128c 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -20,7 +20,7 @@ public class OccupancyTable { public OccupancyTable(int indexCount) { if (indexCount != 3 && indexCount != 4) throw new RuntimeException(); this.indexCount = indexCount; - table = new IndexedTable(indexCount, new String[]{"nhits/D"}); + reset(); } public void reset() { @@ -49,7 +49,7 @@ else if (indexCount == 4) } } - private void update(DataBank b) { + public void update(DataBank b) { int i = 0; Map m = table.getList().getMap(); for (Map.Entry entry : m.entrySet()) { @@ -71,4 +71,4 @@ public void update(DataEvent e, String bankName) { e.appendBank(b); } -} \ No newline at end of file +} From a41da4dab4f7c22a5e5ed6b6b4728740862f9616 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 11 Aug 2026 10:03:27 -0400 Subject: [PATCH 4/6] cleanup --- .../detector/calib/utils/OccupancyTable.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index ce3f95128c..6548833645 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -11,20 +11,18 @@ */ public class OccupancyTable { - public static final String[] INDEX_NAMES = {"sector","layer","component","order"}; - - private final int indexCount; - + private String[] indexNames; private IndexedTable table; - public OccupancyTable(int indexCount) { - if (indexCount != 3 && indexCount != 4) throw new RuntimeException(); - this.indexCount = indexCount; - reset(); + public OccupancyTable(String... index) { + if (index.length != 3 && index.length != 4) + throw new IllegalArgumentException("Invalid index length: "+index.length); + indexNames = index; + table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); } public void reset() { - table = new IndexedTable(indexCount, new String[]{"nhits/D"}); + table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); } public void add(double weight, int... index) { @@ -42,10 +40,8 @@ public void add(int... index) { public void add(DataBank b) { final int rows = b.rows(); for (int i=0; i Date: Tue, 11 Aug 2026 11:12:45 -0400 Subject: [PATCH 5/6] add missing method --- .../src/main/java/org/jlab/utils/groups/IndexedTable.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java index 28dcdf629d..a82bd23715 100644 --- a/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java +++ b/common-tools/clas-utils/src/main/java/org/jlab/utils/groups/IndexedTable.java @@ -167,6 +167,10 @@ public void setIntValueByHash(Integer value, int column, long hash) { this.entries.getItemByHash(hash).setValue(column, value); } + public void setDoubleValueByHash(Double value, int column, long hash) { + this.entries.getItemByHash(hash).setValue(column, value); + } + public int getIntValueByHash(int index, long hash) { return entries.getItemByHash(hash).getValue(index).intValue(); } From 72177f22761e9446ec0065231fd19e9ed6e0d7e1 Mon Sep 17 00:00:00 2001 From: Nathan Baltzell Date: Tue, 11 Aug 2026 13:48:59 -0400 Subject: [PATCH 6/6] add bank --- .../detector/calib/utils/OccupancyTable.java | 73 +++++++++++++------ etc/bankdefs/hipo4/occupancy.json | 14 ++++ 2 files changed, 63 insertions(+), 24 deletions(-) create mode 100644 etc/bankdefs/hipo4/occupancy.json diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java index 6548833645..aca5de13c2 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/calib/utils/OccupancyTable.java @@ -2,68 +2,93 @@ import java.util.Map; import org.jlab.io.base.DataBank; -import org.jlab.io.base.DataEvent; import org.jlab.utils.groups.IndexedTable; /** - * + * Utility class for storing occupancy/multiplicity in an IndexedTable and + * writing it to an occupancy bank with format (index... weight [*]) + * * @author baltzell */ public class OccupancyTable { private String[] indexNames; private IndexedTable table; - + public OccupancyTable(String... index) { if (index.length != 3 && index.length != 4) throw new IllegalArgumentException("Invalid index length: "+index.length); indexNames = index; - table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); + table = new IndexedTable(indexNames.length, new String[]{"occ/D"}); } + /** + * Reset the occupancy table. + */ public void reset() { - table = new IndexedTable(indexNames.length, new String[]{"nhits/D"}); + table = new IndexedTable(indexNames.length, new String[]{"occ/D"}); } + /** + * Fill occupancy, user-defined weight. + * @param weight + * @param index + */ public void add(double weight, int... index) { + final long hash = IndexedTable.DEFAULT_GENERATOR.hashCode(index); if (!table.hasEntry(index)) { table.addEntry(index); - table.setDoubleValue(0.0, "nhits", index); + table.setDoubleValueByHash(0.0, indexNames.length, hash); } - table.setDoubleValue(table.getDoubleValue("nhits",index) + weight, "nhits", index); + table.setDoubleValueByHash(weight + table.getDoubleValueByHash(indexNames.length, hash), indexNames.length, hash); } + /** + * Fill occupancy, unity weight. + * @param index + */ public void add(int... index) { add(1, index); } + /** + * Fill occupancy from hits bank, one per bank row. + * Note, bank index data types are hard-coded here! + * @param b hit bank + */ public void add(DataBank b) { final int rows = b.rows(); for (int i=0; i m = table.getList().getMap(); for (Map.Entry entry : m.entrySet()) { - b.setInt("sector", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 0)); - b.setInt("layer", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 1)); - b.setInt("component", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 2)); - if (indexNames.length == 4) b.setInt("order", i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 3)); - b.setInt("nhits", i, entry.getValue()); + b.setInt(0, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 0)); + b.setInt(1, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 1)); + b.setInt(2, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 2)); + if (indexNames.length == 4) + b.setInt(3, i, IndexedTable.DEFAULT_GENERATOR.getIndex(entry.getKey(), 3)); + b.setInt(indexNames.length, i, entry.getValue()); i++; } } - - public void update(DataEvent e, String bankName) { - DataBank b = e.getBank(bankName); - if (b != null) e.removeBank(bankName); - b = e.createBank(bankName, table.getRowCount()); - update(b); - e.appendBank(b); - } - -} +} \ No newline at end of file diff --git a/etc/bankdefs/hipo4/occupancy.json b/etc/bankdefs/hipo4/occupancy.json new file mode 100644 index 0000000000..82722ec54f --- /dev/null +++ b/etc/bankdefs/hipo4/occupancy.json @@ -0,0 +1,14 @@ +[ + { + "name": "DC::occ", + "group": 20600, + "item": 20, + "info": "Event Header Bank", + "entries": [ + { "name":"sector" , "type":"B", "info":"sector"}, + { "name":"layer" , "type":"B", "info":"layer"}, + { "name":"component" , "type":"S", "info":"component"}, + { "name":"hits" , "type":"S", "info":"number of hits"} + ] + } +]